blob: 98ae1151afea2899270a4652fdef8092a14b4843 [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
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000020#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000021#include <signal.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000022#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000023
Martin v. Löwis73d538b2003-03-05 15:13:47 +000024#ifdef HAVE_LANGINFO_H
25#include <locale.h>
26#include <langinfo.h>
27#endif
28
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000029#ifdef MS_WINDOWS
Guido van Rossuma44823b1995-03-14 15:01:17 +000030#undef BYTE
31#include "windows.h"
32#endif
33
Neal Norwitz4281cef2006-03-04 19:58:13 +000034#ifndef Py_REF_DEBUG
Tim Peters62e97f02006-03-28 21:44:32 +000035#define PRINT_TOTAL_REFS()
Neal Norwitz4281cef2006-03-04 19:58:13 +000036#else /* Py_REF_DEBUG */
Tim Peters62e97f02006-03-28 21:44:32 +000037#define PRINT_TOTAL_REFS() fprintf(stderr, \
38 "[%" PY_FORMAT_SIZE_T "d refs]\n", \
Armin Rigoe1709372006-04-12 17:06:05 +000039 _Py_GetRefTotal())
Neal Norwitz4281cef2006-03-04 19:58:13 +000040#endif
41
Anthony Baxterac6bd462006-04-13 02:06:09 +000042#ifdef __cplusplus
43extern "C" {
44#endif
45
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000046extern char *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000047
Guido van Rossum82598051997-03-05 00:20:32 +000048extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000049
Guido van Rossumb73cc041993-11-01 16:28:59 +000050/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000051static void initmain(void);
52static void initsite(void);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000053static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
Neal Norwitzadb69fc2005-12-17 20:54:49 +000054 PyCompilerFlags *, PyArena *);
Martin v. Löwis95292d62002-12-11 14:04:59 +000055static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
Jeremy Hyltonbc320242001-03-22 02:47:58 +000056 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000057static void err_input(perrdetail *);
58static void initsigs(void);
59static void call_sys_exitfunc(void);
60static void call_ll_exitfuncs(void);
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000061extern void _PyUnicode_Init(void);
62extern void _PyUnicode_Fini(void);
Guido van Rossumc94044c2000-03-10 23:03:54 +000063
Mark Hammond8d98d2c2003-04-19 15:41:53 +000064#ifdef WITH_THREAD
65extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
66extern void _PyGILState_Fini(void);
67#endif /* WITH_THREAD */
68
Guido van Rossum82598051997-03-05 00:20:32 +000069int Py_DebugFlag; /* Needed by parser.c */
70int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000071int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000072int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw3ce09642000-05-02 19:18:59 +000073int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000074int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossumb16d1972000-05-01 17:55:15 +000075int Py_UnicodeFlag = 0; /* Needed by compile.c */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +000076int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
Tim Peters3caca232001-12-06 06:23:26 +000077/* _XXX Py_QnewFlag should go away in 2.3. It's true iff -Qnew is passed,
78 on the command line, and is used in 2.2 by ceval.c to make all "/" divisions
79 true divisions (which they will be in 2.3). */
80int _Py_QnewFlag = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000081
Mark Hammonda43fd0c2003-02-19 00:33:33 +000082/* Reference to 'warnings' module, to avoid importing it
Mark Hammondedd07732003-07-15 23:03:55 +000083 on the fly when the import lock may be held. See 683658/771097
Mark Hammonda43fd0c2003-02-19 00:33:33 +000084*/
Mark Hammondedd07732003-07-15 23:03:55 +000085static PyObject *warnings_module = NULL;
86
87/* Returns a borrowed reference to the 'warnings' module, or NULL.
88 If the module is returned, it is guaranteed to have been obtained
89 without acquiring the import lock
90*/
Martin v. Löwisa2c17c52003-08-09 09:47:11 +000091PyObject *PyModule_GetWarningsModule(void)
Mark Hammondedd07732003-07-15 23:03:55 +000092{
93 PyObject *typ, *val, *tb;
94 PyObject *all_modules;
95 /* If we managed to get the module at init time, just use it */
96 if (warnings_module)
97 return warnings_module;
98 /* If it wasn't available at init time, it may be available
99 now in sys.modules (common scenario is frozen apps: import
100 at init time fails, but the frozen init code sets up sys.path
101 correctly, then does an implicit import of warnings for us
102 */
103 /* Save and restore any exceptions */
104 PyErr_Fetch(&typ, &val, &tb);
105
Mark Hammond5f4e8ca2003-07-16 01:54:38 +0000106 all_modules = PySys_GetObject("modules");
Mark Hammondedd07732003-07-15 23:03:55 +0000107 if (all_modules) {
108 warnings_module = PyDict_GetItemString(all_modules, "warnings");
109 /* We keep a ref in the global */
110 Py_XINCREF(warnings_module);
111 }
112 PyErr_Restore(typ, val, tb);
113 return warnings_module;
114}
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000115
Guido van Rossum25ce5661997-08-02 03:10:38 +0000116static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000117
Thomas Wouters7e474022000-07-16 12:04:32 +0000118/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000119
120int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000121Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000122{
123 return initialized;
124}
125
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126/* Global initializations. Can be undone by Py_Finalize(). Don't
127 call this twice without an intervening Py_Finalize() call. When
128 initializations fail, a fatal error is issued and the function does
129 not return. On return, the first thread and interpreter state have
130 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000131
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132 Locking: you must hold the interpreter lock while calling this.
133 (If the lock has not yet been initialized, that's equivalent to
134 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000135
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000137
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000138static int
139add_flag(int flag, const char *envs)
140{
141 int env = atoi(envs);
142 if (flag < env)
143 flag = env;
144 if (flag < 1)
145 flag = 1;
146 return flag;
147}
148
Guido van Rossuma027efa1997-05-05 20:56:21 +0000149void
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000150Py_InitializeEx(int install_sigs)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000151{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000152 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000153 PyThreadState *tstate;
154 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000155 char *p;
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000156#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
157 char *codeset;
158 char *saved_locale;
159 PyObject *sys_stream, *sys_isatty;
160#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +0000161 extern void _Py_ReadyTypes(void);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000162
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000163 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000164 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000165 initialized = 1;
Tim Petersd08e3822003-04-17 15:24:21 +0000166
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000167 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000168 Py_DebugFlag = add_flag(Py_DebugFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000169 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000170 Py_VerboseFlag = add_flag(Py_VerboseFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000171 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000172 Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000173
Guido van Rossuma027efa1997-05-05 20:56:21 +0000174 interp = PyInterpreterState_New();
175 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000176 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000177
Guido van Rossuma027efa1997-05-05 20:56:21 +0000178 tstate = PyThreadState_New(interp);
179 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000180 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000181 (void) PyThreadState_Swap(tstate);
182
Guido van Rossum70d893a2001-08-16 08:21:42 +0000183 _Py_ReadyTypes();
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000184
Neal Norwitzb2501f42002-12-31 03:42:13 +0000185 if (!_PyFrame_Init())
Neal Norwitzc91ed402002-12-30 22:29:22 +0000186 Py_FatalError("Py_Initialize: can't init frames");
187
Neal Norwitzb2501f42002-12-31 03:42:13 +0000188 if (!_PyInt_Init())
Neal Norwitzc91ed402002-12-30 22:29:22 +0000189 Py_FatalError("Py_Initialize: can't init ints");
190
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000191 _PyFloat_Init();
192
Guido van Rossum25ce5661997-08-02 03:10:38 +0000193 interp->modules = PyDict_New();
194 if (interp->modules == NULL)
195 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000196
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000197#ifdef Py_USING_UNICODE
Guido van Rossumc94044c2000-03-10 23:03:54 +0000198 /* Init Unicode implementation; relies on the codec registry */
199 _PyUnicode_Init();
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000200#endif
Guido van Rossumc94044c2000-03-10 23:03:54 +0000201
Barry Warsawf242aa02000-05-25 23:09:49 +0000202 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000203 if (bimod == NULL)
204 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000205 interp->builtins = PyModule_GetDict(bimod);
Neal Norwitz0f7dbf72006-08-12 03:17:41 +0000206 if (interp->builtins == NULL)
207 Py_FatalError("Py_Initialize: can't initialize builtins dict");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000208 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000209
210 sysmod = _PySys_Init();
211 if (sysmod == NULL)
212 Py_FatalError("Py_Initialize: can't initialize sys");
213 interp->sysdict = PyModule_GetDict(sysmod);
Neal Norwitz0f7dbf72006-08-12 03:17:41 +0000214 if (interp->sysdict == NULL)
215 Py_FatalError("Py_Initialize: can't initialize sys dict");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000216 Py_INCREF(interp->sysdict);
217 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000218 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000219 PyDict_SetItemString(interp->sysdict, "modules",
220 interp->modules);
221
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000222 _PyImport_Init();
223
Barry Warsawf242aa02000-05-25 23:09:49 +0000224 /* initialize builtin exceptions */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000225 _PyExc_Init();
Barry Warsaw5821bc52001-08-13 23:04:56 +0000226 _PyImport_FixupExtension("exceptions", "exceptions");
Barry Warsawf242aa02000-05-25 23:09:49 +0000227
Barry Warsaw035574d1997-08-29 22:07:17 +0000228 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000229 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000230
Just van Rossum52e14d62002-12-30 22:08:05 +0000231 _PyImportHooks_Init();
232
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000233 if (install_sigs)
234 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000235
236 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000237 if (!Py_NoSiteFlag)
238 initsite(); /* Module site */
Just van Rossum5bfba3a2003-02-25 20:25:12 +0000239
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000240 /* auto-thread-state API, if available */
241#ifdef WITH_THREAD
242 _PyGILState_Init(interp, tstate);
243#endif /* WITH_THREAD */
244
Mark Hammondedd07732003-07-15 23:03:55 +0000245 warnings_module = PyImport_ImportModule("warnings");
246 if (!warnings_module)
247 PyErr_Clear();
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000248
249#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
250 /* On Unix, set the file system encoding according to the
251 user's preference, if the CODESET names a well-known
252 Python codec, and Py_FileSystemDefaultEncoding isn't
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000253 initialized by other means. Also set the encoding of
254 stdin and stdout if these are terminals. */
255
Martin v. Löwisf56d0152003-11-13 07:43:21 +0000256 saved_locale = strdup(setlocale(LC_CTYPE, NULL));
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000257 setlocale(LC_CTYPE, "");
258 codeset = nl_langinfo(CODESET);
259 if (codeset && *codeset) {
260 PyObject *enc = PyCodec_Encoder(codeset);
261 if (enc) {
262 codeset = strdup(codeset);
263 Py_DECREF(enc);
264 } else {
265 codeset = NULL;
266 PyErr_Clear();
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000267 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000268 } else
269 codeset = NULL;
270 setlocale(LC_CTYPE, saved_locale);
Martin v. Löwisf56d0152003-11-13 07:43:21 +0000271 free(saved_locale);
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000272
273 if (codeset) {
Michael W. Hudson68debc92003-08-11 12:20:24 +0000274 sys_stream = PySys_GetObject("stdin");
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000275 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
276 if (!sys_isatty)
277 PyErr_Clear();
Thomas Woutersafea5292007-01-23 13:42:00 +0000278 if(sys_isatty && PyObject_IsTrue(sys_isatty) &&
279 PyFile_Check(sys_stream)) {
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000280 if (!PyFile_SetEncoding(sys_stream, codeset))
281 Py_FatalError("Cannot set codeset of stdin");
282 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000283 Py_XDECREF(sys_isatty);
284
285 sys_stream = PySys_GetObject("stdout");
286 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
287 if (!sys_isatty)
288 PyErr_Clear();
Thomas Woutersafea5292007-01-23 13:42:00 +0000289 if(sys_isatty && PyObject_IsTrue(sys_isatty) &&
290 PyFile_Check(sys_stream)) {
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000291 if (!PyFile_SetEncoding(sys_stream, codeset))
292 Py_FatalError("Cannot set codeset of stdout");
293 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000294 Py_XDECREF(sys_isatty);
295
Martin v. Löwisea62d252006-04-03 10:56:49 +0000296 sys_stream = PySys_GetObject("stderr");
297 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
298 if (!sys_isatty)
299 PyErr_Clear();
Thomas Woutersafea5292007-01-23 13:42:00 +0000300 if(sys_isatty && PyObject_IsTrue(sys_isatty) &&
301 PyFile_Check(sys_stream)) {
Martin v. Löwisea62d252006-04-03 10:56:49 +0000302 if (!PyFile_SetEncoding(sys_stream, codeset))
303 Py_FatalError("Cannot set codeset of stderr");
304 }
305 Py_XDECREF(sys_isatty);
306
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000307 if (!Py_FileSystemDefaultEncoding)
308 Py_FileSystemDefaultEncoding = codeset;
309 else
310 free(codeset);
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000311 }
312#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000313}
314
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000315void
316Py_Initialize(void)
317{
318 Py_InitializeEx(1);
319}
320
321
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000322#ifdef COUNT_ALLOCS
Martin v. Löwis45294a92006-04-18 06:24:08 +0000323extern void dump_counts(FILE*);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000324#endif
325
Guido van Rossum25ce5661997-08-02 03:10:38 +0000326/* Undo the effect of Py_Initialize().
327
328 Beware: if multiple interpreter and/or thread states exist, these
329 are not wiped out; only the current thread and interpreter state
330 are deleted. But since everything else is deleted, those other
331 interpreter and thread states should no longer be used.
332
333 (XXX We should do better, e.g. wipe out all interpreters and
334 threads.)
335
336 Locking: as above.
337
338*/
339
340void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000341Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000342{
343 PyInterpreterState *interp;
344 PyThreadState *tstate;
345
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000346 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000347 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000348
Tim Peters384fd102001-01-21 03:40:37 +0000349 /* The interpreter is still entirely intact at this point, and the
350 * exit funcs may be relying on that. In particular, if some thread
351 * or exit func is still waiting to do an import, the import machinery
352 * expects Py_IsInitialized() to return true. So don't say the
353 * interpreter is uninitialized until after the exit funcs have run.
354 * Note that Threading.py uses an exit func to do a join on all the
355 * threads created thru it, so this also protects pending imports in
356 * the threads created via Threading.
357 */
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000358 call_sys_exitfunc();
Tim Peters384fd102001-01-21 03:40:37 +0000359 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000360
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000361 /* Get current thread state and interpreter pointer */
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000362 tstate = PyThreadState_GET();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000363 interp = tstate->interp;
364
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000365 /* Disable signal handling */
366 PyOS_FiniInterrupts();
367
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000368 /* drop module references we saved */
Mark Hammondedd07732003-07-15 23:03:55 +0000369 Py_XDECREF(warnings_module);
370 warnings_module = NULL;
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000371
Guido van Rossume13ddc92003-04-17 17:29:22 +0000372 /* Collect garbage. This may call finalizers; it's nice to call these
Tim Peters1d7323e2003-12-01 21:35:27 +0000373 * before all modules are destroyed.
374 * XXX If a __del__ or weakref callback is triggered here, and tries to
375 * XXX import a module, bad things can happen, because Python no
376 * XXX longer believes it's initialized.
377 * XXX Fatal Python error: Interpreter not initialized (version mismatch?)
378 * XXX is easy to provoke that way. I've also seen, e.g.,
379 * XXX Exception exceptions.ImportError: 'No module named sha'
380 * XXX in <function callback at 0x008F5718> ignored
381 * XXX but I'm unclear on exactly how that one happens. In any case,
382 * XXX I haven't seen a real-life report of either of these.
Neal Norwitz9589ee22006-03-04 19:01:22 +0000383 */
Guido van Rossume13ddc92003-04-17 17:29:22 +0000384 PyGC_Collect();
Martin v. Löwis45294a92006-04-18 06:24:08 +0000385#ifdef COUNT_ALLOCS
386 /* With COUNT_ALLOCS, it helps to run GC multiple times:
387 each collection might release some types from the type
388 list, so they become garbage. */
389 while (PyGC_Collect() > 0)
390 /* nothing */;
391#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000392
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000393 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000394 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000395
Guido van Rossume13ddc92003-04-17 17:29:22 +0000396 /* Collect final garbage. This disposes of cycles created by
Tim Peters1d7323e2003-12-01 21:35:27 +0000397 * new-style class definitions, for example.
398 * XXX This is disabled because it caused too many problems. If
399 * XXX a __del__ or weakref callback triggers here, Python code has
400 * XXX a hard time running, because even the sys module has been
401 * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
402 * XXX One symptom is a sequence of information-free messages
403 * XXX coming from threads (if a __del__ or callback is invoked,
404 * XXX other threads can execute too, and any exception they encounter
405 * XXX triggers a comedy of errors as subsystem after subsystem
406 * XXX fails to find what it *expects* to find in sys to help report
407 * XXX the exception and consequent unexpected failures). I've also
408 * XXX seen segfaults then, after adding print statements to the
409 * XXX Python code getting called.
410 */
411#if 0
Guido van Rossume13ddc92003-04-17 17:29:22 +0000412 PyGC_Collect();
Tim Peters1d7323e2003-12-01 21:35:27 +0000413#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000414
Guido van Rossum1707aad1997-12-08 23:43:45 +0000415 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
416 _PyImport_Fini();
417
418 /* Debugging stuff */
419#ifdef COUNT_ALLOCS
Martin v. Löwis45294a92006-04-18 06:24:08 +0000420 dump_counts(stdout);
Guido van Rossum1707aad1997-12-08 23:43:45 +0000421#endif
422
Tim Peters62e97f02006-03-28 21:44:32 +0000423 PRINT_TOTAL_REFS();
Guido van Rossum1707aad1997-12-08 23:43:45 +0000424
Tim Peters9cf25ce2003-04-17 15:21:01 +0000425#ifdef Py_TRACE_REFS
426 /* Display all objects still alive -- this can invoke arbitrary
427 * __repr__ overrides, so requires a mostly-intact interpreter.
428 * Alas, a lot of stuff may still be alive now that will be cleaned
429 * up later.
430 */
Tim Peters269b2a62003-04-17 19:52:29 +0000431 if (Py_GETENV("PYTHONDUMPREFS"))
Tim Peters9cf25ce2003-04-17 15:21:01 +0000432 _Py_PrintReferences(stderr);
Tim Peters9cf25ce2003-04-17 15:21:01 +0000433#endif /* Py_TRACE_REFS */
434
Mark Hammond6cb90292003-04-22 11:18:00 +0000435 /* Cleanup auto-thread-state */
436#ifdef WITH_THREAD
437 _PyGILState_Fini();
438#endif /* WITH_THREAD */
439
Guido van Rossumd922fa42003-04-15 14:10:09 +0000440 /* Clear interpreter state */
Barry Warsawf242aa02000-05-25 23:09:49 +0000441 PyInterpreterState_Clear(interp);
Guido van Rossumd922fa42003-04-15 14:10:09 +0000442
Anthony Baxter12b6f6c2005-03-29 13:36:16 +0000443 /* Now we decref the exception classes. After this point nothing
444 can raise an exception. That's okay, because each Fini() method
445 below has been checked to make sure no exceptions are ever
446 raised.
447 */
448
449 _PyExc_Fini();
450
Guido van Rossumd922fa42003-04-15 14:10:09 +0000451 /* Delete current thread */
Barry Warsawf242aa02000-05-25 23:09:49 +0000452 PyThreadState_Swap(NULL);
453 PyInterpreterState_Delete(interp);
454
Guido van Rossumd922fa42003-04-15 14:10:09 +0000455 /* Sundry finalizers */
Guido van Rossumcc283f51997-08-05 02:22:03 +0000456 PyMethod_Fini();
457 PyFrame_Fini();
458 PyCFunction_Fini();
459 PyTuple_Fini();
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000460 PyList_Fini();
Raymond Hettingerd7946662005-08-01 21:39:29 +0000461 PySet_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000462 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000463 PyInt_Fini();
464 PyFloat_Fini();
465
Marc-André Lemburg95de5c12002-04-08 08:19:36 +0000466#ifdef Py_USING_UNICODE
467 /* Cleanup Unicode implementation */
468 _PyUnicode_Fini();
469#endif
470
Guido van Rossumcc283f51997-08-05 02:22:03 +0000471 /* XXX Still allocated:
472 - various static ad-hoc pointers to interned strings
473 - int and float free list blocks
474 - whatever various modules and libraries allocate
475 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000476
477 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000478
Tim Peters269b2a62003-04-17 19:52:29 +0000479#ifdef Py_TRACE_REFS
480 /* Display addresses (& refcnts) of all objects still alive.
481 * An address can be used to find the repr of the object, printed
482 * above by _Py_PrintReferences.
483 */
484 if (Py_GETENV("PYTHONDUMPREFS"))
485 _Py_PrintReferenceAddresses(stderr);
486#endif /* Py_TRACE_REFS */
Tim Peters0e871182002-04-13 08:29:14 +0000487#ifdef PYMALLOC_DEBUG
488 if (Py_GETENV("PYTHONMALLOCSTATS"))
489 _PyObject_DebugMallocStats();
490#endif
491
Guido van Rossumcc283f51997-08-05 02:22:03 +0000492 call_ll_exitfuncs();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000493}
494
495/* Create and initialize a new interpreter and thread, and return the
496 new thread. This requires that Py_Initialize() has been called
497 first.
498
499 Unsuccessful initialization yields a NULL pointer. Note that *no*
500 exception information is available even in this case -- the
501 exception information is held in the thread, and there is no
502 thread.
503
504 Locking: as above.
505
506*/
507
508PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000509Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000510{
511 PyInterpreterState *interp;
512 PyThreadState *tstate, *save_tstate;
513 PyObject *bimod, *sysmod;
514
515 if (!initialized)
516 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
517
518 interp = PyInterpreterState_New();
519 if (interp == NULL)
520 return NULL;
521
522 tstate = PyThreadState_New(interp);
523 if (tstate == NULL) {
524 PyInterpreterState_Delete(interp);
525 return NULL;
526 }
527
528 save_tstate = PyThreadState_Swap(tstate);
529
530 /* XXX The following is lax in error checking */
531
532 interp->modules = PyDict_New();
533
534 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
535 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000536 interp->builtins = PyModule_GetDict(bimod);
Neal Norwitz0c6ae5b2006-08-21 20:16:24 +0000537 if (interp->builtins == NULL)
538 goto handle_error;
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000539 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000540 }
541 sysmod = _PyImport_FindExtension("sys", "sys");
542 if (bimod != NULL && sysmod != NULL) {
543 interp->sysdict = PyModule_GetDict(sysmod);
Neal Norwitz0c6ae5b2006-08-21 20:16:24 +0000544 if (interp->sysdict == NULL)
545 goto handle_error;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000546 Py_INCREF(interp->sysdict);
547 PySys_SetPath(Py_GetPath());
548 PyDict_SetItemString(interp->sysdict, "modules",
549 interp->modules);
Martin v. Löwisd7ceb222003-01-22 09:00:38 +0000550 _PyImportHooks_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000551 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000552 if (!Py_NoSiteFlag)
553 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000554 }
555
556 if (!PyErr_Occurred())
557 return tstate;
558
Neal Norwitz0c6ae5b2006-08-21 20:16:24 +0000559handle_error:
Guido van Rossum25ce5661997-08-02 03:10:38 +0000560 /* Oops, it didn't work. Undo it all. */
561
562 PyErr_Print();
563 PyThreadState_Clear(tstate);
564 PyThreadState_Swap(save_tstate);
565 PyThreadState_Delete(tstate);
566 PyInterpreterState_Delete(interp);
567
568 return NULL;
569}
570
571/* Delete an interpreter and its last thread. This requires that the
572 given thread state is current, that the thread has no remaining
573 frames, and that it is its interpreter's only remaining thread.
574 It is a fatal error to violate these constraints.
575
576 (Py_Finalize() doesn't have these constraints -- it zaps
577 everything, regardless.)
578
579 Locking: as above.
580
581*/
582
583void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000584Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000585{
586 PyInterpreterState *interp = tstate->interp;
587
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000588 if (tstate != PyThreadState_GET())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000589 Py_FatalError("Py_EndInterpreter: thread is not current");
590 if (tstate->frame != NULL)
591 Py_FatalError("Py_EndInterpreter: thread still has a frame");
592 if (tstate != interp->tstate_head || tstate->next != NULL)
593 Py_FatalError("Py_EndInterpreter: not the last thread");
594
595 PyImport_Cleanup();
596 PyInterpreterState_Clear(interp);
597 PyThreadState_Swap(NULL);
598 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000599}
600
601static char *progname = "python";
602
603void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000604Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000605{
606 if (pn && *pn)
607 progname = pn;
608}
609
610char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000611Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000612{
613 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000614}
615
Guido van Rossuma61691e1998-02-06 22:27:24 +0000616static char *default_home = NULL;
617
618void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000619Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000620{
621 default_home = home;
622}
623
624char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000625Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000626{
627 char *home = default_home;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000628 if (home == NULL && !Py_IgnoreEnvironmentFlag)
629 home = Py_GETENV("PYTHONHOME");
Guido van Rossuma61691e1998-02-06 22:27:24 +0000630 return home;
631}
632
Guido van Rossum6135a871995-01-09 17:53:26 +0000633/* Create __main__ module */
634
635static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000636initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000637{
Guido van Rossum82598051997-03-05 00:20:32 +0000638 PyObject *m, *d;
639 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000640 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000641 Py_FatalError("can't create __main__ module");
642 d = PyModule_GetDict(m);
643 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000644 PyObject *bimod = PyImport_ImportModule("__builtin__");
645 if (bimod == NULL ||
646 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000647 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000648 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000649 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000650}
651
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000652/* Import the site module (not into __main__ though) */
653
654static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000655initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000656{
657 PyObject *m, *f;
658 m = PyImport_ImportModule("site");
659 if (m == NULL) {
660 f = PySys_GetObject("stderr");
661 if (Py_VerboseFlag) {
662 PyFile_WriteString(
663 "'import site' failed; traceback:\n", f);
664 PyErr_Print();
665 }
666 else {
667 PyFile_WriteString(
668 "'import site' failed; use -v for traceback\n", f);
669 PyErr_Clear();
670 }
671 }
672 else {
673 Py_DECREF(m);
674 }
675}
676
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677/* Parse input from a file and execute it */
678
679int
Tim Peters5e9d6cf2006-05-28 10:41:29 +0000680PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000681 PyCompilerFlags *flags)
682{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000683 if (filename == NULL)
684 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000685 if (Py_FdIsInteractive(fp, filename)) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000686 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000687 if (closeit)
688 fclose(fp);
689 return err;
690 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000691 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000692 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000693}
694
695int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000696PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000697{
Guido van Rossum82598051997-03-05 00:20:32 +0000698 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000699 int ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000700 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000701
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000702 if (flags == NULL) {
703 flags = &local_flags;
Tim Peters5ba58662001-07-16 02:29:45 +0000704 local_flags.cf_flags = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000705 }
Guido van Rossum82598051997-03-05 00:20:32 +0000706 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000707 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000708 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
709 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000710 }
Guido van Rossum82598051997-03-05 00:20:32 +0000711 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000712 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000713 PySys_SetObject("ps2", v = PyString_FromString("... "));
714 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000715 }
716 for (;;) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000717 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
Tim Peters62e97f02006-03-28 21:44:32 +0000718 PRINT_TOTAL_REFS();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000719 if (ret == E_EOF)
720 return 0;
721 /*
722 if (ret == E_NOMEM)
723 return -1;
724 */
725 }
726}
727
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000728/* compute parser flags based on compiler flags */
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000729#define PARSER_FLAGS(flags) \
Thomas Wouters34aa7ba2006-02-28 19:02:24 +0000730 ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
Neal Norwitzca460d92006-09-06 06:28:06 +0000731 PyPARSE_DONT_IMPLY_DEDENT : 0)) : 0)
732
733#if 0
734/* Keep an example of flags with future keyword support. */
735#define PARSER_FLAGS(flags) \
736 ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
Thomas Wouters34aa7ba2006-02-28 19:02:24 +0000737 PyPARSE_DONT_IMPLY_DEDENT : 0) \
Neal Norwitz9589ee22006-03-04 19:01:22 +0000738 | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \
739 PyPARSE_WITH_IS_KEYWORD : 0)) : 0)
Neal Norwitzca460d92006-09-06 06:28:06 +0000740#endif
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000741
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000742int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000743PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000744{
Guido van Rossum82598051997-03-05 00:20:32 +0000745 PyObject *m, *d, *v, *w;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +0000747 PyArena *arena;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000748 char *ps1 = "", *ps2 = "";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000749 int errcode = 0;
Tim Petersfe2127d2001-07-16 05:37:24 +0000750
Guido van Rossum82598051997-03-05 00:20:32 +0000751 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000752 if (v != NULL) {
753 v = PyObject_Str(v);
754 if (v == NULL)
755 PyErr_Clear();
756 else if (PyString_Check(v))
757 ps1 = PyString_AsString(v);
758 }
Guido van Rossum82598051997-03-05 00:20:32 +0000759 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000760 if (w != NULL) {
761 w = PyObject_Str(w);
762 if (w == NULL)
763 PyErr_Clear();
764 else if (PyString_Check(w))
765 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000766 }
Neal Norwitz9589ee22006-03-04 19:01:22 +0000767 arena = PyArena_New();
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000768 if (arena == NULL) {
769 Py_XDECREF(v);
770 Py_XDECREF(w);
771 return -1;
772 }
Tim Peters5e9d6cf2006-05-28 10:41:29 +0000773 mod = PyParser_ASTFromFile(fp, filename,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000774 Py_single_input, ps1, ps2,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000775 flags, &errcode, arena);
Guido van Rossum82598051997-03-05 00:20:32 +0000776 Py_XDECREF(v);
777 Py_XDECREF(w);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +0000779 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 if (errcode == E_EOF) {
781 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000782 return E_EOF;
783 }
Guido van Rossum82598051997-03-05 00:20:32 +0000784 PyErr_Print();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000785 return -1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000786 }
Guido van Rossum82598051997-03-05 00:20:32 +0000787 m = PyImport_AddModule("__main__");
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000788 if (m == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +0000789 PyArena_Free(arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000790 return -1;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000791 }
Guido van Rossum82598051997-03-05 00:20:32 +0000792 d = PyModule_GetDict(m);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000793 v = run_mod(mod, filename, d, d, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +0000794 PyArena_Free(arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000795 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000796 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000797 return -1;
798 }
Guido van Rossum82598051997-03-05 00:20:32 +0000799 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000800 if (Py_FlushLine())
801 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000802 return 0;
803}
804
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000805/* Check whether a file maybe a pyc file: Look at the extension,
806 the file type, and, if we may close it, at the first few bytes. */
807
808static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000809maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000810{
811 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
812 return 1;
813
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000814 /* Only look into the file if we are allowed to close it, since
815 it then should also be seekable. */
816 if (closeit) {
817 /* Read only two bytes of the magic. If the file was opened in
818 text mode, the bytes 3 and 4 of the magic (\r\n) might not
819 be read as they are on disk. */
820 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
821 unsigned char buf[2];
Tim Peters3e876562001-02-11 04:35:39 +0000822 /* Mess: In case of -x, the stream is NOT at its start now,
823 and ungetc() was used to push back the first newline,
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000824 which makes the current stream position formally undefined,
825 and a x-platform nightmare.
826 Unfortunately, we have no direct way to know whether -x
827 was specified. So we use a terrible hack: if the current
828 stream position is not 0, we assume -x was specified, and
829 give up. Bug 132850 on SourceForge spells out the
830 hopelessness of trying anything else (fseek and ftell
831 don't work predictably x-platform for text-mode files).
Tim Peters3e876562001-02-11 04:35:39 +0000832 */
Tim Peters3e876562001-02-11 04:35:39 +0000833 int ispyc = 0;
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000834 if (ftell(fp) == 0) {
835 if (fread(buf, 1, 2, fp) == 2 &&
Tim Petersd08e3822003-04-17 15:24:21 +0000836 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000837 ispyc = 1;
838 rewind(fp);
839 }
Tim Peters3e876562001-02-11 04:35:39 +0000840 return ispyc;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000841 }
842 return 0;
Tim Petersd08e3822003-04-17 15:24:21 +0000843}
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000844
Guido van Rossum0df002c2000-08-27 19:21:52 +0000845int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000846PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000847 PyCompilerFlags *flags)
848{
Guido van Rossum82598051997-03-05 00:20:32 +0000849 PyObject *m, *d, *v;
Martin v. Löwis95292d62002-12-11 14:04:59 +0000850 const char *ext;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000851
Guido van Rossum82598051997-03-05 00:20:32 +0000852 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000853 if (m == NULL)
854 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000855 d = PyModule_GetDict(m);
Fred Drake8ed02042002-10-17 21:24:58 +0000856 if (PyDict_GetItemString(d, "__file__") == NULL) {
857 PyObject *f = PyString_FromString(filename);
858 if (f == NULL)
859 return -1;
860 if (PyDict_SetItemString(d, "__file__", f) < 0) {
861 Py_DECREF(f);
862 return -1;
863 }
864 Py_DECREF(f);
865 }
Guido van Rossumfdef2711994-09-14 13:31:04 +0000866 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000867 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000868 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000869 if (closeit)
870 fclose(fp);
Fred Drake8ed02042002-10-17 21:24:58 +0000871 if ((fp = fopen(filename, "rb")) == NULL) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000872 fprintf(stderr, "python: Can't reopen .pyc file\n");
873 return -1;
874 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000875 /* Turn on optimization if a .pyo file is given */
876 if (strcmp(ext, ".pyo") == 0)
877 Py_OptimizeFlag = 1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000878 v = run_pyc_file(fp, filename, d, d, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000879 } else {
Tim Petersd08e3822003-04-17 15:24:21 +0000880 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000881 closeit, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000882 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000883 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000884 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000885 return -1;
886 }
Guido van Rossum82598051997-03-05 00:20:32 +0000887 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000888 if (Py_FlushLine())
889 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000890 return 0;
891}
892
893int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000894PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
Guido van Rossum393661d2001-08-31 17:40:15 +0000895{
Guido van Rossum82598051997-03-05 00:20:32 +0000896 PyObject *m, *d, *v;
897 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000898 if (m == NULL)
899 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000900 d = PyModule_GetDict(m);
Guido van Rossum393661d2001-08-31 17:40:15 +0000901 v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000902 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000903 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000904 return -1;
905 }
Guido van Rossum82598051997-03-05 00:20:32 +0000906 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000907 if (Py_FlushLine())
908 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000909 return 0;
910}
911
Barry Warsaw035574d1997-08-29 22:07:17 +0000912static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000913parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
914 int *lineno, int *offset, const char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000915{
916 long hold;
917 PyObject *v;
918
919 /* old style errors */
920 if (PyTuple_Check(err))
Neal Norwitz78293352002-04-01 01:41:20 +0000921 return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
Neal Norwitz9589ee22006-03-04 19:01:22 +0000922 lineno, offset, text);
Barry Warsaw035574d1997-08-29 22:07:17 +0000923
924 /* new style errors. `err' is an instance */
925
926 if (! (v = PyObject_GetAttrString(err, "msg")))
927 goto finally;
928 *message = v;
929
930 if (!(v = PyObject_GetAttrString(err, "filename")))
931 goto finally;
932 if (v == Py_None)
933 *filename = NULL;
934 else if (! (*filename = PyString_AsString(v)))
935 goto finally;
936
937 Py_DECREF(v);
938 if (!(v = PyObject_GetAttrString(err, "lineno")))
939 goto finally;
940 hold = PyInt_AsLong(v);
941 Py_DECREF(v);
942 v = NULL;
943 if (hold < 0 && PyErr_Occurred())
944 goto finally;
945 *lineno = (int)hold;
946
947 if (!(v = PyObject_GetAttrString(err, "offset")))
948 goto finally;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000949 if (v == Py_None) {
950 *offset = -1;
951 Py_DECREF(v);
952 v = NULL;
953 } else {
954 hold = PyInt_AsLong(v);
955 Py_DECREF(v);
956 v = NULL;
957 if (hold < 0 && PyErr_Occurred())
958 goto finally;
959 *offset = (int)hold;
960 }
Barry Warsaw035574d1997-08-29 22:07:17 +0000961
962 if (!(v = PyObject_GetAttrString(err, "text")))
963 goto finally;
964 if (v == Py_None)
965 *text = NULL;
966 else if (! (*text = PyString_AsString(v)))
967 goto finally;
968 Py_DECREF(v);
969 return 1;
970
971finally:
972 Py_XDECREF(v);
973 return 0;
974}
975
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000976void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000977PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000978{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000979 PyErr_PrintEx(1);
980}
981
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000982static void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000983print_error_text(PyObject *f, int offset, const char *text)
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000984{
985 char *nl;
986 if (offset >= 0) {
987 if (offset > 0 && offset == (int)strlen(text))
988 offset--;
989 for (;;) {
990 nl = strchr(text, '\n');
991 if (nl == NULL || nl-text >= offset)
992 break;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000993 offset -= (int)(nl+1-text);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000994 text = nl+1;
995 }
996 while (*text == ' ' || *text == '\t') {
997 text++;
998 offset--;
999 }
1000 }
1001 PyFile_WriteString(" ", f);
1002 PyFile_WriteString(text, f);
1003 if (*text == '\0' || text[strlen(text)-1] != '\n')
1004 PyFile_WriteString("\n", f);
1005 if (offset == -1)
1006 return;
1007 PyFile_WriteString(" ", f);
1008 offset--;
1009 while (offset > 0) {
1010 PyFile_WriteString(" ", f);
1011 offset--;
1012 }
1013 PyFile_WriteString("^\n", f);
1014}
1015
Guido van Rossum66e8e862001-03-23 17:54:43 +00001016static void
1017handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001018{
Neal Norwitz9589ee22006-03-04 19:01:22 +00001019 PyObject *exception, *value, *tb;
1020 int exitcode = 0;
Tim Peterscf615b52003-04-19 18:47:02 +00001021
Guido van Rossum66e8e862001-03-23 17:54:43 +00001022 PyErr_Fetch(&exception, &value, &tb);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001023 if (Py_FlushLine())
1024 PyErr_Clear();
1025 fflush(stdout);
1026 if (value == NULL || value == Py_None)
Tim Peterscf615b52003-04-19 18:47:02 +00001027 goto done;
Brett Cannonbf364092006-03-01 04:25:17 +00001028 if (PyExceptionInstance_Check(value)) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001029 /* The error code should be in the `code' attribute. */
1030 PyObject *code = PyObject_GetAttrString(value, "code");
1031 if (code) {
1032 Py_DECREF(value);
1033 value = code;
1034 if (value == Py_None)
Tim Peterscf615b52003-04-19 18:47:02 +00001035 goto done;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001036 }
1037 /* If we failed to dig out the 'code' attribute,
1038 just let the else clause below print the error. */
1039 }
1040 if (PyInt_Check(value))
Tim Peterscf615b52003-04-19 18:47:02 +00001041 exitcode = (int)PyInt_AsLong(value);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001042 else {
1043 PyObject_Print(value, stderr, Py_PRINT_RAW);
1044 PySys_WriteStderr("\n");
Tim Peterscf615b52003-04-19 18:47:02 +00001045 exitcode = 1;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001046 }
Tim Peterscf615b52003-04-19 18:47:02 +00001047 done:
Neal Norwitz9589ee22006-03-04 19:01:22 +00001048 /* Restore and clear the exception info, in order to properly decref
1049 * the exception, value, and traceback. If we just exit instead,
1050 * these leak, which confuses PYTHONDUMPREFS output, and may prevent
1051 * some finalizers from running.
1052 */
Tim Peterscf615b52003-04-19 18:47:02 +00001053 PyErr_Restore(exception, value, tb);
1054 PyErr_Clear();
1055 Py_Exit(exitcode);
1056 /* NOTREACHED */
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001057}
1058
1059void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001060PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +00001061{
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001062 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001063
1064 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1065 handle_system_exit();
1066 }
Guido van Rossum82598051997-03-05 00:20:32 +00001067 PyErr_Fetch(&exception, &v, &tb);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068 if (exception == NULL)
1069 return;
Barry Warsaw035574d1997-08-29 22:07:17 +00001070 PyErr_NormalizeException(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001071 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +00001072 return;
Guido van Rossum9d785502006-03-07 18:31:44 +00001073 /* Now we know v != NULL too */
Guido van Rossuma61691e1998-02-06 22:27:24 +00001074 if (set_sys_last_vars) {
1075 PySys_SetObject("last_type", exception);
1076 PySys_SetObject("last_value", v);
1077 PySys_SetObject("last_traceback", tb);
1078 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001079 hook = PySys_GetObject("excepthook");
1080 if (hook) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001081 PyObject *args = PyTuple_Pack(3,
Guido van Rossum9d785502006-03-07 18:31:44 +00001082 exception, v, tb ? tb : Py_None);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001083 PyObject *result = PyEval_CallObject(hook, args);
1084 if (result == NULL) {
1085 PyObject *exception2, *v2, *tb2;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001086 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1087 handle_system_exit();
1088 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001089 PyErr_Fetch(&exception2, &v2, &tb2);
1090 PyErr_NormalizeException(&exception2, &v2, &tb2);
Neal Norwitza5e4f222006-07-17 00:59:04 +00001091 /* It should not be possible for exception2 or v2
1092 to be NULL. However PyErr_Display() can't
1093 tolerate NULLs, so just be safe. */
1094 if (exception2 == NULL) {
1095 exception2 = Py_None;
1096 Py_INCREF(exception2);
1097 }
1098 if (v2 == NULL) {
1099 v2 = Py_None;
1100 Py_INCREF(v2);
1101 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001102 if (Py_FlushLine())
1103 PyErr_Clear();
1104 fflush(stdout);
1105 PySys_WriteStderr("Error in sys.excepthook:\n");
1106 PyErr_Display(exception2, v2, tb2);
1107 PySys_WriteStderr("\nOriginal exception was:\n");
1108 PyErr_Display(exception, v, tb);
Neal Norwitza5e4f222006-07-17 00:59:04 +00001109 Py_DECREF(exception2);
1110 Py_DECREF(v2);
Jeremy Hylton07028582001-12-07 15:35:35 +00001111 Py_XDECREF(tb2);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001112 }
1113 Py_XDECREF(result);
1114 Py_XDECREF(args);
1115 } else {
1116 PySys_WriteStderr("sys.excepthook is missing\n");
1117 PyErr_Display(exception, v, tb);
1118 }
1119 Py_XDECREF(exception);
1120 Py_XDECREF(v);
1121 Py_XDECREF(tb);
1122}
1123
Richard Jones7b9558d2006-05-27 12:29:24 +00001124void
1125PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001126{
1127 int err = 0;
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001128 PyObject *f = PySys_GetObject("stderr");
Armin Rigo5d2c6832004-03-22 20:16:58 +00001129 Py_INCREF(value);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001130 if (f == NULL)
1131 fprintf(stderr, "lost sys.stderr\n");
1132 else {
Guido van Rossum0829c751998-02-28 04:31:39 +00001133 if (Py_FlushLine())
1134 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001135 fflush(stdout);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001136 if (tb && tb != Py_None)
1137 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +00001138 if (err == 0 &&
Armin Rigo5d2c6832004-03-22 20:16:58 +00001139 PyObject_HasAttrString(value, "print_file_and_line"))
Barry Warsaw36b8f941997-08-26 18:09:48 +00001140 {
Guido van Rossum82598051997-03-05 00:20:32 +00001141 PyObject *message;
Martin v. Löwis95292d62002-12-11 14:04:59 +00001142 const char *filename, *text;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001143 int lineno, offset;
Armin Rigo5d2c6832004-03-22 20:16:58 +00001144 if (!parse_syntax_error(value, &message, &filename,
Barry Warsaw035574d1997-08-29 22:07:17 +00001145 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +00001146 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001147 else {
1148 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +00001149 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001150 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +00001151 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001152 else
Guido van Rossum82598051997-03-05 00:20:32 +00001153 PyFile_WriteString(filename, f);
1154 PyFile_WriteString("\", line ", f);
Jeremy Hylton518ab1c2001-11-28 20:42:20 +00001155 PyOS_snprintf(buf, sizeof(buf), "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +00001156 PyFile_WriteString(buf, f);
1157 PyFile_WriteString("\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001158 if (text != NULL)
1159 print_error_text(f, offset, text);
Armin Rigo5d2c6832004-03-22 20:16:58 +00001160 Py_DECREF(value);
1161 value = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001162 /* Can't be bothered to check all those
1163 PyFile_WriteString() calls */
1164 if (PyErr_Occurred())
1165 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001166 }
1167 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001168 if (err) {
1169 /* Don't do anything else */
1170 }
Brett Cannonbf364092006-03-01 04:25:17 +00001171 else if (PyExceptionClass_Check(exception)) {
Richard Jones7b9558d2006-05-27 12:29:24 +00001172 PyObject* moduleName;
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001173 char* className = PyExceptionClass_Name(exception);
1174 if (className != NULL) {
1175 char *dot = strrchr(className, '.');
1176 if (dot != NULL)
1177 className = dot+1;
1178 }
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001179
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001180 moduleName = PyObject_GetAttrString(exception, "__module__");
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001181 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001182 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001183 else {
1184 char* modstr = PyString_AsString(moduleName);
Tim Petersd08e3822003-04-17 15:24:21 +00001185 if (modstr && strcmp(modstr, "exceptions"))
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001186 {
1187 err = PyFile_WriteString(modstr, f);
1188 err += PyFile_WriteString(".", f);
1189 }
Richard Jones7b9558d2006-05-27 12:29:24 +00001190 Py_DECREF(moduleName);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001191 }
1192 if (err == 0) {
1193 if (className == NULL)
1194 err = PyFile_WriteString("<unknown>", f);
1195 else
Brett Cannonbf364092006-03-01 04:25:17 +00001196 err = PyFile_WriteString(className, f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001197 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001198 }
1199 else
1200 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
Brett Cannon2e63b732006-03-02 18:34:57 +00001201 if (err == 0 && (value != Py_None)) {
1202 PyObject *s = PyObject_Str(value);
1203 /* only print colon if the str() of the
1204 object is not the empty string
1205 */
1206 if (s == NULL)
1207 err = -1;
1208 else if (!PyString_Check(s) ||
1209 PyString_GET_SIZE(s) != 0)
1210 err = PyFile_WriteString(": ", f);
1211 if (err == 0)
1212 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1213 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +00001214 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001215 if (err == 0)
1216 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001217 }
Armin Rigo5d2c6832004-03-22 20:16:58 +00001218 Py_DECREF(value);
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001219 /* If an error happened here, don't show it.
1220 XXX This is wrong, but too many callers rely on this behavior. */
1221 if (err != 0)
1222 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001223}
1224
Guido van Rossum82598051997-03-05 00:20:32 +00001225PyObject *
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001226PyRun_StringFlags(const char *str, int start, PyObject *globals,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001228{
Neal Norwitze92fba02006-03-04 18:52:26 +00001229 PyObject *ret = NULL;
Neal Norwitzd12bd012006-07-21 07:59:47 +00001230 mod_ty mod;
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001231 PyArena *arena = PyArena_New();
Neal Norwitzd12bd012006-07-21 07:59:47 +00001232 if (arena == NULL)
1233 return NULL;
1234
1235 mod = PyParser_ASTFromString(str, "<string>", start, flags, arena);
Neal Norwitze92fba02006-03-04 18:52:26 +00001236 if (mod != NULL)
1237 ret = run_mod(mod, "<string>", globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001238 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001239 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001240}
1241
1242PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001243PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001244 PyObject *locals, int closeit, PyCompilerFlags *flags)
1245{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246 PyObject *ret;
Neal Norwitzd12bd012006-07-21 07:59:47 +00001247 mod_ty mod;
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001248 PyArena *arena = PyArena_New();
Neal Norwitzd12bd012006-07-21 07:59:47 +00001249 if (arena == NULL)
1250 return NULL;
1251
1252 mod = PyParser_ASTFromFile(fp, filename, start, 0, 0,
1253 flags, NULL, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001254 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001255 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001257 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001258 if (closeit)
1259 fclose(fp);
Neal Norwitze92fba02006-03-04 18:52:26 +00001260 ret = run_mod(mod, filename, globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001261 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001262 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001263}
1264
Guido van Rossum82598051997-03-05 00:20:32 +00001265static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001267 PyCompilerFlags *flags, PyArena *arena)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001268{
Guido van Rossum82598051997-03-05 00:20:32 +00001269 PyCodeObject *co;
1270 PyObject *v;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001271 co = PyAST_Compile(mod, filename, flags, arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001272 if (co == NULL)
1273 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001274 v = PyEval_EvalCode(co, globals, locals);
1275 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001276 return v;
1277}
1278
Guido van Rossum82598051997-03-05 00:20:32 +00001279static PyObject *
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001280run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001281 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001282{
Guido van Rossum82598051997-03-05 00:20:32 +00001283 PyCodeObject *co;
1284 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001285 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001286 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001287
Guido van Rossum82598051997-03-05 00:20:32 +00001288 magic = PyMarshal_ReadLongFromFile(fp);
1289 if (magic != PyImport_GetMagicNumber()) {
1290 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001291 "Bad magic number in .pyc file");
1292 return NULL;
1293 }
Guido van Rossum82598051997-03-05 00:20:32 +00001294 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001295 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001296 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001297 if (v == NULL || !PyCode_Check(v)) {
1298 Py_XDECREF(v);
1299 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001300 "Bad code object in .pyc file");
1301 return NULL;
1302 }
Guido van Rossum82598051997-03-05 00:20:32 +00001303 co = (PyCodeObject *)v;
1304 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001305 if (v && flags)
1306 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001307 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001308 return v;
1309}
1310
Guido van Rossum82598051997-03-05 00:20:32 +00001311PyObject *
Tim Petersd08e3822003-04-17 15:24:21 +00001312Py_CompileStringFlags(const char *str, const char *filename, int start,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001313 PyCompilerFlags *flags)
1314{
Guido van Rossum82598051997-03-05 00:20:32 +00001315 PyCodeObject *co;
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001316 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001317 PyArena *arena = PyArena_New();
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001318 if (arena == NULL)
1319 return NULL;
1320
1321 mod = PyParser_ASTFromString(str, filename, start, flags, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001322 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001323 PyArena_Free(arena);
Guido van Rossum5b722181993-03-30 17:46:03 +00001324 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001325 }
Martin v. Löwis2b366e42006-02-26 22:12:35 +00001326 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001327 PyObject *result = PyAST_mod2obj(mod);
1328 PyArena_Free(arena);
1329 return result;
1330 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001331 co = PyAST_Compile(mod, filename, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001332 PyArena_Free(arena);
Guido van Rossum82598051997-03-05 00:20:32 +00001333 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001334}
1335
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001336struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001337Py_SymtableString(const char *str, const char *filename, int start)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001338{
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001339 struct symtable *st;
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001340 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001341 PyArena *arena = PyArena_New();
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001342 if (arena == NULL)
1343 return NULL;
1344
1345 mod = PyParser_ASTFromString(str, filename, start, NULL, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001346 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001347 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001348 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001349 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001350 st = PySymtable_Build(mod, filename, 0);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001351 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001352 return st;
1353}
1354
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001355/* Preferred access to parser is through AST. */
1356mod_ty
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001357PyParser_ASTFromString(const char *s, const char *filename, int start,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001358 PyCompilerFlags *flags, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001359{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360 mod_ty mod;
1361 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001362 node *n = PyParser_ParseStringFlagsFilename(s, filename,
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001363 &_PyParser_Grammar, start, &err,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001364 PARSER_FLAGS(flags));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001365 if (n) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001366 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001367 PyNode_Free(n);
1368 return mod;
1369 }
1370 else {
1371 err_input(&err);
1372 return NULL;
1373 }
1374}
1375
1376mod_ty
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001377PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001378 char *ps2, PyCompilerFlags *flags, int *errcode,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001379 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001380{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001381 mod_ty mod;
1382 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001383 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
1384 start, ps1, ps2, &err, PARSER_FLAGS(flags));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001385 if (n) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001386 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 PyNode_Free(n);
1388 return mod;
1389 }
1390 else {
1391 err_input(&err);
1392 if (errcode)
1393 *errcode = err.error;
1394 return NULL;
1395 }
1396}
1397
Guido van Rossuma110aa61994-08-29 12:50:44 +00001398/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001399
Guido van Rossuma110aa61994-08-29 12:50:44 +00001400node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001401PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001402{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001403 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001404 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
1405 start, NULL, NULL, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001406 if (n == NULL)
1407 err_input(&err);
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001408
Guido van Rossuma110aa61994-08-29 12:50:44 +00001409 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001410}
1411
Guido van Rossuma110aa61994-08-29 12:50:44 +00001412/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001413
Guido van Rossuma110aa61994-08-29 12:50:44 +00001414node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001415PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
Tim Petersfe2127d2001-07-16 05:37:24 +00001416{
Tim Petersfe2127d2001-07-16 05:37:24 +00001417 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001418 node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
1419 start, &err, flags);
Tim Petersfe2127d2001-07-16 05:37:24 +00001420 if (n == NULL)
1421 err_input(&err);
1422 return n;
1423}
1424
1425node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001426PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
Thomas Heller6b17abf2002-07-09 09:23:27 +00001427 int start, int flags)
1428{
Thomas Heller6b17abf2002-07-09 09:23:27 +00001429 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001430 node *n = PyParser_ParseStringFlagsFilename(str, filename,
1431 &_PyParser_Grammar, start, &err, flags);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001432 if (n == NULL)
1433 err_input(&err);
1434 return n;
1435}
1436
1437node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001438PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001439{
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001440 return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001441}
1442
Guido van Rossum66ebd912003-04-17 16:02:26 +00001443/* May want to move a more generalized form of this to parsetok.c or
1444 even parser modules. */
1445
1446void
1447PyParser_SetError(perrdetail *err)
1448{
1449 err_input(err);
1450}
1451
Guido van Rossuma110aa61994-08-29 12:50:44 +00001452/* Set the error appropriate to the given input error code (see errcode.h) */
1453
1454static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001455err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001456{
Fred Drake85f36392000-07-11 17:53:00 +00001457 PyObject *v, *w, *errtype;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001458 PyObject* u = NULL;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001459 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001460 errtype = PyExc_SyntaxError;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001461 switch (err->error) {
1462 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001463 errtype = PyExc_IndentationError;
1464 if (err->expected == INDENT)
1465 msg = "expected an indented block";
1466 else if (err->token == INDENT)
1467 msg = "unexpected indent";
1468 else if (err->token == DEDENT)
1469 msg = "unexpected unindent";
1470 else {
1471 errtype = PyExc_SyntaxError;
1472 msg = "invalid syntax";
1473 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001474 break;
1475 case E_TOKEN:
1476 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001477 break;
Skip Montanaro118ec702002-08-15 01:20:16 +00001478 case E_EOFS:
1479 msg = "EOF while scanning triple-quoted string";
1480 break;
1481 case E_EOLS:
1482 msg = "EOL while scanning single-quoted string";
1483 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001484 case E_INTR:
Michael W. Hudson30ea2f22004-07-07 17:44:12 +00001485 if (!PyErr_Occurred())
1486 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001487 return;
1488 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001489 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001490 return;
1491 case E_EOF:
1492 msg = "unexpected EOF while parsing";
1493 break;
Fred Drake85f36392000-07-11 17:53:00 +00001494 case E_TABSPACE:
1495 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001496 msg = "inconsistent use of tabs and spaces in indentation";
1497 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001498 case E_OVERFLOW:
1499 msg = "expression too long";
1500 break;
Fred Drake85f36392000-07-11 17:53:00 +00001501 case E_DEDENT:
1502 errtype = PyExc_IndentationError;
1503 msg = "unindent does not match any outer indentation level";
1504 break;
1505 case E_TOODEEP:
1506 errtype = PyExc_IndentationError;
1507 msg = "too many levels of indentation";
1508 break;
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001509 case E_DECODE: {
1510 PyObject *type, *value, *tb;
1511 PyErr_Fetch(&type, &value, &tb);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001512 if (value != NULL) {
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001513 u = PyObject_Str(value);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001514 if (u != NULL) {
1515 msg = PyString_AsString(u);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001516 }
1517 }
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001518 if (msg == NULL)
1519 msg = "unknown decode error";
Neal Norwitzdb83eb32005-12-18 05:29:30 +00001520 Py_XDECREF(type);
1521 Py_XDECREF(value);
Neal Norwitz40d37812005-10-02 01:48:49 +00001522 Py_XDECREF(tb);
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001523 break;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001524 }
Martin v. Löwis4bf108d2005-03-03 11:45:45 +00001525 case E_LINECONT:
1526 msg = "unexpected character after line continuation character";
1527 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001528 default:
1529 fprintf(stderr, "error=%d\n", err->error);
1530 msg = "unknown parsing error";
1531 break;
1532 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001533 v = Py_BuildValue("(ziiz)", err->filename,
1534 err->lineno, err->offset, err->text);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001535 if (err->text != NULL) {
Tim Petersc9d78aa2006-03-26 23:27:58 +00001536 PyObject_FREE(err->text);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001537 err->text = NULL;
1538 }
1539 w = NULL;
1540 if (v != NULL)
1541 w = Py_BuildValue("(sO)", msg, v);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001542 Py_XDECREF(u);
Guido van Rossum41318302001-03-23 04:01:07 +00001543 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001544 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001545 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001546}
1547
1548/* Print fatal error message and abort */
1549
1550void
Tim Peters7c321a82002-07-09 02:57:01 +00001551Py_FatalError(const char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001552{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001553 fprintf(stderr, "Fatal Python error: %s\n", msg);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001554#ifdef MS_WINDOWS
Guido van Rossum23c94461997-05-22 20:21:30 +00001555 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001556 OutputDebugString(msg);
1557 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001558#ifdef _DEBUG
1559 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001560#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001561#endif /* MS_WINDOWS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001562 abort();
1563}
1564
1565/* Clean up and exit */
1566
Guido van Rossuma110aa61994-08-29 12:50:44 +00001567#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001568#include "pythread.h"
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001569#endif
1570
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001571#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001572static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001573static int nexitfuncs = 0;
1574
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001575int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001576{
1577 if (nexitfuncs >= NEXITFUNCS)
1578 return -1;
1579 exitfuncs[nexitfuncs++] = func;
1580 return 0;
1581}
1582
Guido van Rossumcc283f51997-08-05 02:22:03 +00001583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001584call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001585{
Guido van Rossum82598051997-03-05 00:20:32 +00001586 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001587
1588 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001589 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001590 Py_INCREF(exitfunc);
1591 PySys_SetObject("exitfunc", (PyObject *)NULL);
1592 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001593 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001594 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1595 PySys_WriteStderr("Error in sys.exitfunc:\n");
1596 }
Guido van Rossum82598051997-03-05 00:20:32 +00001597 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001598 }
Guido van Rossum82598051997-03-05 00:20:32 +00001599 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001600 }
1601
Guido van Rossum0829c751998-02-28 04:31:39 +00001602 if (Py_FlushLine())
1603 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001604}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001605
Guido van Rossumcc283f51997-08-05 02:22:03 +00001606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001607call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001608{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001609 while (nexitfuncs > 0)
1610 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001611
1612 fflush(stdout);
1613 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001614}
1615
1616void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001617Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001618{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001619 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001620
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001621 exit(sts);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001622}
1623
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001624static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001625initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001626{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001627#ifdef SIGPIPE
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001628 PyOS_setsig(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001629#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00001630#ifdef SIGXFZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001631 PyOS_setsig(SIGXFZ, SIG_IGN);
Guido van Rossum70d893a2001-08-16 08:21:42 +00001632#endif
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001633#ifdef SIGXFSZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001634 PyOS_setsig(SIGXFSZ, SIG_IGN);
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001635#endif
Guido van Rossum82598051997-03-05 00:20:32 +00001636 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001637}
1638
Guido van Rossum7433b121997-02-14 19:45:36 +00001639
1640/*
1641 * The file descriptor fd is considered ``interactive'' if either
1642 * a) isatty(fd) is TRUE, or
1643 * b) the -i flag was given, and the filename associated with
1644 * the descriptor is NULL or "<stdin>" or "???".
1645 */
1646int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001647Py_FdIsInteractive(FILE *fp, const char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001648{
1649 if (isatty((int)fileno(fp)))
1650 return 1;
1651 if (!Py_InteractiveFlag)
1652 return 0;
1653 return (filename == NULL) ||
1654 (strcmp(filename, "<stdin>") == 0) ||
1655 (strcmp(filename, "???") == 0);
1656}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001657
1658
Tim Petersd08e3822003-04-17 15:24:21 +00001659#if defined(USE_STACKCHECK)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001660#if defined(WIN32) && defined(_MSC_VER)
1661
1662/* Stack checking for Microsoft C */
1663
1664#include <malloc.h>
1665#include <excpt.h>
1666
Fred Drakee8de31c2000-08-31 05:38:39 +00001667/*
1668 * Return non-zero when we run out of memory on the stack; zero otherwise.
1669 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001670int
Fred Drake399739f2000-08-31 05:52:44 +00001671PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001672{
1673 __try {
Tim Peters92e4dd82002-10-05 01:47:34 +00001674 /* alloca throws a stack overflow exception if there's
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001675 not enough space left on the stack */
Tim Peters92e4dd82002-10-05 01:47:34 +00001676 alloca(PYOS_STACK_MARGIN * sizeof(void*));
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001677 return 0;
1678 } __except (EXCEPTION_EXECUTE_HANDLER) {
1679 /* just ignore all errors */
1680 }
1681 return 1;
1682}
1683
1684#endif /* WIN32 && _MSC_VER */
1685
1686/* Alternate implementations can be added here... */
1687
1688#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001689
1690
1691/* Wrappers around sigaction() or signal(). */
1692
1693PyOS_sighandler_t
1694PyOS_getsig(int sig)
1695{
1696#ifdef HAVE_SIGACTION
1697 struct sigaction context;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001698 if (sigaction(sig, NULL, &context) == -1)
1699 return SIG_ERR;
Guido van Rossum6f256182000-09-16 16:32:19 +00001700 return context.sa_handler;
1701#else
1702 PyOS_sighandler_t handler;
Martin v. Löwisb45b3152005-11-28 17:34:23 +00001703/* Special signal handling for the secure CRT in Visual Studio 2005 */
1704#if defined(_MSC_VER) && _MSC_VER >= 1400
1705 switch (sig) {
1706 /* Only these signals are valid */
1707 case SIGINT:
1708 case SIGILL:
1709 case SIGFPE:
1710 case SIGSEGV:
1711 case SIGTERM:
1712 case SIGBREAK:
1713 case SIGABRT:
1714 break;
1715 /* Don't call signal() with other values or it will assert */
1716 default:
1717 return SIG_ERR;
1718 }
1719#endif /* _MSC_VER && _MSC_VER >= 1400 */
Guido van Rossum6f256182000-09-16 16:32:19 +00001720 handler = signal(sig, SIG_IGN);
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001721 if (handler != SIG_ERR)
1722 signal(sig, handler);
Guido van Rossum6f256182000-09-16 16:32:19 +00001723 return handler;
1724#endif
1725}
1726
1727PyOS_sighandler_t
1728PyOS_setsig(int sig, PyOS_sighandler_t handler)
1729{
1730#ifdef HAVE_SIGACTION
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001731 struct sigaction context, ocontext;
Guido van Rossum6f256182000-09-16 16:32:19 +00001732 context.sa_handler = handler;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001733 sigemptyset(&context.sa_mask);
1734 context.sa_flags = 0;
1735 if (sigaction(sig, &context, &ocontext) == -1)
1736 return SIG_ERR;
1737 return ocontext.sa_handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001738#else
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001739 PyOS_sighandler_t oldhandler;
1740 oldhandler = signal(sig, handler);
1741#ifdef HAVE_SIGINTERRUPT
1742 siginterrupt(sig, 1);
1743#endif
1744 return oldhandler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001745#endif
1746}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747
1748/* Deprecated C API functions still provided for binary compatiblity */
1749
1750#undef PyParser_SimpleParseFile
Thomas Heller1b046642006-04-18 18:51:06 +00001751PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001752PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
1753{
1754 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1755}
1756
Thomas Heller1b046642006-04-18 18:51:06 +00001757#undef PyParser_SimpleParseString
1758PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001759PyParser_SimpleParseString(const char *str, int start)
1760{
1761 return PyParser_SimpleParseStringFlags(str, start, 0);
1762}
Anthony Baxterac6bd462006-04-13 02:06:09 +00001763
Thomas Heller1b046642006-04-18 18:51:06 +00001764#undef PyRun_AnyFile
1765PyAPI_FUNC(int)
1766PyRun_AnyFile(FILE *fp, const char *name)
1767{
1768 return PyRun_AnyFileExFlags(fp, name, 0, NULL);
1769}
1770
1771#undef PyRun_AnyFileEx
1772PyAPI_FUNC(int)
1773PyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
1774{
1775 return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
1776}
1777
1778#undef PyRun_AnyFileFlags
1779PyAPI_FUNC(int)
1780PyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
1781{
1782 return PyRun_AnyFileExFlags(fp, name, 0, flags);
1783}
1784
1785#undef PyRun_File
1786PyAPI_FUNC(PyObject *)
1787PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
1788{
1789 return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
1790}
1791
1792#undef PyRun_FileEx
1793PyAPI_FUNC(PyObject *)
1794PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
1795{
1796 return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
1797}
1798
1799#undef PyRun_FileFlags
1800PyAPI_FUNC(PyObject *)
1801PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
1802 PyCompilerFlags *flags)
1803{
1804 return PyRun_FileExFlags(fp, p, s, g, l, 0, flags);
1805}
1806
1807#undef PyRun_SimpleFile
1808PyAPI_FUNC(int)
1809PyRun_SimpleFile(FILE *f, const char *p)
1810{
1811 return PyRun_SimpleFileExFlags(f, p, 0, NULL);
1812}
1813
1814#undef PyRun_SimpleFileEx
1815PyAPI_FUNC(int)
1816PyRun_SimpleFileEx(FILE *f, const char *p, int c)
1817{
1818 return PyRun_SimpleFileExFlags(f, p, c, NULL);
1819}
1820
1821
1822#undef PyRun_String
1823PyAPI_FUNC(PyObject *)
1824PyRun_String(const char *str, int s, PyObject *g, PyObject *l)
1825{
1826 return PyRun_StringFlags(str, s, g, l, NULL);
1827}
1828
1829#undef PyRun_SimpleString
1830PyAPI_FUNC(int)
1831PyRun_SimpleString(const char *s)
1832{
1833 return PyRun_SimpleStringFlags(s, NULL);
1834}
1835
1836#undef Py_CompileString
1837PyAPI_FUNC(PyObject *)
1838Py_CompileString(const char *str, const char *p, int s)
1839{
1840 return Py_CompileStringFlags(str, p, s, NULL);
1841}
1842
1843#undef PyRun_InteractiveOne
1844PyAPI_FUNC(int)
1845PyRun_InteractiveOne(FILE *f, const char *p)
1846{
1847 return PyRun_InteractiveOneFlags(f, p, NULL);
1848}
1849
1850#undef PyRun_InteractiveLoop
1851PyAPI_FUNC(int)
1852PyRun_InteractiveLoop(FILE *f, const char *p)
1853{
1854 return PyRun_InteractiveLoopFlags(f, p, NULL);
1855}
1856
Anthony Baxterac6bd462006-04-13 02:06:09 +00001857#ifdef __cplusplus
1858}
1859#endif
1860