blob: 4c8c5176e526b69a0c94cb05dad3d4696ac5c625 [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001
2/* Python interpreter top-level routines, including init/exit */
3
Guido van Rossum82598051997-03-05 00:20:32 +00004#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +00005
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006#include "Python-ast.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +00007#include "grammar.h"
8#include "node.h"
Fred Drake85f36392000-07-11 17:53:00 +00009#include "token.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000010#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011#include "errcode.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000012#include "code.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000013#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000014#include "symtable.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000015#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000016#include "ast.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000017#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000018#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000019
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000020#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000021
Martin v. Löwis73d538b2003-03-05 15:13:47 +000022#ifdef HAVE_LANGINFO_H
23#include <locale.h>
24#include <langinfo.h>
25#endif
26
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000027#ifdef MS_WINDOWS
Guido van Rossuma44823b1995-03-14 15:01:17 +000028#undef BYTE
29#include "windows.h"
30#endif
31
Neal Norwitz4281cef2006-03-04 19:58:13 +000032#ifndef Py_REF_DEBUG
Tim Peters62e97f02006-03-28 21:44:32 +000033#define PRINT_TOTAL_REFS()
Neal Norwitz4281cef2006-03-04 19:58:13 +000034#else /* Py_REF_DEBUG */
Tim Peters62e97f02006-03-28 21:44:32 +000035#define PRINT_TOTAL_REFS() fprintf(stderr, \
36 "[%" PY_FORMAT_SIZE_T "d refs]\n", \
37 _Py_RefTotal)
Neal Norwitz4281cef2006-03-04 19:58:13 +000038#endif
39
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000040extern char *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000041
Guido van Rossum82598051997-03-05 00:20:32 +000042extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000043
Guido van Rossumb73cc041993-11-01 16:28:59 +000044/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000045static void initmain(void);
46static void initsite(void);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000047static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
Neal Norwitzadb69fc2005-12-17 20:54:49 +000048 PyCompilerFlags *, PyArena *);
Martin v. Löwis95292d62002-12-11 14:04:59 +000049static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
Jeremy Hyltonbc320242001-03-22 02:47:58 +000050 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000051static void err_input(perrdetail *);
52static void initsigs(void);
53static void call_sys_exitfunc(void);
54static void call_ll_exitfuncs(void);
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000055extern void _PyUnicode_Init(void);
56extern void _PyUnicode_Fini(void);
Guido van Rossumc94044c2000-03-10 23:03:54 +000057
Mark Hammond8d98d2c2003-04-19 15:41:53 +000058#ifdef WITH_THREAD
59extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
60extern void _PyGILState_Fini(void);
61#endif /* WITH_THREAD */
62
Guido van Rossum82598051997-03-05 00:20:32 +000063int Py_DebugFlag; /* Needed by parser.c */
64int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000065int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000066int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw3ce09642000-05-02 19:18:59 +000067int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000068int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossumb16d1972000-05-01 17:55:15 +000069int Py_UnicodeFlag = 0; /* Needed by compile.c */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +000070int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
Tim Peters3caca232001-12-06 06:23:26 +000071/* _XXX Py_QnewFlag should go away in 2.3. It's true iff -Qnew is passed,
72 on the command line, and is used in 2.2 by ceval.c to make all "/" divisions
73 true divisions (which they will be in 2.3). */
74int _Py_QnewFlag = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000075
Mark Hammonda43fd0c2003-02-19 00:33:33 +000076/* Reference to 'warnings' module, to avoid importing it
Mark Hammondedd07732003-07-15 23:03:55 +000077 on the fly when the import lock may be held. See 683658/771097
Mark Hammonda43fd0c2003-02-19 00:33:33 +000078*/
Mark Hammondedd07732003-07-15 23:03:55 +000079static PyObject *warnings_module = NULL;
80
81/* Returns a borrowed reference to the 'warnings' module, or NULL.
82 If the module is returned, it is guaranteed to have been obtained
83 without acquiring the import lock
84*/
Martin v. Löwisa2c17c52003-08-09 09:47:11 +000085PyObject *PyModule_GetWarningsModule(void)
Mark Hammondedd07732003-07-15 23:03:55 +000086{
87 PyObject *typ, *val, *tb;
88 PyObject *all_modules;
89 /* If we managed to get the module at init time, just use it */
90 if (warnings_module)
91 return warnings_module;
92 /* If it wasn't available at init time, it may be available
93 now in sys.modules (common scenario is frozen apps: import
94 at init time fails, but the frozen init code sets up sys.path
95 correctly, then does an implicit import of warnings for us
96 */
97 /* Save and restore any exceptions */
98 PyErr_Fetch(&typ, &val, &tb);
99
Mark Hammond5f4e8ca2003-07-16 01:54:38 +0000100 all_modules = PySys_GetObject("modules");
Mark Hammondedd07732003-07-15 23:03:55 +0000101 if (all_modules) {
102 warnings_module = PyDict_GetItemString(all_modules, "warnings");
103 /* We keep a ref in the global */
104 Py_XINCREF(warnings_module);
105 }
106 PyErr_Restore(typ, val, tb);
107 return warnings_module;
108}
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000109
Guido van Rossum25ce5661997-08-02 03:10:38 +0000110static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111
Thomas Wouters7e474022000-07-16 12:04:32 +0000112/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000113
114int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000115Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000116{
117 return initialized;
118}
119
Guido van Rossum25ce5661997-08-02 03:10:38 +0000120/* Global initializations. Can be undone by Py_Finalize(). Don't
121 call this twice without an intervening Py_Finalize() call. When
122 initializations fail, a fatal error is issued and the function does
123 not return. On return, the first thread and interpreter state have
124 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000125
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126 Locking: you must hold the interpreter lock while calling this.
127 (If the lock has not yet been initialized, that's equivalent to
128 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000129
Guido van Rossum25ce5661997-08-02 03:10:38 +0000130*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000131
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000132static int
133add_flag(int flag, const char *envs)
134{
135 int env = atoi(envs);
136 if (flag < env)
137 flag = env;
138 if (flag < 1)
139 flag = 1;
140 return flag;
141}
142
Guido van Rossuma027efa1997-05-05 20:56:21 +0000143void
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000144Py_InitializeEx(int install_sigs)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000145{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000146 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000147 PyThreadState *tstate;
148 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000149 char *p;
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000150#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
151 char *codeset;
152 char *saved_locale;
153 PyObject *sys_stream, *sys_isatty;
154#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +0000155 extern void _Py_ReadyTypes(void);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000156
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000157 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000158 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000159 initialized = 1;
Tim Petersd08e3822003-04-17 15:24:21 +0000160
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000161 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000162 Py_DebugFlag = add_flag(Py_DebugFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000163 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000164 Py_VerboseFlag = add_flag(Py_VerboseFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000165 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000166 Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000167
Guido van Rossuma027efa1997-05-05 20:56:21 +0000168 interp = PyInterpreterState_New();
169 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000170 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000171
Guido van Rossuma027efa1997-05-05 20:56:21 +0000172 tstate = PyThreadState_New(interp);
173 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000174 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000175 (void) PyThreadState_Swap(tstate);
176
Guido van Rossum70d893a2001-08-16 08:21:42 +0000177 _Py_ReadyTypes();
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000178
Neal Norwitzb2501f42002-12-31 03:42:13 +0000179 if (!_PyFrame_Init())
Neal Norwitzc91ed402002-12-30 22:29:22 +0000180 Py_FatalError("Py_Initialize: can't init frames");
181
Neal Norwitzb2501f42002-12-31 03:42:13 +0000182 if (!_PyInt_Init())
Neal Norwitzc91ed402002-12-30 22:29:22 +0000183 Py_FatalError("Py_Initialize: can't init ints");
184
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000185 _PyFloat_Init();
186
Guido van Rossum25ce5661997-08-02 03:10:38 +0000187 interp->modules = PyDict_New();
188 if (interp->modules == NULL)
189 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000190
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000191#ifdef Py_USING_UNICODE
Guido van Rossumc94044c2000-03-10 23:03:54 +0000192 /* Init Unicode implementation; relies on the codec registry */
193 _PyUnicode_Init();
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000194#endif
Guido van Rossumc94044c2000-03-10 23:03:54 +0000195
Barry Warsawf242aa02000-05-25 23:09:49 +0000196 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000197 if (bimod == NULL)
198 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000199 interp->builtins = PyModule_GetDict(bimod);
200 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000201
202 sysmod = _PySys_Init();
203 if (sysmod == NULL)
204 Py_FatalError("Py_Initialize: can't initialize sys");
205 interp->sysdict = PyModule_GetDict(sysmod);
206 Py_INCREF(interp->sysdict);
207 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000208 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000209 PyDict_SetItemString(interp->sysdict, "modules",
210 interp->modules);
211
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000212 _PyImport_Init();
213
Barry Warsawf242aa02000-05-25 23:09:49 +0000214 /* initialize builtin exceptions */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000215 _PyExc_Init();
Barry Warsaw5821bc52001-08-13 23:04:56 +0000216 _PyImport_FixupExtension("exceptions", "exceptions");
Barry Warsawf242aa02000-05-25 23:09:49 +0000217
Barry Warsaw035574d1997-08-29 22:07:17 +0000218 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000219 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000220
Just van Rossum52e14d62002-12-30 22:08:05 +0000221 _PyImportHooks_Init();
222
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000223 if (install_sigs)
224 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000225
226 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000227 if (!Py_NoSiteFlag)
228 initsite(); /* Module site */
Just van Rossum5bfba3a2003-02-25 20:25:12 +0000229
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000230 /* auto-thread-state API, if available */
231#ifdef WITH_THREAD
232 _PyGILState_Init(interp, tstate);
233#endif /* WITH_THREAD */
234
Mark Hammondedd07732003-07-15 23:03:55 +0000235 warnings_module = PyImport_ImportModule("warnings");
236 if (!warnings_module)
237 PyErr_Clear();
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000238
239#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
240 /* On Unix, set the file system encoding according to the
241 user's preference, if the CODESET names a well-known
242 Python codec, and Py_FileSystemDefaultEncoding isn't
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000243 initialized by other means. Also set the encoding of
244 stdin and stdout if these are terminals. */
245
Martin v. Löwisf56d0152003-11-13 07:43:21 +0000246 saved_locale = strdup(setlocale(LC_CTYPE, NULL));
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000247 setlocale(LC_CTYPE, "");
248 codeset = nl_langinfo(CODESET);
249 if (codeset && *codeset) {
250 PyObject *enc = PyCodec_Encoder(codeset);
251 if (enc) {
252 codeset = strdup(codeset);
253 Py_DECREF(enc);
254 } else {
255 codeset = NULL;
256 PyErr_Clear();
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000257 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000258 } else
259 codeset = NULL;
260 setlocale(LC_CTYPE, saved_locale);
Martin v. Löwisf56d0152003-11-13 07:43:21 +0000261 free(saved_locale);
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000262
263 if (codeset) {
Michael W. Hudson68debc92003-08-11 12:20:24 +0000264 sys_stream = PySys_GetObject("stdin");
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000265 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
266 if (!sys_isatty)
267 PyErr_Clear();
268 if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
269 if (!PyFile_SetEncoding(sys_stream, codeset))
270 Py_FatalError("Cannot set codeset of stdin");
271 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000272 Py_XDECREF(sys_isatty);
273
274 sys_stream = PySys_GetObject("stdout");
275 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
276 if (!sys_isatty)
277 PyErr_Clear();
278 if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
279 if (!PyFile_SetEncoding(sys_stream, codeset))
280 Py_FatalError("Cannot set codeset of stdout");
281 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000282 Py_XDECREF(sys_isatty);
283
284 if (!Py_FileSystemDefaultEncoding)
285 Py_FileSystemDefaultEncoding = codeset;
286 else
287 free(codeset);
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000288 }
289#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000290}
291
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000292void
293Py_Initialize(void)
294{
295 Py_InitializeEx(1);
296}
297
298
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000299#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000300extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000301#endif
302
Guido van Rossum25ce5661997-08-02 03:10:38 +0000303/* Undo the effect of Py_Initialize().
304
305 Beware: if multiple interpreter and/or thread states exist, these
306 are not wiped out; only the current thread and interpreter state
307 are deleted. But since everything else is deleted, those other
308 interpreter and thread states should no longer be used.
309
310 (XXX We should do better, e.g. wipe out all interpreters and
311 threads.)
312
313 Locking: as above.
314
315*/
316
317void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000318Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000319{
320 PyInterpreterState *interp;
321 PyThreadState *tstate;
322
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000323 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000324 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000325
Tim Peters384fd102001-01-21 03:40:37 +0000326 /* The interpreter is still entirely intact at this point, and the
327 * exit funcs may be relying on that. In particular, if some thread
328 * or exit func is still waiting to do an import, the import machinery
329 * expects Py_IsInitialized() to return true. So don't say the
330 * interpreter is uninitialized until after the exit funcs have run.
331 * Note that Threading.py uses an exit func to do a join on all the
332 * threads created thru it, so this also protects pending imports in
333 * the threads created via Threading.
334 */
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000335 call_sys_exitfunc();
Tim Peters384fd102001-01-21 03:40:37 +0000336 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000337
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000338 /* Get current thread state and interpreter pointer */
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000339 tstate = PyThreadState_GET();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000340 interp = tstate->interp;
341
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000342 /* Disable signal handling */
343 PyOS_FiniInterrupts();
344
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000345 /* drop module references we saved */
Mark Hammondedd07732003-07-15 23:03:55 +0000346 Py_XDECREF(warnings_module);
347 warnings_module = NULL;
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000348
Guido van Rossume13ddc92003-04-17 17:29:22 +0000349 /* Collect garbage. This may call finalizers; it's nice to call these
Tim Peters1d7323e2003-12-01 21:35:27 +0000350 * before all modules are destroyed.
351 * XXX If a __del__ or weakref callback is triggered here, and tries to
352 * XXX import a module, bad things can happen, because Python no
353 * XXX longer believes it's initialized.
354 * XXX Fatal Python error: Interpreter not initialized (version mismatch?)
355 * XXX is easy to provoke that way. I've also seen, e.g.,
356 * XXX Exception exceptions.ImportError: 'No module named sha'
357 * XXX in <function callback at 0x008F5718> ignored
358 * XXX but I'm unclear on exactly how that one happens. In any case,
359 * XXX I haven't seen a real-life report of either of these.
Neal Norwitz9589ee22006-03-04 19:01:22 +0000360 */
Guido van Rossume13ddc92003-04-17 17:29:22 +0000361 PyGC_Collect();
362
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000363 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000364 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000365
Guido van Rossume13ddc92003-04-17 17:29:22 +0000366 /* Collect final garbage. This disposes of cycles created by
Tim Peters1d7323e2003-12-01 21:35:27 +0000367 * new-style class definitions, for example.
368 * XXX This is disabled because it caused too many problems. If
369 * XXX a __del__ or weakref callback triggers here, Python code has
370 * XXX a hard time running, because even the sys module has been
371 * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
372 * XXX One symptom is a sequence of information-free messages
373 * XXX coming from threads (if a __del__ or callback is invoked,
374 * XXX other threads can execute too, and any exception they encounter
375 * XXX triggers a comedy of errors as subsystem after subsystem
376 * XXX fails to find what it *expects* to find in sys to help report
377 * XXX the exception and consequent unexpected failures). I've also
378 * XXX seen segfaults then, after adding print statements to the
379 * XXX Python code getting called.
380 */
381#if 0
Guido van Rossume13ddc92003-04-17 17:29:22 +0000382 PyGC_Collect();
Tim Peters1d7323e2003-12-01 21:35:27 +0000383#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000384
Guido van Rossum1707aad1997-12-08 23:43:45 +0000385 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
386 _PyImport_Fini();
387
388 /* Debugging stuff */
389#ifdef COUNT_ALLOCS
390 dump_counts();
391#endif
392
Tim Peters62e97f02006-03-28 21:44:32 +0000393 PRINT_TOTAL_REFS();
Guido van Rossum1707aad1997-12-08 23:43:45 +0000394
Tim Peters9cf25ce2003-04-17 15:21:01 +0000395#ifdef Py_TRACE_REFS
396 /* Display all objects still alive -- this can invoke arbitrary
397 * __repr__ overrides, so requires a mostly-intact interpreter.
398 * Alas, a lot of stuff may still be alive now that will be cleaned
399 * up later.
400 */
Tim Peters269b2a62003-04-17 19:52:29 +0000401 if (Py_GETENV("PYTHONDUMPREFS"))
Tim Peters9cf25ce2003-04-17 15:21:01 +0000402 _Py_PrintReferences(stderr);
Tim Peters9cf25ce2003-04-17 15:21:01 +0000403#endif /* Py_TRACE_REFS */
404
Mark Hammond6cb90292003-04-22 11:18:00 +0000405 /* Cleanup auto-thread-state */
406#ifdef WITH_THREAD
407 _PyGILState_Fini();
408#endif /* WITH_THREAD */
409
Guido van Rossumd922fa42003-04-15 14:10:09 +0000410 /* Clear interpreter state */
Barry Warsawf242aa02000-05-25 23:09:49 +0000411 PyInterpreterState_Clear(interp);
Guido van Rossumd922fa42003-04-15 14:10:09 +0000412
Anthony Baxter12b6f6c2005-03-29 13:36:16 +0000413 /* Now we decref the exception classes. After this point nothing
414 can raise an exception. That's okay, because each Fini() method
415 below has been checked to make sure no exceptions are ever
416 raised.
417 */
418
419 _PyExc_Fini();
420
Guido van Rossumd922fa42003-04-15 14:10:09 +0000421 /* Delete current thread */
Barry Warsawf242aa02000-05-25 23:09:49 +0000422 PyThreadState_Swap(NULL);
423 PyInterpreterState_Delete(interp);
424
Guido van Rossumd922fa42003-04-15 14:10:09 +0000425 /* Sundry finalizers */
Guido van Rossumcc283f51997-08-05 02:22:03 +0000426 PyMethod_Fini();
427 PyFrame_Fini();
428 PyCFunction_Fini();
429 PyTuple_Fini();
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000430 PyList_Fini();
Raymond Hettingerd7946662005-08-01 21:39:29 +0000431 PySet_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000432 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000433 PyInt_Fini();
434 PyFloat_Fini();
435
Marc-André Lemburg95de5c12002-04-08 08:19:36 +0000436#ifdef Py_USING_UNICODE
437 /* Cleanup Unicode implementation */
438 _PyUnicode_Fini();
439#endif
440
Guido van Rossumcc283f51997-08-05 02:22:03 +0000441 /* XXX Still allocated:
442 - various static ad-hoc pointers to interned strings
443 - int and float free list blocks
444 - whatever various modules and libraries allocate
445 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000446
447 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000448
Tim Peters269b2a62003-04-17 19:52:29 +0000449#ifdef Py_TRACE_REFS
450 /* Display addresses (& refcnts) of all objects still alive.
451 * An address can be used to find the repr of the object, printed
452 * above by _Py_PrintReferences.
453 */
454 if (Py_GETENV("PYTHONDUMPREFS"))
455 _Py_PrintReferenceAddresses(stderr);
456#endif /* Py_TRACE_REFS */
Tim Peters0e871182002-04-13 08:29:14 +0000457#ifdef PYMALLOC_DEBUG
458 if (Py_GETENV("PYTHONMALLOCSTATS"))
459 _PyObject_DebugMallocStats();
460#endif
461
Guido van Rossumcc283f51997-08-05 02:22:03 +0000462 call_ll_exitfuncs();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000463}
464
465/* Create and initialize a new interpreter and thread, and return the
466 new thread. This requires that Py_Initialize() has been called
467 first.
468
469 Unsuccessful initialization yields a NULL pointer. Note that *no*
470 exception information is available even in this case -- the
471 exception information is held in the thread, and there is no
472 thread.
473
474 Locking: as above.
475
476*/
477
478PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000479Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000480{
481 PyInterpreterState *interp;
482 PyThreadState *tstate, *save_tstate;
483 PyObject *bimod, *sysmod;
484
485 if (!initialized)
486 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
487
488 interp = PyInterpreterState_New();
489 if (interp == NULL)
490 return NULL;
491
492 tstate = PyThreadState_New(interp);
493 if (tstate == NULL) {
494 PyInterpreterState_Delete(interp);
495 return NULL;
496 }
497
498 save_tstate = PyThreadState_Swap(tstate);
499
500 /* XXX The following is lax in error checking */
501
502 interp->modules = PyDict_New();
503
504 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
505 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000506 interp->builtins = PyModule_GetDict(bimod);
507 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000508 }
509 sysmod = _PyImport_FindExtension("sys", "sys");
510 if (bimod != NULL && sysmod != NULL) {
511 interp->sysdict = PyModule_GetDict(sysmod);
512 Py_INCREF(interp->sysdict);
513 PySys_SetPath(Py_GetPath());
514 PyDict_SetItemString(interp->sysdict, "modules",
515 interp->modules);
Martin v. Löwisd7ceb222003-01-22 09:00:38 +0000516 _PyImportHooks_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000517 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000518 if (!Py_NoSiteFlag)
519 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000520 }
521
522 if (!PyErr_Occurred())
523 return tstate;
524
525 /* Oops, it didn't work. Undo it all. */
526
527 PyErr_Print();
528 PyThreadState_Clear(tstate);
529 PyThreadState_Swap(save_tstate);
530 PyThreadState_Delete(tstate);
531 PyInterpreterState_Delete(interp);
532
533 return NULL;
534}
535
536/* Delete an interpreter and its last thread. This requires that the
537 given thread state is current, that the thread has no remaining
538 frames, and that it is its interpreter's only remaining thread.
539 It is a fatal error to violate these constraints.
540
541 (Py_Finalize() doesn't have these constraints -- it zaps
542 everything, regardless.)
543
544 Locking: as above.
545
546*/
547
548void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000549Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000550{
551 PyInterpreterState *interp = tstate->interp;
552
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000553 if (tstate != PyThreadState_GET())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000554 Py_FatalError("Py_EndInterpreter: thread is not current");
555 if (tstate->frame != NULL)
556 Py_FatalError("Py_EndInterpreter: thread still has a frame");
557 if (tstate != interp->tstate_head || tstate->next != NULL)
558 Py_FatalError("Py_EndInterpreter: not the last thread");
559
560 PyImport_Cleanup();
561 PyInterpreterState_Clear(interp);
562 PyThreadState_Swap(NULL);
563 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000564}
565
566static char *progname = "python";
567
568void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000569Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000570{
571 if (pn && *pn)
572 progname = pn;
573}
574
575char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000576Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000577{
578 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000579}
580
Guido van Rossuma61691e1998-02-06 22:27:24 +0000581static char *default_home = NULL;
582
583void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000584Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000585{
586 default_home = home;
587}
588
589char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000590Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000591{
592 char *home = default_home;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000593 if (home == NULL && !Py_IgnoreEnvironmentFlag)
594 home = Py_GETENV("PYTHONHOME");
Guido van Rossuma61691e1998-02-06 22:27:24 +0000595 return home;
596}
597
Guido van Rossum6135a871995-01-09 17:53:26 +0000598/* Create __main__ module */
599
600static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000601initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000602{
Guido van Rossum82598051997-03-05 00:20:32 +0000603 PyObject *m, *d;
604 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000605 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000606 Py_FatalError("can't create __main__ module");
607 d = PyModule_GetDict(m);
608 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000609 PyObject *bimod = PyImport_ImportModule("__builtin__");
610 if (bimod == NULL ||
611 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000612 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000613 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000614 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000615}
616
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000617/* Import the site module (not into __main__ though) */
618
619static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000620initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000621{
622 PyObject *m, *f;
623 m = PyImport_ImportModule("site");
624 if (m == NULL) {
625 f = PySys_GetObject("stderr");
626 if (Py_VerboseFlag) {
627 PyFile_WriteString(
628 "'import site' failed; traceback:\n", f);
629 PyErr_Print();
630 }
631 else {
632 PyFile_WriteString(
633 "'import site' failed; use -v for traceback\n", f);
634 PyErr_Clear();
635 }
636 }
637 else {
638 Py_DECREF(m);
639 }
640}
641
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000642/* Parse input from a file and execute it */
643
644int
Martin v. Löwis056a69c2006-03-01 16:55:42 +0000645PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000646 PyCompilerFlags *flags)
647{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000648 if (filename == NULL)
649 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000650 if (Py_FdIsInteractive(fp, filename)) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000651 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000652 if (closeit)
653 fclose(fp);
654 return err;
655 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000656 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000657 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000658}
659
660int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000661PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000662{
Guido van Rossum82598051997-03-05 00:20:32 +0000663 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000664 int ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000665 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000666
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000667 if (flags == NULL) {
668 flags = &local_flags;
Tim Peters5ba58662001-07-16 02:29:45 +0000669 local_flags.cf_flags = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000670 }
Guido van Rossum82598051997-03-05 00:20:32 +0000671 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000673 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
674 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675 }
Guido van Rossum82598051997-03-05 00:20:32 +0000676 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000678 PySys_SetObject("ps2", v = PyString_FromString("... "));
679 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000680 }
681 for (;;) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000682 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
Tim Peters62e97f02006-03-28 21:44:32 +0000683 PRINT_TOTAL_REFS();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000684 if (ret == E_EOF)
685 return 0;
686 /*
687 if (ret == E_NOMEM)
688 return -1;
689 */
690 }
691}
692
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000693/* compute parser flags based on compiler flags */
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000694#define PARSER_FLAGS(flags) \
Thomas Wouters34aa7ba2006-02-28 19:02:24 +0000695 ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
696 PyPARSE_DONT_IMPLY_DEDENT : 0) \
Neal Norwitz9589ee22006-03-04 19:01:22 +0000697 | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \
698 PyPARSE_WITH_IS_KEYWORD : 0)) : 0)
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000699
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000700int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000701PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000702{
Guido van Rossum82598051997-03-05 00:20:32 +0000703 PyObject *m, *d, *v, *w;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000704 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +0000705 PyArena *arena;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000706 char *ps1 = "", *ps2 = "";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000707 int errcode = 0;
Tim Petersfe2127d2001-07-16 05:37:24 +0000708
Guido van Rossum82598051997-03-05 00:20:32 +0000709 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000710 if (v != NULL) {
711 v = PyObject_Str(v);
712 if (v == NULL)
713 PyErr_Clear();
714 else if (PyString_Check(v))
715 ps1 = PyString_AsString(v);
716 }
Guido van Rossum82598051997-03-05 00:20:32 +0000717 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000718 if (w != NULL) {
719 w = PyObject_Str(w);
720 if (w == NULL)
721 PyErr_Clear();
722 else if (PyString_Check(w))
723 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000724 }
Neal Norwitz9589ee22006-03-04 19:01:22 +0000725 arena = PyArena_New();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726 mod = PyParser_ASTFromFile(fp, filename,
727 Py_single_input, ps1, ps2,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000728 flags, &errcode, arena);
Guido van Rossum82598051997-03-05 00:20:32 +0000729 Py_XDECREF(v);
730 Py_XDECREF(w);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000731 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +0000732 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733 if (errcode == E_EOF) {
734 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000735 return E_EOF;
736 }
Guido van Rossum82598051997-03-05 00:20:32 +0000737 PyErr_Print();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738 return -1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000739 }
Guido van Rossum82598051997-03-05 00:20:32 +0000740 m = PyImport_AddModule("__main__");
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000741 if (m == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +0000742 PyArena_Free(arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000743 return -1;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000744 }
Guido van Rossum82598051997-03-05 00:20:32 +0000745 d = PyModule_GetDict(m);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000746 v = run_mod(mod, filename, d, d, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +0000747 PyArena_Free(arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000748 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000749 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000750 return -1;
751 }
Guido van Rossum82598051997-03-05 00:20:32 +0000752 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000753 if (Py_FlushLine())
754 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000755 return 0;
756}
757
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000758/* Check whether a file maybe a pyc file: Look at the extension,
759 the file type, and, if we may close it, at the first few bytes. */
760
761static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000762maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000763{
764 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
765 return 1;
766
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000767 /* Only look into the file if we are allowed to close it, since
768 it then should also be seekable. */
769 if (closeit) {
770 /* Read only two bytes of the magic. If the file was opened in
771 text mode, the bytes 3 and 4 of the magic (\r\n) might not
772 be read as they are on disk. */
773 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
774 unsigned char buf[2];
Tim Peters3e876562001-02-11 04:35:39 +0000775 /* Mess: In case of -x, the stream is NOT at its start now,
776 and ungetc() was used to push back the first newline,
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000777 which makes the current stream position formally undefined,
778 and a x-platform nightmare.
779 Unfortunately, we have no direct way to know whether -x
780 was specified. So we use a terrible hack: if the current
781 stream position is not 0, we assume -x was specified, and
782 give up. Bug 132850 on SourceForge spells out the
783 hopelessness of trying anything else (fseek and ftell
784 don't work predictably x-platform for text-mode files).
Tim Peters3e876562001-02-11 04:35:39 +0000785 */
Tim Peters3e876562001-02-11 04:35:39 +0000786 int ispyc = 0;
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000787 if (ftell(fp) == 0) {
788 if (fread(buf, 1, 2, fp) == 2 &&
Tim Petersd08e3822003-04-17 15:24:21 +0000789 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000790 ispyc = 1;
791 rewind(fp);
792 }
Tim Peters3e876562001-02-11 04:35:39 +0000793 return ispyc;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000794 }
795 return 0;
Tim Petersd08e3822003-04-17 15:24:21 +0000796}
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000797
Guido van Rossum0df002c2000-08-27 19:21:52 +0000798int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000799PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000800 PyCompilerFlags *flags)
801{
Guido van Rossum82598051997-03-05 00:20:32 +0000802 PyObject *m, *d, *v;
Martin v. Löwis95292d62002-12-11 14:04:59 +0000803 const char *ext;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000804
Guido van Rossum82598051997-03-05 00:20:32 +0000805 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000806 if (m == NULL)
807 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000808 d = PyModule_GetDict(m);
Fred Drake8ed02042002-10-17 21:24:58 +0000809 if (PyDict_GetItemString(d, "__file__") == NULL) {
810 PyObject *f = PyString_FromString(filename);
811 if (f == NULL)
812 return -1;
813 if (PyDict_SetItemString(d, "__file__", f) < 0) {
814 Py_DECREF(f);
815 return -1;
816 }
817 Py_DECREF(f);
818 }
Guido van Rossumfdef2711994-09-14 13:31:04 +0000819 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000820 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000821 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000822 if (closeit)
823 fclose(fp);
Fred Drake8ed02042002-10-17 21:24:58 +0000824 if ((fp = fopen(filename, "rb")) == NULL) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000825 fprintf(stderr, "python: Can't reopen .pyc file\n");
826 return -1;
827 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000828 /* Turn on optimization if a .pyo file is given */
829 if (strcmp(ext, ".pyo") == 0)
830 Py_OptimizeFlag = 1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000831 v = run_pyc_file(fp, filename, d, d, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000832 } else {
Tim Petersd08e3822003-04-17 15:24:21 +0000833 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000834 closeit, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000835 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000836 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000837 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000838 return -1;
839 }
Guido van Rossum82598051997-03-05 00:20:32 +0000840 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000841 if (Py_FlushLine())
842 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000843 return 0;
844}
845
846int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000847PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
Guido van Rossum393661d2001-08-31 17:40:15 +0000848{
Guido van Rossum82598051997-03-05 00:20:32 +0000849 PyObject *m, *d, *v;
850 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000851 if (m == NULL)
852 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000853 d = PyModule_GetDict(m);
Guido van Rossum393661d2001-08-31 17:40:15 +0000854 v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000855 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000856 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000857 return -1;
858 }
Guido van Rossum82598051997-03-05 00:20:32 +0000859 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000860 if (Py_FlushLine())
861 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000862 return 0;
863}
864
Barry Warsaw035574d1997-08-29 22:07:17 +0000865static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000866parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
867 int *lineno, int *offset, const char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000868{
869 long hold;
870 PyObject *v;
871
872 /* old style errors */
873 if (PyTuple_Check(err))
Neal Norwitz78293352002-04-01 01:41:20 +0000874 return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
Neal Norwitz9589ee22006-03-04 19:01:22 +0000875 lineno, offset, text);
Barry Warsaw035574d1997-08-29 22:07:17 +0000876
877 /* new style errors. `err' is an instance */
878
879 if (! (v = PyObject_GetAttrString(err, "msg")))
880 goto finally;
881 *message = v;
882
883 if (!(v = PyObject_GetAttrString(err, "filename")))
884 goto finally;
885 if (v == Py_None)
886 *filename = NULL;
887 else if (! (*filename = PyString_AsString(v)))
888 goto finally;
889
890 Py_DECREF(v);
891 if (!(v = PyObject_GetAttrString(err, "lineno")))
892 goto finally;
893 hold = PyInt_AsLong(v);
894 Py_DECREF(v);
895 v = NULL;
896 if (hold < 0 && PyErr_Occurred())
897 goto finally;
898 *lineno = (int)hold;
899
900 if (!(v = PyObject_GetAttrString(err, "offset")))
901 goto finally;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000902 if (v == Py_None) {
903 *offset = -1;
904 Py_DECREF(v);
905 v = NULL;
906 } else {
907 hold = PyInt_AsLong(v);
908 Py_DECREF(v);
909 v = NULL;
910 if (hold < 0 && PyErr_Occurred())
911 goto finally;
912 *offset = (int)hold;
913 }
Barry Warsaw035574d1997-08-29 22:07:17 +0000914
915 if (!(v = PyObject_GetAttrString(err, "text")))
916 goto finally;
917 if (v == Py_None)
918 *text = NULL;
919 else if (! (*text = PyString_AsString(v)))
920 goto finally;
921 Py_DECREF(v);
922 return 1;
923
924finally:
925 Py_XDECREF(v);
926 return 0;
927}
928
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000929void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000930PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000931{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000932 PyErr_PrintEx(1);
933}
934
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000935static void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000936print_error_text(PyObject *f, int offset, const char *text)
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000937{
938 char *nl;
939 if (offset >= 0) {
940 if (offset > 0 && offset == (int)strlen(text))
941 offset--;
942 for (;;) {
943 nl = strchr(text, '\n');
944 if (nl == NULL || nl-text >= offset)
945 break;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000946 offset -= (int)(nl+1-text);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000947 text = nl+1;
948 }
949 while (*text == ' ' || *text == '\t') {
950 text++;
951 offset--;
952 }
953 }
954 PyFile_WriteString(" ", f);
955 PyFile_WriteString(text, f);
956 if (*text == '\0' || text[strlen(text)-1] != '\n')
957 PyFile_WriteString("\n", f);
958 if (offset == -1)
959 return;
960 PyFile_WriteString(" ", f);
961 offset--;
962 while (offset > 0) {
963 PyFile_WriteString(" ", f);
964 offset--;
965 }
966 PyFile_WriteString("^\n", f);
967}
968
Guido van Rossum66e8e862001-03-23 17:54:43 +0000969static void
970handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000971{
Neal Norwitz9589ee22006-03-04 19:01:22 +0000972 PyObject *exception, *value, *tb;
973 int exitcode = 0;
Tim Peterscf615b52003-04-19 18:47:02 +0000974
Guido van Rossum66e8e862001-03-23 17:54:43 +0000975 PyErr_Fetch(&exception, &value, &tb);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000976 if (Py_FlushLine())
977 PyErr_Clear();
978 fflush(stdout);
979 if (value == NULL || value == Py_None)
Tim Peterscf615b52003-04-19 18:47:02 +0000980 goto done;
Brett Cannonbf364092006-03-01 04:25:17 +0000981 if (PyExceptionInstance_Check(value)) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000982 /* The error code should be in the `code' attribute. */
983 PyObject *code = PyObject_GetAttrString(value, "code");
984 if (code) {
985 Py_DECREF(value);
986 value = code;
987 if (value == Py_None)
Tim Peterscf615b52003-04-19 18:47:02 +0000988 goto done;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000989 }
990 /* If we failed to dig out the 'code' attribute,
991 just let the else clause below print the error. */
992 }
993 if (PyInt_Check(value))
Tim Peterscf615b52003-04-19 18:47:02 +0000994 exitcode = (int)PyInt_AsLong(value);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000995 else {
996 PyObject_Print(value, stderr, Py_PRINT_RAW);
997 PySys_WriteStderr("\n");
Tim Peterscf615b52003-04-19 18:47:02 +0000998 exitcode = 1;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000999 }
Tim Peterscf615b52003-04-19 18:47:02 +00001000 done:
Neal Norwitz9589ee22006-03-04 19:01:22 +00001001 /* Restore and clear the exception info, in order to properly decref
1002 * the exception, value, and traceback. If we just exit instead,
1003 * these leak, which confuses PYTHONDUMPREFS output, and may prevent
1004 * some finalizers from running.
1005 */
Tim Peterscf615b52003-04-19 18:47:02 +00001006 PyErr_Restore(exception, value, tb);
1007 PyErr_Clear();
1008 Py_Exit(exitcode);
1009 /* NOTREACHED */
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001010}
1011
1012void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001013PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +00001014{
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001015 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001016
1017 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1018 handle_system_exit();
1019 }
Guido van Rossum82598051997-03-05 00:20:32 +00001020 PyErr_Fetch(&exception, &v, &tb);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021 if (exception == NULL)
1022 return;
Barry Warsaw035574d1997-08-29 22:07:17 +00001023 PyErr_NormalizeException(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001024 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +00001025 return;
Guido van Rossum9d785502006-03-07 18:31:44 +00001026 /* Now we know v != NULL too */
Guido van Rossuma61691e1998-02-06 22:27:24 +00001027 if (set_sys_last_vars) {
1028 PySys_SetObject("last_type", exception);
1029 PySys_SetObject("last_value", v);
1030 PySys_SetObject("last_traceback", tb);
1031 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001032 hook = PySys_GetObject("excepthook");
1033 if (hook) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001034 PyObject *args = PyTuple_Pack(3,
Guido van Rossum9d785502006-03-07 18:31:44 +00001035 exception, v, tb ? tb : Py_None);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001036 PyObject *result = PyEval_CallObject(hook, args);
1037 if (result == NULL) {
1038 PyObject *exception2, *v2, *tb2;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001039 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1040 handle_system_exit();
1041 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001042 PyErr_Fetch(&exception2, &v2, &tb2);
1043 PyErr_NormalizeException(&exception2, &v2, &tb2);
1044 if (Py_FlushLine())
1045 PyErr_Clear();
1046 fflush(stdout);
1047 PySys_WriteStderr("Error in sys.excepthook:\n");
1048 PyErr_Display(exception2, v2, tb2);
1049 PySys_WriteStderr("\nOriginal exception was:\n");
1050 PyErr_Display(exception, v, tb);
Jeremy Hylton07028582001-12-07 15:35:35 +00001051 Py_XDECREF(exception2);
1052 Py_XDECREF(v2);
1053 Py_XDECREF(tb2);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001054 }
1055 Py_XDECREF(result);
1056 Py_XDECREF(args);
1057 } else {
1058 PySys_WriteStderr("sys.excepthook is missing\n");
1059 PyErr_Display(exception, v, tb);
1060 }
1061 Py_XDECREF(exception);
1062 Py_XDECREF(v);
1063 Py_XDECREF(tb);
1064}
1065
1066void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
1067{
1068 int err = 0;
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001069 PyObject *f = PySys_GetObject("stderr");
Armin Rigo5d2c6832004-03-22 20:16:58 +00001070 Py_INCREF(value);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001071 if (f == NULL)
1072 fprintf(stderr, "lost sys.stderr\n");
1073 else {
Guido van Rossum0829c751998-02-28 04:31:39 +00001074 if (Py_FlushLine())
1075 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001076 fflush(stdout);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001077 if (tb && tb != Py_None)
1078 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +00001079 if (err == 0 &&
Armin Rigo5d2c6832004-03-22 20:16:58 +00001080 PyObject_HasAttrString(value, "print_file_and_line"))
Barry Warsaw36b8f941997-08-26 18:09:48 +00001081 {
Guido van Rossum82598051997-03-05 00:20:32 +00001082 PyObject *message;
Martin v. Löwis95292d62002-12-11 14:04:59 +00001083 const char *filename, *text;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001084 int lineno, offset;
Armin Rigo5d2c6832004-03-22 20:16:58 +00001085 if (!parse_syntax_error(value, &message, &filename,
Barry Warsaw035574d1997-08-29 22:07:17 +00001086 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +00001087 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001088 else {
1089 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +00001090 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001091 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +00001092 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001093 else
Guido van Rossum82598051997-03-05 00:20:32 +00001094 PyFile_WriteString(filename, f);
1095 PyFile_WriteString("\", line ", f);
Jeremy Hylton518ab1c2001-11-28 20:42:20 +00001096 PyOS_snprintf(buf, sizeof(buf), "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +00001097 PyFile_WriteString(buf, f);
1098 PyFile_WriteString("\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001099 if (text != NULL)
1100 print_error_text(f, offset, text);
Armin Rigo5d2c6832004-03-22 20:16:58 +00001101 Py_DECREF(value);
1102 value = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001103 /* Can't be bothered to check all those
1104 PyFile_WriteString() calls */
1105 if (PyErr_Occurred())
1106 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001107 }
1108 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001109 if (err) {
1110 /* Don't do anything else */
1111 }
Brett Cannonbf364092006-03-01 04:25:17 +00001112 else if (PyExceptionClass_Check(exception)) {
1113 char* className = PyExceptionClass_Name(exception);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001114 PyObject* moduleName =
Brett Cannonbf364092006-03-01 04:25:17 +00001115 PyObject_GetAttrString(exception, "__module__");
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001116
1117 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001118 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001119 else {
1120 char* modstr = PyString_AsString(moduleName);
Brett Cannon2e63b732006-03-02 18:34:57 +00001121 Py_DECREF(moduleName);
Tim Petersd08e3822003-04-17 15:24:21 +00001122 if (modstr && strcmp(modstr, "exceptions"))
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001123 {
1124 err = PyFile_WriteString(modstr, f);
1125 err += PyFile_WriteString(".", f);
1126 }
1127 }
1128 if (err == 0) {
1129 if (className == NULL)
1130 err = PyFile_WriteString("<unknown>", f);
1131 else
Brett Cannonbf364092006-03-01 04:25:17 +00001132 err = PyFile_WriteString(className, f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001133 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001134 }
1135 else
1136 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
Brett Cannon2e63b732006-03-02 18:34:57 +00001137 if (err == 0 && (value != Py_None)) {
1138 PyObject *s = PyObject_Str(value);
1139 /* only print colon if the str() of the
1140 object is not the empty string
1141 */
1142 if (s == NULL)
1143 err = -1;
1144 else if (!PyString_Check(s) ||
1145 PyString_GET_SIZE(s) != 0)
1146 err = PyFile_WriteString(": ", f);
1147 if (err == 0)
1148 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1149 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +00001150 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001151 if (err == 0)
1152 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001153 }
Armin Rigo5d2c6832004-03-22 20:16:58 +00001154 Py_DECREF(value);
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001155 /* If an error happened here, don't show it.
1156 XXX This is wrong, but too many callers rely on this behavior. */
1157 if (err != 0)
1158 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001159}
1160
Guido van Rossum82598051997-03-05 00:20:32 +00001161PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162PyRun_StringFlags(const char *str, int start, PyObject *globals,
1163 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001164{
Neal Norwitze92fba02006-03-04 18:52:26 +00001165 PyObject *ret = NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001166 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001167 mod_ty mod = PyParser_ASTFromString(str, "<string>", start, flags,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001168 arena);
Neal Norwitze92fba02006-03-04 18:52:26 +00001169 if (mod != NULL)
1170 ret = run_mod(mod, "<string>", globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001171 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001173}
1174
1175PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001176PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001177 PyObject *locals, int closeit, PyCompilerFlags *flags)
1178{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179 PyObject *ret;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001180 PyArena *arena = PyArena_New();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 mod_ty mod = PyParser_ASTFromFile(fp, filename, start, 0, 0,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001182 flags, NULL, arena);
1183 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001184 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001186 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001187 if (closeit)
1188 fclose(fp);
Neal Norwitze92fba02006-03-04 18:52:26 +00001189 ret = run_mod(mod, filename, globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001190 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001192}
1193
Guido van Rossum82598051997-03-05 00:20:32 +00001194static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001195run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001196 PyCompilerFlags *flags, PyArena *arena)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001197{
Guido van Rossum82598051997-03-05 00:20:32 +00001198 PyCodeObject *co;
1199 PyObject *v;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001200 co = PyAST_Compile(mod, filename, flags, arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001201 if (co == NULL)
1202 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001203 v = PyEval_EvalCode(co, globals, locals);
1204 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001205 return v;
1206}
1207
Guido van Rossum82598051997-03-05 00:20:32 +00001208static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
1210 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001211{
Guido van Rossum82598051997-03-05 00:20:32 +00001212 PyCodeObject *co;
1213 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001214 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001215 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001216
Guido van Rossum82598051997-03-05 00:20:32 +00001217 magic = PyMarshal_ReadLongFromFile(fp);
1218 if (magic != PyImport_GetMagicNumber()) {
1219 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001220 "Bad magic number in .pyc file");
1221 return NULL;
1222 }
Guido van Rossum82598051997-03-05 00:20:32 +00001223 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001224 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001225 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001226 if (v == NULL || !PyCode_Check(v)) {
1227 Py_XDECREF(v);
1228 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001229 "Bad code object in .pyc file");
1230 return NULL;
1231 }
Guido van Rossum82598051997-03-05 00:20:32 +00001232 co = (PyCodeObject *)v;
1233 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001234 if (v && flags)
1235 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001236 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001237 return v;
1238}
1239
Guido van Rossum82598051997-03-05 00:20:32 +00001240PyObject *
Tim Petersd08e3822003-04-17 15:24:21 +00001241Py_CompileStringFlags(const char *str, const char *filename, int start,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001242 PyCompilerFlags *flags)
1243{
Guido van Rossum82598051997-03-05 00:20:32 +00001244 PyCodeObject *co;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001245 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001246 mod_ty mod = PyParser_ASTFromString(str, filename, start, flags, arena);
1247 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001248 PyArena_Free(arena);
Guido van Rossum5b722181993-03-30 17:46:03 +00001249 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001250 }
Martin v. Löwis2b366e42006-02-26 22:12:35 +00001251 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001252 PyObject *result = PyAST_mod2obj(mod);
1253 PyArena_Free(arena);
1254 return result;
1255 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001256 co = PyAST_Compile(mod, filename, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001257 PyArena_Free(arena);
Guido van Rossum82598051997-03-05 00:20:32 +00001258 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001259}
1260
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001261struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001262Py_SymtableString(const char *str, const char *filename, int start)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001263{
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001264 struct symtable *st;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001265 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001266 mod_ty mod = PyParser_ASTFromString(str, filename, start, NULL, arena);
1267 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001268 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001269 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001270 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001271 st = PySymtable_Build(mod, filename, 0);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001272 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001273 return st;
1274}
1275
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001276/* Preferred access to parser is through AST. */
1277mod_ty
1278PyParser_ASTFromString(const char *s, const char *filename, int start,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001279 PyCompilerFlags *flags, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001280{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001281 mod_ty mod;
1282 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001283 node *n = PyParser_ParseStringFlagsFilename(s, filename,
1284 &_PyParser_Grammar, start, &err,
1285 PARSER_FLAGS(flags));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286 if (n) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001287 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001288 PyNode_Free(n);
1289 return mod;
1290 }
1291 else {
1292 err_input(&err);
1293 return NULL;
1294 }
1295}
1296
1297mod_ty
1298PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001299 char *ps2, PyCompilerFlags *flags, int *errcode,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001300 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001301{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001302 mod_ty mod;
1303 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001304 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
1305 start, ps1, ps2, &err, PARSER_FLAGS(flags));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001306 if (n) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001307 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001308 PyNode_Free(n);
1309 return mod;
1310 }
1311 else {
1312 err_input(&err);
1313 if (errcode)
1314 *errcode = err.error;
1315 return NULL;
1316 }
1317}
1318
Guido van Rossuma110aa61994-08-29 12:50:44 +00001319/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001320
Guido van Rossuma110aa61994-08-29 12:50:44 +00001321node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001322PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001323{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001324 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001325 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
1326 start, NULL, NULL, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001327 if (n == NULL)
1328 err_input(&err);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001329
Guido van Rossuma110aa61994-08-29 12:50:44 +00001330 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001331}
1332
Guido van Rossuma110aa61994-08-29 12:50:44 +00001333/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001334
Guido van Rossuma110aa61994-08-29 12:50:44 +00001335node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001336PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
Tim Petersfe2127d2001-07-16 05:37:24 +00001337{
Tim Petersfe2127d2001-07-16 05:37:24 +00001338 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001339 node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
1340 start, &err, flags);
Tim Petersfe2127d2001-07-16 05:37:24 +00001341 if (n == NULL)
1342 err_input(&err);
1343 return n;
1344}
1345
1346node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001347PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
Thomas Heller6b17abf2002-07-09 09:23:27 +00001348 int start, int flags)
1349{
Thomas Heller6b17abf2002-07-09 09:23:27 +00001350 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001351 node *n = PyParser_ParseStringFlagsFilename(str, filename,
1352 &_PyParser_Grammar, start, &err, flags);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001353 if (n == NULL)
1354 err_input(&err);
1355 return n;
1356}
1357
1358node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001359PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001360{
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001361 return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001362}
1363
Guido van Rossum66ebd912003-04-17 16:02:26 +00001364/* May want to move a more generalized form of this to parsetok.c or
1365 even parser modules. */
1366
1367void
1368PyParser_SetError(perrdetail *err)
1369{
1370 err_input(err);
1371}
1372
Guido van Rossuma110aa61994-08-29 12:50:44 +00001373/* Set the error appropriate to the given input error code (see errcode.h) */
1374
1375static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001376err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001377{
Fred Drake85f36392000-07-11 17:53:00 +00001378 PyObject *v, *w, *errtype;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001379 PyObject* u = NULL;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001380 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001381 errtype = PyExc_SyntaxError;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001382 switch (err->error) {
1383 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001384 errtype = PyExc_IndentationError;
1385 if (err->expected == INDENT)
1386 msg = "expected an indented block";
1387 else if (err->token == INDENT)
1388 msg = "unexpected indent";
1389 else if (err->token == DEDENT)
1390 msg = "unexpected unindent";
1391 else {
1392 errtype = PyExc_SyntaxError;
1393 msg = "invalid syntax";
1394 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001395 break;
1396 case E_TOKEN:
1397 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001398 break;
Skip Montanaro118ec702002-08-15 01:20:16 +00001399 case E_EOFS:
1400 msg = "EOF while scanning triple-quoted string";
1401 break;
1402 case E_EOLS:
1403 msg = "EOL while scanning single-quoted string";
1404 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001405 case E_INTR:
Michael W. Hudson30ea2f22004-07-07 17:44:12 +00001406 if (!PyErr_Occurred())
1407 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001408 return;
1409 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001410 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001411 return;
1412 case E_EOF:
1413 msg = "unexpected EOF while parsing";
1414 break;
Fred Drake85f36392000-07-11 17:53:00 +00001415 case E_TABSPACE:
1416 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001417 msg = "inconsistent use of tabs and spaces in indentation";
1418 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001419 case E_OVERFLOW:
1420 msg = "expression too long";
1421 break;
Fred Drake85f36392000-07-11 17:53:00 +00001422 case E_DEDENT:
1423 errtype = PyExc_IndentationError;
1424 msg = "unindent does not match any outer indentation level";
1425 break;
1426 case E_TOODEEP:
1427 errtype = PyExc_IndentationError;
1428 msg = "too many levels of indentation";
1429 break;
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001430 case E_DECODE: {
1431 PyObject *type, *value, *tb;
1432 PyErr_Fetch(&type, &value, &tb);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001433 if (value != NULL) {
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001434 u = PyObject_Str(value);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001435 if (u != NULL) {
1436 msg = PyString_AsString(u);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001437 }
1438 }
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001439 if (msg == NULL)
1440 msg = "unknown decode error";
Neal Norwitzdb83eb32005-12-18 05:29:30 +00001441 Py_XDECREF(type);
1442 Py_XDECREF(value);
Neal Norwitz40d37812005-10-02 01:48:49 +00001443 Py_XDECREF(tb);
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001444 break;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001445 }
Martin v. Löwis4bf108d2005-03-03 11:45:45 +00001446 case E_LINECONT:
1447 msg = "unexpected character after line continuation character";
1448 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001449 default:
1450 fprintf(stderr, "error=%d\n", err->error);
1451 msg = "unknown parsing error";
1452 break;
1453 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 v = Py_BuildValue("(ziiz)", err->filename,
1455 err->lineno, err->offset, err->text);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001456 if (err->text != NULL) {
Tim Petersc9d78aa2006-03-26 23:27:58 +00001457 PyObject_FREE(err->text);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 err->text = NULL;
1459 }
1460 w = NULL;
1461 if (v != NULL)
1462 w = Py_BuildValue("(sO)", msg, v);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001463 Py_XDECREF(u);
Guido van Rossum41318302001-03-23 04:01:07 +00001464 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001465 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001466 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001467}
1468
1469/* Print fatal error message and abort */
1470
1471void
Tim Peters7c321a82002-07-09 02:57:01 +00001472Py_FatalError(const char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001473{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001474 fprintf(stderr, "Fatal Python error: %s\n", msg);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001475#ifdef MS_WINDOWS
Guido van Rossum23c94461997-05-22 20:21:30 +00001476 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001477 OutputDebugString(msg);
1478 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001479#ifdef _DEBUG
1480 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001481#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001482#endif /* MS_WINDOWS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001483 abort();
1484}
1485
1486/* Clean up and exit */
1487
Guido van Rossuma110aa61994-08-29 12:50:44 +00001488#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001489#include "pythread.h"
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001490#endif
1491
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001492#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001493static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001494static int nexitfuncs = 0;
1495
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001496int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001497{
1498 if (nexitfuncs >= NEXITFUNCS)
1499 return -1;
1500 exitfuncs[nexitfuncs++] = func;
1501 return 0;
1502}
1503
Guido van Rossumcc283f51997-08-05 02:22:03 +00001504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001505call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001506{
Guido van Rossum82598051997-03-05 00:20:32 +00001507 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001508
1509 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001510 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001511 Py_INCREF(exitfunc);
1512 PySys_SetObject("exitfunc", (PyObject *)NULL);
1513 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001514 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001515 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1516 PySys_WriteStderr("Error in sys.exitfunc:\n");
1517 }
Guido van Rossum82598051997-03-05 00:20:32 +00001518 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001519 }
Guido van Rossum82598051997-03-05 00:20:32 +00001520 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001521 }
1522
Guido van Rossum0829c751998-02-28 04:31:39 +00001523 if (Py_FlushLine())
1524 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001525}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001526
Guido van Rossumcc283f51997-08-05 02:22:03 +00001527static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001528call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001529{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001530 while (nexitfuncs > 0)
1531 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001532
1533 fflush(stdout);
1534 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001535}
1536
1537void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001538Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001539{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001540 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001541
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001542 exit(sts);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001543}
1544
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001545static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001546initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001547{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001548#ifdef SIGPIPE
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001549 PyOS_setsig(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001550#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00001551#ifdef SIGXFZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001552 PyOS_setsig(SIGXFZ, SIG_IGN);
Guido van Rossum70d893a2001-08-16 08:21:42 +00001553#endif
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001554#ifdef SIGXFSZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001555 PyOS_setsig(SIGXFSZ, SIG_IGN);
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001556#endif
Guido van Rossum82598051997-03-05 00:20:32 +00001557 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001558}
1559
Guido van Rossum7433b121997-02-14 19:45:36 +00001560
1561/*
1562 * The file descriptor fd is considered ``interactive'' if either
1563 * a) isatty(fd) is TRUE, or
1564 * b) the -i flag was given, and the filename associated with
1565 * the descriptor is NULL or "<stdin>" or "???".
1566 */
1567int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001568Py_FdIsInteractive(FILE *fp, const char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001569{
1570 if (isatty((int)fileno(fp)))
1571 return 1;
1572 if (!Py_InteractiveFlag)
1573 return 0;
1574 return (filename == NULL) ||
1575 (strcmp(filename, "<stdin>") == 0) ||
1576 (strcmp(filename, "???") == 0);
1577}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001578
1579
Tim Petersd08e3822003-04-17 15:24:21 +00001580#if defined(USE_STACKCHECK)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001581#if defined(WIN32) && defined(_MSC_VER)
1582
1583/* Stack checking for Microsoft C */
1584
1585#include <malloc.h>
1586#include <excpt.h>
1587
Fred Drakee8de31c2000-08-31 05:38:39 +00001588/*
1589 * Return non-zero when we run out of memory on the stack; zero otherwise.
1590 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001591int
Fred Drake399739f2000-08-31 05:52:44 +00001592PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001593{
1594 __try {
Tim Peters92e4dd82002-10-05 01:47:34 +00001595 /* alloca throws a stack overflow exception if there's
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001596 not enough space left on the stack */
Tim Peters92e4dd82002-10-05 01:47:34 +00001597 alloca(PYOS_STACK_MARGIN * sizeof(void*));
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001598 return 0;
1599 } __except (EXCEPTION_EXECUTE_HANDLER) {
1600 /* just ignore all errors */
1601 }
1602 return 1;
1603}
1604
1605#endif /* WIN32 && _MSC_VER */
1606
1607/* Alternate implementations can be added here... */
1608
1609#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001610
1611
1612/* Wrappers around sigaction() or signal(). */
1613
1614PyOS_sighandler_t
1615PyOS_getsig(int sig)
1616{
1617#ifdef HAVE_SIGACTION
1618 struct sigaction context;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001619 if (sigaction(sig, NULL, &context) == -1)
1620 return SIG_ERR;
Guido van Rossum6f256182000-09-16 16:32:19 +00001621 return context.sa_handler;
1622#else
1623 PyOS_sighandler_t handler;
Martin v. Löwisb45b3152005-11-28 17:34:23 +00001624/* Special signal handling for the secure CRT in Visual Studio 2005 */
1625#if defined(_MSC_VER) && _MSC_VER >= 1400
1626 switch (sig) {
1627 /* Only these signals are valid */
1628 case SIGINT:
1629 case SIGILL:
1630 case SIGFPE:
1631 case SIGSEGV:
1632 case SIGTERM:
1633 case SIGBREAK:
1634 case SIGABRT:
1635 break;
1636 /* Don't call signal() with other values or it will assert */
1637 default:
1638 return SIG_ERR;
1639 }
1640#endif /* _MSC_VER && _MSC_VER >= 1400 */
Guido van Rossum6f256182000-09-16 16:32:19 +00001641 handler = signal(sig, SIG_IGN);
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001642 if (handler != SIG_ERR)
1643 signal(sig, handler);
Guido van Rossum6f256182000-09-16 16:32:19 +00001644 return handler;
1645#endif
1646}
1647
1648PyOS_sighandler_t
1649PyOS_setsig(int sig, PyOS_sighandler_t handler)
1650{
1651#ifdef HAVE_SIGACTION
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001652 struct sigaction context, ocontext;
Guido van Rossum6f256182000-09-16 16:32:19 +00001653 context.sa_handler = handler;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001654 sigemptyset(&context.sa_mask);
1655 context.sa_flags = 0;
1656 if (sigaction(sig, &context, &ocontext) == -1)
1657 return SIG_ERR;
1658 return ocontext.sa_handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001659#else
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001660 PyOS_sighandler_t oldhandler;
1661 oldhandler = signal(sig, handler);
1662#ifdef HAVE_SIGINTERRUPT
1663 siginterrupt(sig, 1);
1664#endif
1665 return oldhandler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001666#endif
1667}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001668
1669/* Deprecated C API functions still provided for binary compatiblity */
1670
1671#undef PyParser_SimpleParseFile
1672#undef PyParser_SimpleParseString
1673
1674node *
1675PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
1676{
1677 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1678}
1679
1680node *
1681PyParser_SimpleParseString(const char *str, int start)
1682{
1683 return PyParser_SimpleParseStringFlags(str, start, 0);
1684}