blob: 82f8e373cafda531681f79c5d9fda2171b93d67a [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 Rossumd8faa362007-04-27 19:54:29 +00007#undef Yield /* undefine macro conflicting with winbase.h */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00008#include "grammar.h"
9#include "node.h"
Fred Drake85f36392000-07-11 17:53:00 +000010#include "token.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000012#include "errcode.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013#include "code.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000014#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000015#include "symtable.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000016#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000017#include "ast.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000018#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000019#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000020
Thomas Wouters0e3f5912006-08-11 14:57:12 +000021#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000022#include <signal.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +000023#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000024
Martin v. Löwis73d538b2003-03-05 15:13:47 +000025#ifdef HAVE_LANGINFO_H
26#include <locale.h>
27#include <langinfo.h>
28#endif
29
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000030#ifdef MS_WINDOWS
Guido van Rossuma44823b1995-03-14 15:01:17 +000031#undef BYTE
32#include "windows.h"
33#endif
34
Neal Norwitz4281cef2006-03-04 19:58:13 +000035#ifndef Py_REF_DEBUG
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000036#define PRINT_TOTAL_REFS()
Neal Norwitz4281cef2006-03-04 19:58:13 +000037#else /* Py_REF_DEBUG */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000038#define PRINT_TOTAL_REFS() fprintf(stderr, \
39 "[%" PY_FORMAT_SIZE_T "d refs]\n", \
40 _Py_GetRefTotal())
41#endif
42
43#ifdef __cplusplus
44extern "C" {
Neal Norwitz4281cef2006-03-04 19:58:13 +000045#endif
46
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000047extern char *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000048
Guido van Rossum82598051997-03-05 00:20:32 +000049extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000050
Guido van Rossumb73cc041993-11-01 16:28:59 +000051/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000052static void initmain(void);
53static void initsite(void);
Guido van Rossumce3a72a2007-10-19 23:16:50 +000054static int initstdio(void);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000055static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
Neal Norwitzadb69fc2005-12-17 20:54:49 +000056 PyCompilerFlags *, PyArena *);
Martin v. Löwis95292d62002-12-11 14:04:59 +000057static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
Jeremy Hyltonbc320242001-03-22 02:47:58 +000058 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000059static void err_input(perrdetail *);
60static void initsigs(void);
Collin Winter670e6922007-03-21 02:57:17 +000061static void call_py_exitfuncs(void);
Tim Petersdbd9ba62000-07-09 03:09:57 +000062static void call_ll_exitfuncs(void);
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000063extern void _PyUnicode_Init(void);
64extern void _PyUnicode_Fini(void);
Guido van Rossumddefaf32007-01-14 03:31:43 +000065extern int _PyLong_Init(void);
66extern void PyLong_Fini(void);
Guido van Rossumc94044c2000-03-10 23:03:54 +000067
Mark Hammond8d98d2c2003-04-19 15:41:53 +000068#ifdef WITH_THREAD
69extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
70extern void _PyGILState_Fini(void);
71#endif /* WITH_THREAD */
72
Guido van Rossum82598051997-03-05 00:20:32 +000073int Py_DebugFlag; /* Needed by parser.c */
74int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000075int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumd8faa362007-04-27 19:54:29 +000076int Py_InspectFlag; /* Needed to determine whether to exit at SystemError */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000077int Py_NoSiteFlag; /* Suppress 'import site' */
Guido van Rossum98297ee2007-11-06 21:34:58 +000078int Py_BytesWarningFlag; /* Warn on str(bytes) and str(buffer) */
Barry Warsaw3ce09642000-05-02 19:18:59 +000079int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000080int Py_FrozenFlag; /* Needed by getpath.c */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +000081int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000082
Mark Hammonda43fd0c2003-02-19 00:33:33 +000083/* Reference to 'warnings' module, to avoid importing it
Mark Hammondedd07732003-07-15 23:03:55 +000084 on the fly when the import lock may be held. See 683658/771097
Mark Hammonda43fd0c2003-02-19 00:33:33 +000085*/
Mark Hammondedd07732003-07-15 23:03:55 +000086static PyObject *warnings_module = NULL;
87
88/* Returns a borrowed reference to the 'warnings' module, or NULL.
89 If the module is returned, it is guaranteed to have been obtained
90 without acquiring the import lock
91*/
Martin v. Löwisa2c17c52003-08-09 09:47:11 +000092PyObject *PyModule_GetWarningsModule(void)
Mark Hammondedd07732003-07-15 23:03:55 +000093{
94 PyObject *typ, *val, *tb;
95 PyObject *all_modules;
96 /* If we managed to get the module at init time, just use it */
97 if (warnings_module)
98 return warnings_module;
99 /* If it wasn't available at init time, it may be available
100 now in sys.modules (common scenario is frozen apps: import
101 at init time fails, but the frozen init code sets up sys.path
102 correctly, then does an implicit import of warnings for us
103 */
104 /* Save and restore any exceptions */
105 PyErr_Fetch(&typ, &val, &tb);
106
Mark Hammond5f4e8ca2003-07-16 01:54:38 +0000107 all_modules = PySys_GetObject("modules");
Mark Hammondedd07732003-07-15 23:03:55 +0000108 if (all_modules) {
109 warnings_module = PyDict_GetItemString(all_modules, "warnings");
110 /* We keep a ref in the global */
111 Py_XINCREF(warnings_module);
112 }
113 PyErr_Restore(typ, val, tb);
114 return warnings_module;
115}
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000116
Guido van Rossum25ce5661997-08-02 03:10:38 +0000117static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118
Thomas Wouters7e474022000-07-16 12:04:32 +0000119/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000120
121int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000122Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000123{
124 return initialized;
125}
126
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127/* Global initializations. Can be undone by Py_Finalize(). Don't
128 call this twice without an intervening Py_Finalize() call. When
129 initializations fail, a fatal error is issued and the function does
130 not return. On return, the first thread and interpreter state have
131 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132
Guido van Rossum25ce5661997-08-02 03:10:38 +0000133 Locking: you must hold the interpreter lock while calling this.
134 (If the lock has not yet been initialized, that's equivalent to
135 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000136
Guido van Rossum25ce5661997-08-02 03:10:38 +0000137*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000138
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000139static int
140add_flag(int flag, const char *envs)
141{
142 int env = atoi(envs);
143 if (flag < env)
144 flag = env;
145 if (flag < 1)
146 flag = 1;
147 return flag;
148}
149
Guido van Rossuma027efa1997-05-05 20:56:21 +0000150void
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000151Py_InitializeEx(int install_sigs)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000152{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000153 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000154 PyThreadState *tstate;
Guido van Rossum826d8972007-10-30 18:34:07 +0000155 PyObject *bimod, *sysmod, *pstderr;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000156 char *p;
Guido van Rossum8d30cc02007-05-03 17:49:24 +0000157#if defined(HAVE_LANGINFO_H) && defined(CODESET)
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000158 char *codeset;
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000159#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +0000160 extern void _Py_ReadyTypes(void);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000161
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000162 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000163 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000164 initialized = 1;
Tim Petersd08e3822003-04-17 15:24:21 +0000165
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +0000166#ifdef HAVE_SETLOCALE
167 /* Set up the LC_CTYPE locale, so we can obtain
168 the locale's charset without having to switch
169 locales. */
170 setlocale(LC_CTYPE, "");
171#endif
172
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000173 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000174 Py_DebugFlag = add_flag(Py_DebugFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000175 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000176 Py_VerboseFlag = add_flag(Py_VerboseFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000177 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000178 Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000179
Guido van Rossuma027efa1997-05-05 20:56:21 +0000180 interp = PyInterpreterState_New();
181 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000182 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000183
Guido van Rossuma027efa1997-05-05 20:56:21 +0000184 tstate = PyThreadState_New(interp);
185 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000186 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000187 (void) PyThreadState_Swap(tstate);
188
Guido van Rossum70d893a2001-08-16 08:21:42 +0000189 _Py_ReadyTypes();
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000190
Neal Norwitzb2501f42002-12-31 03:42:13 +0000191 if (!_PyFrame_Init())
Neal Norwitzc91ed402002-12-30 22:29:22 +0000192 Py_FatalError("Py_Initialize: can't init frames");
193
Guido van Rossumddefaf32007-01-14 03:31:43 +0000194 if (!_PyLong_Init())
195 Py_FatalError("Py_Initialize: can't init longs");
Neal Norwitzc91ed402002-12-30 22:29:22 +0000196
Neal Norwitz6968b052007-02-27 19:02:19 +0000197 if (!PyBytes_Init())
198 Py_FatalError("Py_Initialize: can't init bytes");
199
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000200 _PyFloat_Init();
201
Guido van Rossum25ce5661997-08-02 03:10:38 +0000202 interp->modules = PyDict_New();
203 if (interp->modules == NULL)
204 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossumd8faa362007-04-27 19:54:29 +0000205 interp->modules_reloading = PyDict_New();
206 if (interp->modules_reloading == NULL)
207 Py_FatalError("Py_Initialize: can't make modules_reloading dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000208
Guido van Rossumc94044c2000-03-10 23:03:54 +0000209 /* Init Unicode implementation; relies on the codec registry */
210 _PyUnicode_Init();
211
Barry Warsawf242aa02000-05-25 23:09:49 +0000212 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000213 if (bimod == NULL)
214 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000215 interp->builtins = PyModule_GetDict(bimod);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000216 if (interp->builtins == NULL)
217 Py_FatalError("Py_Initialize: can't initialize builtins dict");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000218 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000219
220 sysmod = _PySys_Init();
221 if (sysmod == NULL)
222 Py_FatalError("Py_Initialize: can't initialize sys");
223 interp->sysdict = PyModule_GetDict(sysmod);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000224 if (interp->sysdict == NULL)
225 Py_FatalError("Py_Initialize: can't initialize sys dict");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000226 Py_INCREF(interp->sysdict);
227 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000228 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000229 PyDict_SetItemString(interp->sysdict, "modules",
230 interp->modules);
231
Guido van Rossum826d8972007-10-30 18:34:07 +0000232 /* Set up a preliminary stderr printer until we have enough
233 infrastructure for the io module in place. */
234 pstderr = PyFile_NewStdPrinter(fileno(stderr));
235 if (pstderr == NULL)
236 Py_FatalError("Py_Initialize: can't set preliminary stderr");
237 PySys_SetObject("stderr", pstderr);
Guido van Rossum98297ee2007-11-06 21:34:58 +0000238 PySys_SetObject("__stderr__", pstderr);
Guido van Rossum826d8972007-10-30 18:34:07 +0000239
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000240 _PyImport_Init();
241
Barry Warsawf242aa02000-05-25 23:09:49 +0000242 /* initialize builtin exceptions */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000243 _PyExc_Init();
Barry Warsawf242aa02000-05-25 23:09:49 +0000244
Barry Warsaw035574d1997-08-29 22:07:17 +0000245 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000246 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000247
Just van Rossum52e14d62002-12-30 22:08:05 +0000248 _PyImportHooks_Init();
249
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000250 if (install_sigs)
251 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000252
253 initmain(); /* Module __main__ */
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000254 if (initstdio() < 0)
255 Py_FatalError(
256 "Py_Initialize: can't initialize sys standard streams");
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000257 if (!Py_NoSiteFlag)
258 initsite(); /* Module site */
Just van Rossum5bfba3a2003-02-25 20:25:12 +0000259
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000260 /* auto-thread-state API, if available */
261#ifdef WITH_THREAD
262 _PyGILState_Init(interp, tstate);
263#endif /* WITH_THREAD */
264
Mark Hammondedd07732003-07-15 23:03:55 +0000265 warnings_module = PyImport_ImportModule("warnings");
Guido van Rossum98297ee2007-11-06 21:34:58 +0000266 if (!warnings_module) {
Mark Hammondedd07732003-07-15 23:03:55 +0000267 PyErr_Clear();
Guido van Rossum98297ee2007-11-06 21:34:58 +0000268 }
269 else {
270 PyObject *o;
271 char *action[8];
272
273 if (Py_BytesWarningFlag > 1)
274 *action = "error";
275 else if (Py_BytesWarningFlag)
276 *action = "default";
277 else
278 *action = "ignore";
279
280 o = PyObject_CallMethod(warnings_module,
281 "simplefilter", "sO",
282 *action, PyExc_BytesWarning);
283 if (o == NULL)
284 Py_FatalError("Py_Initialize: can't initialize"
285 "warning filter for BytesWarning.");
286 Py_DECREF(o);
287 }
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000288
Guido van Rossum8d30cc02007-05-03 17:49:24 +0000289#if defined(HAVE_LANGINFO_H) && defined(CODESET)
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000290 /* On Unix, set the file system encoding according to the
291 user's preference, if the CODESET names a well-known
292 Python codec, and Py_FileSystemDefaultEncoding isn't
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000293 initialized by other means. Also set the encoding of
294 stdin and stdout if these are terminals. */
295
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000296 codeset = nl_langinfo(CODESET);
297 if (codeset && *codeset) {
298 PyObject *enc = PyCodec_Encoder(codeset);
299 if (enc) {
300 codeset = strdup(codeset);
301 Py_DECREF(enc);
302 } else {
303 codeset = NULL;
304 PyErr_Clear();
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000305 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000306 } else
307 codeset = NULL;
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000308
309 if (codeset) {
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000310 if (!Py_FileSystemDefaultEncoding)
311 Py_FileSystemDefaultEncoding = codeset;
312 else
313 free(codeset);
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000314 }
315#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000316}
317
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000318void
319Py_Initialize(void)
320{
321 Py_InitializeEx(1);
322}
323
324
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000325#ifdef COUNT_ALLOCS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000326extern void dump_counts(FILE*);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000327#endif
328
Guido van Rossume8432ac2007-07-09 15:04:50 +0000329/* Flush stdout and stderr */
330
Neal Norwitz2bad9702007-08-27 06:19:22 +0000331static void
Guido van Rossum1bd21222007-07-10 20:14:13 +0000332flush_std_files(void)
Guido van Rossume8432ac2007-07-09 15:04:50 +0000333{
334 PyObject *fout = PySys_GetObject("stdout");
335 PyObject *ferr = PySys_GetObject("stderr");
336 PyObject *tmp;
337
338 if (fout != NULL) {
339 tmp = PyObject_CallMethod(fout, "flush", "");
340 if (tmp == NULL)
341 PyErr_Clear();
342 else
343 Py_DECREF(tmp);
344 }
345
346 if (ferr != NULL) {
347 tmp = PyObject_CallMethod(ferr, "flush", "");
348 if (tmp == NULL)
349 PyErr_Clear();
350 else
351 Py_DECREF(tmp);
352 }
353}
354
Guido van Rossum25ce5661997-08-02 03:10:38 +0000355/* Undo the effect of Py_Initialize().
356
357 Beware: if multiple interpreter and/or thread states exist, these
358 are not wiped out; only the current thread and interpreter state
359 are deleted. But since everything else is deleted, those other
360 interpreter and thread states should no longer be used.
361
362 (XXX We should do better, e.g. wipe out all interpreters and
363 threads.)
364
365 Locking: as above.
366
367*/
368
369void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000370Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000371{
372 PyInterpreterState *interp;
373 PyThreadState *tstate;
374
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000375 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000376 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000377
Tim Peters384fd102001-01-21 03:40:37 +0000378 /* The interpreter is still entirely intact at this point, and the
379 * exit funcs may be relying on that. In particular, if some thread
380 * or exit func is still waiting to do an import, the import machinery
381 * expects Py_IsInitialized() to return true. So don't say the
382 * interpreter is uninitialized until after the exit funcs have run.
383 * Note that Threading.py uses an exit func to do a join on all the
384 * threads created thru it, so this also protects pending imports in
385 * the threads created via Threading.
386 */
Collin Winter670e6922007-03-21 02:57:17 +0000387 call_py_exitfuncs();
Tim Peters384fd102001-01-21 03:40:37 +0000388 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000389
Guido van Rossume8432ac2007-07-09 15:04:50 +0000390 /* Flush stdout+stderr */
391 flush_std_files();
392
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000393 /* Get current thread state and interpreter pointer */
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000394 tstate = PyThreadState_GET();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000395 interp = tstate->interp;
396
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000397 /* Disable signal handling */
398 PyOS_FiniInterrupts();
399
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000400 /* drop module references we saved */
Mark Hammondedd07732003-07-15 23:03:55 +0000401 Py_XDECREF(warnings_module);
402 warnings_module = NULL;
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000403
Guido van Rossume13ddc92003-04-17 17:29:22 +0000404 /* Collect garbage. This may call finalizers; it's nice to call these
Tim Peters1d7323e2003-12-01 21:35:27 +0000405 * before all modules are destroyed.
406 * XXX If a __del__ or weakref callback is triggered here, and tries to
407 * XXX import a module, bad things can happen, because Python no
408 * XXX longer believes it's initialized.
409 * XXX Fatal Python error: Interpreter not initialized (version mismatch?)
410 * XXX is easy to provoke that way. I've also seen, e.g.,
411 * XXX Exception exceptions.ImportError: 'No module named sha'
412 * XXX in <function callback at 0x008F5718> ignored
413 * XXX but I'm unclear on exactly how that one happens. In any case,
414 * XXX I haven't seen a real-life report of either of these.
Neal Norwitz9589ee22006-03-04 19:01:22 +0000415 */
Guido van Rossume13ddc92003-04-17 17:29:22 +0000416 PyGC_Collect();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000417#ifdef COUNT_ALLOCS
418 /* With COUNT_ALLOCS, it helps to run GC multiple times:
419 each collection might release some types from the type
420 list, so they become garbage. */
421 while (PyGC_Collect() > 0)
422 /* nothing */;
423#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000424
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000425 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000426 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000427
Guido van Rossume8432ac2007-07-09 15:04:50 +0000428 /* Flush stdout+stderr (again, in case more was printed) */
429 flush_std_files();
430
Guido van Rossume13ddc92003-04-17 17:29:22 +0000431 /* Collect final garbage. This disposes of cycles created by
Tim Peters1d7323e2003-12-01 21:35:27 +0000432 * new-style class definitions, for example.
433 * XXX This is disabled because it caused too many problems. If
434 * XXX a __del__ or weakref callback triggers here, Python code has
435 * XXX a hard time running, because even the sys module has been
436 * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
437 * XXX One symptom is a sequence of information-free messages
438 * XXX coming from threads (if a __del__ or callback is invoked,
439 * XXX other threads can execute too, and any exception they encounter
440 * XXX triggers a comedy of errors as subsystem after subsystem
441 * XXX fails to find what it *expects* to find in sys to help report
442 * XXX the exception and consequent unexpected failures). I've also
443 * XXX seen segfaults then, after adding print statements to the
444 * XXX Python code getting called.
445 */
446#if 0
Guido van Rossume13ddc92003-04-17 17:29:22 +0000447 PyGC_Collect();
Tim Peters1d7323e2003-12-01 21:35:27 +0000448#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000449
Guido van Rossum1707aad1997-12-08 23:43:45 +0000450 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
451 _PyImport_Fini();
452
453 /* Debugging stuff */
454#ifdef COUNT_ALLOCS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000455 dump_counts(stdout);
Guido van Rossum1707aad1997-12-08 23:43:45 +0000456#endif
457
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000458 PRINT_TOTAL_REFS();
Guido van Rossum1707aad1997-12-08 23:43:45 +0000459
Tim Peters9cf25ce2003-04-17 15:21:01 +0000460#ifdef Py_TRACE_REFS
461 /* Display all objects still alive -- this can invoke arbitrary
462 * __repr__ overrides, so requires a mostly-intact interpreter.
463 * Alas, a lot of stuff may still be alive now that will be cleaned
464 * up later.
465 */
Tim Peters269b2a62003-04-17 19:52:29 +0000466 if (Py_GETENV("PYTHONDUMPREFS"))
Tim Peters9cf25ce2003-04-17 15:21:01 +0000467 _Py_PrintReferences(stderr);
Tim Peters9cf25ce2003-04-17 15:21:01 +0000468#endif /* Py_TRACE_REFS */
469
Mark Hammond6cb90292003-04-22 11:18:00 +0000470 /* Cleanup auto-thread-state */
471#ifdef WITH_THREAD
472 _PyGILState_Fini();
473#endif /* WITH_THREAD */
474
Guido van Rossumd922fa42003-04-15 14:10:09 +0000475 /* Clear interpreter state */
Barry Warsawf242aa02000-05-25 23:09:49 +0000476 PyInterpreterState_Clear(interp);
Guido van Rossumd922fa42003-04-15 14:10:09 +0000477
Anthony Baxter12b6f6c2005-03-29 13:36:16 +0000478 /* Now we decref the exception classes. After this point nothing
479 can raise an exception. That's okay, because each Fini() method
480 below has been checked to make sure no exceptions are ever
481 raised.
482 */
483
484 _PyExc_Fini();
485
Guido van Rossumd922fa42003-04-15 14:10:09 +0000486 /* Delete current thread */
Barry Warsawf242aa02000-05-25 23:09:49 +0000487 PyThreadState_Swap(NULL);
488 PyInterpreterState_Delete(interp);
489
Guido van Rossumd922fa42003-04-15 14:10:09 +0000490 /* Sundry finalizers */
Guido van Rossumcc283f51997-08-05 02:22:03 +0000491 PyMethod_Fini();
492 PyFrame_Fini();
493 PyCFunction_Fini();
494 PyTuple_Fini();
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000495 PyList_Fini();
Raymond Hettingerd7946662005-08-01 21:39:29 +0000496 PySet_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000497 PyString_Fini();
Neal Norwitz6968b052007-02-27 19:02:19 +0000498 PyBytes_Fini();
Guido van Rossumddefaf32007-01-14 03:31:43 +0000499 PyLong_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000500 PyFloat_Fini();
501
Marc-André Lemburg95de5c12002-04-08 08:19:36 +0000502 /* Cleanup Unicode implementation */
503 _PyUnicode_Fini();
Marc-André Lemburg95de5c12002-04-08 08:19:36 +0000504
Guido van Rossumcc283f51997-08-05 02:22:03 +0000505 /* XXX Still allocated:
506 - various static ad-hoc pointers to interned strings
507 - int and float free list blocks
508 - whatever various modules and libraries allocate
509 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000510
511 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000512
Tim Peters269b2a62003-04-17 19:52:29 +0000513#ifdef Py_TRACE_REFS
514 /* Display addresses (& refcnts) of all objects still alive.
515 * An address can be used to find the repr of the object, printed
516 * above by _Py_PrintReferences.
517 */
518 if (Py_GETENV("PYTHONDUMPREFS"))
519 _Py_PrintReferenceAddresses(stderr);
520#endif /* Py_TRACE_REFS */
Tim Peters0e871182002-04-13 08:29:14 +0000521#ifdef PYMALLOC_DEBUG
522 if (Py_GETENV("PYTHONMALLOCSTATS"))
523 _PyObject_DebugMallocStats();
524#endif
525
Guido van Rossumcc283f51997-08-05 02:22:03 +0000526 call_ll_exitfuncs();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000527}
528
529/* Create and initialize a new interpreter and thread, and return the
530 new thread. This requires that Py_Initialize() has been called
531 first.
532
533 Unsuccessful initialization yields a NULL pointer. Note that *no*
534 exception information is available even in this case -- the
535 exception information is held in the thread, and there is no
536 thread.
537
538 Locking: as above.
539
540*/
541
542PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000543Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000544{
545 PyInterpreterState *interp;
546 PyThreadState *tstate, *save_tstate;
547 PyObject *bimod, *sysmod;
548
549 if (!initialized)
550 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
551
552 interp = PyInterpreterState_New();
553 if (interp == NULL)
554 return NULL;
555
556 tstate = PyThreadState_New(interp);
557 if (tstate == NULL) {
558 PyInterpreterState_Delete(interp);
559 return NULL;
560 }
561
562 save_tstate = PyThreadState_Swap(tstate);
563
564 /* XXX The following is lax in error checking */
565
566 interp->modules = PyDict_New();
Guido van Rossumd8faa362007-04-27 19:54:29 +0000567 interp->modules_reloading = PyDict_New();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000568
569 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
570 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000571 interp->builtins = PyModule_GetDict(bimod);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000572 if (interp->builtins == NULL)
573 goto handle_error;
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000574 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000575 }
576 sysmod = _PyImport_FindExtension("sys", "sys");
577 if (bimod != NULL && sysmod != NULL) {
578 interp->sysdict = PyModule_GetDict(sysmod);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000579 if (interp->sysdict == NULL)
580 goto handle_error;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000581 Py_INCREF(interp->sysdict);
582 PySys_SetPath(Py_GetPath());
583 PyDict_SetItemString(interp->sysdict, "modules",
584 interp->modules);
Martin v. Löwisd7ceb222003-01-22 09:00:38 +0000585 _PyImportHooks_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000586 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000587 if (!Py_NoSiteFlag)
588 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000589 }
590
591 if (!PyErr_Occurred())
592 return tstate;
593
Thomas Wouters89f507f2006-12-13 04:49:30 +0000594handle_error:
Guido van Rossum25ce5661997-08-02 03:10:38 +0000595 /* Oops, it didn't work. Undo it all. */
596
597 PyErr_Print();
598 PyThreadState_Clear(tstate);
599 PyThreadState_Swap(save_tstate);
600 PyThreadState_Delete(tstate);
601 PyInterpreterState_Delete(interp);
602
603 return NULL;
604}
605
606/* Delete an interpreter and its last thread. This requires that the
607 given thread state is current, that the thread has no remaining
608 frames, and that it is its interpreter's only remaining thread.
609 It is a fatal error to violate these constraints.
610
611 (Py_Finalize() doesn't have these constraints -- it zaps
612 everything, regardless.)
613
614 Locking: as above.
615
616*/
617
618void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000619Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000620{
621 PyInterpreterState *interp = tstate->interp;
622
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000623 if (tstate != PyThreadState_GET())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000624 Py_FatalError("Py_EndInterpreter: thread is not current");
625 if (tstate->frame != NULL)
626 Py_FatalError("Py_EndInterpreter: thread still has a frame");
627 if (tstate != interp->tstate_head || tstate->next != NULL)
628 Py_FatalError("Py_EndInterpreter: not the last thread");
629
630 PyImport_Cleanup();
631 PyInterpreterState_Clear(interp);
632 PyThreadState_Swap(NULL);
633 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000634}
635
636static char *progname = "python";
637
638void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000639Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000640{
641 if (pn && *pn)
642 progname = pn;
643}
644
645char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000646Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000647{
648 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000649}
650
Guido van Rossuma61691e1998-02-06 22:27:24 +0000651static char *default_home = NULL;
652
653void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000654Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000655{
656 default_home = home;
657}
658
659char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000660Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000661{
662 char *home = default_home;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000663 if (home == NULL && !Py_IgnoreEnvironmentFlag)
664 home = Py_GETENV("PYTHONHOME");
Guido van Rossuma61691e1998-02-06 22:27:24 +0000665 return home;
666}
667
Guido van Rossum6135a871995-01-09 17:53:26 +0000668/* Create __main__ module */
669
670static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000671initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000672{
Guido van Rossum82598051997-03-05 00:20:32 +0000673 PyObject *m, *d;
674 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000675 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000676 Py_FatalError("can't create __main__ module");
677 d = PyModule_GetDict(m);
678 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000679 PyObject *bimod = PyImport_ImportModule("__builtin__");
680 if (bimod == NULL ||
681 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000682 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000683 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000684 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000685}
686
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000687/* Import the site module (not into __main__ though) */
688
689static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000690initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000691{
692 PyObject *m, *f;
693 m = PyImport_ImportModule("site");
694 if (m == NULL) {
695 f = PySys_GetObject("stderr");
696 if (Py_VerboseFlag) {
697 PyFile_WriteString(
698 "'import site' failed; traceback:\n", f);
699 PyErr_Print();
700 }
701 else {
702 PyFile_WriteString(
703 "'import site' failed; use -v for traceback\n", f);
704 PyErr_Clear();
705 }
706 }
707 else {
708 Py_DECREF(m);
709 }
710}
711
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000712/* Initialize sys.stdin, stdout, stderr and __builtin__.open */
713static int
714initstdio(void)
715{
716 PyObject *iomod = NULL, *wrapper;
717 PyObject *bimod = NULL;
718 PyObject *m;
719 PyObject *std = NULL;
Christian Heimes58cb1b82007-11-13 02:19:40 +0000720 int status = 0, fd;
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000721
722 /* Hack to avoid a nasty recursion issue when Python is invoked
723 in verbose mode: pre-import the Latin-1 and UTF-8 codecs */
724 if ((m = PyImport_ImportModule("encodings.utf_8")) == NULL) {
725 goto error;
726 }
727 Py_DECREF(m);
728
729 if (!(m = PyImport_ImportModule("encodings.latin_1"))) {
730 goto error;
731 }
732 Py_DECREF(m);
733
734 if (!(bimod = PyImport_ImportModule("__builtin__"))) {
735 goto error;
736 }
737
738 if (!(iomod = PyImport_ImportModule("io"))) {
739 goto error;
740 }
741 if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) {
742 goto error;
743 }
744
745 /* Set __builtin__.open */
746 if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) {
747 goto error;
748 }
749
750 /* Set sys.stdin */
Christian Heimes58cb1b82007-11-13 02:19:40 +0000751 fd = fileno(stdin);
752 /* Under some conditions stdin, stdout and stderr may not be connected
753 * and fileno() may point to an invalid file descriptor. For example
754 * GUI apps don't have valid standard streams by default.
755 */
756 if (fd < 0) {
757#ifdef MS_WINDOWS
758 std = Py_None;
759 Py_INCREF(std);
760#else
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000761 goto error;
Christian Heimes58cb1b82007-11-13 02:19:40 +0000762#endif
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000763 }
Christian Heimes58cb1b82007-11-13 02:19:40 +0000764 else {
765 if (!(std = PyFile_FromFd(fd, "<stdin>", "r", -1, NULL,
766 "\n", 0))) {
767 goto error;
768 }
769 } /* if (fd < 0) */
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000770 PySys_SetObject("__stdin__", std);
771 PySys_SetObject("stdin", std);
772 Py_DECREF(std);
773
774 /* Set sys.stdout */
Christian Heimes58cb1b82007-11-13 02:19:40 +0000775 fd = fileno(stdout);
776 if (fd < 0) {
777#ifdef MS_WINDOWS
778 std = Py_None;
779 Py_INCREF(std);
780#else
781 goto error;
782#endif
783 }
784 else {
785 if (!(std = PyFile_FromFd(fd, "<stdout>", "w", -1, NULL,
786 "\n", 0))) {
787 goto error;
788 }
789 } /* if (fd < 0) */
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000790 PySys_SetObject("__stdout__", std);
791 PySys_SetObject("stdout", std);
792 Py_DECREF(std);
793
Guido van Rossum98297ee2007-11-06 21:34:58 +0000794#if 1 /* Disable this if you have trouble debugging bootstrap stuff */
Guido van Rossum2dced8b2007-10-30 17:27:30 +0000795 /* Set sys.stderr, replaces the preliminary stderr */
Christian Heimes58cb1b82007-11-13 02:19:40 +0000796 fd = fileno(stderr);
797 if (fd < 0) {
798#ifdef MS_WINDOWS
799 std = Py_None;
800 Py_INCREF(std);
801#else
802 goto error;
803#endif
804 }
805 else {
806 if (!(std = PyFile_FromFd(fd, "<stderr>", "w", -1, NULL,
807 "\n", 0))) {
808 goto error;
809 }
810 } /* if (fd < 0) */
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000811 PySys_SetObject("__stderr__", std);
812 PySys_SetObject("stderr", std);
813 Py_DECREF(std);
Guido van Rossum98297ee2007-11-06 21:34:58 +0000814#endif
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000815
Christian Heimes58cb1b82007-11-13 02:19:40 +0000816 if (0) {
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000817 error:
818 status = -1;
819 }
820
821 Py_XDECREF(bimod);
822 Py_XDECREF(iomod);
823 return status;
824}
825
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000826/* Parse input from a file and execute it */
827
828int
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000829PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000830 PyCompilerFlags *flags)
831{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000832 if (filename == NULL)
833 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000834 if (Py_FdIsInteractive(fp, filename)) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000835 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000836 if (closeit)
837 fclose(fp);
838 return err;
839 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000840 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000841 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000842}
843
844int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000845PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000846{
Guido van Rossum82598051997-03-05 00:20:32 +0000847 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000848 int ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000849 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000850
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000851 if (flags == NULL) {
852 flags = &local_flags;
Tim Peters5ba58662001-07-16 02:29:45 +0000853 local_flags.cf_flags = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000854 }
Guido van Rossum82598051997-03-05 00:20:32 +0000855 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000856 if (v == NULL) {
Neal Norwitza369c5a2007-08-25 07:41:59 +0000857 PySys_SetObject("ps1", v = PyUnicode_FromString(">>> "));
Guido van Rossum82598051997-03-05 00:20:32 +0000858 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000859 }
Guido van Rossum82598051997-03-05 00:20:32 +0000860 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000861 if (v == NULL) {
Neal Norwitza369c5a2007-08-25 07:41:59 +0000862 PySys_SetObject("ps2", v = PyUnicode_FromString("... "));
Guido van Rossum82598051997-03-05 00:20:32 +0000863 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000864 }
865 for (;;) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000866 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000867 PRINT_TOTAL_REFS();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000868 if (ret == E_EOF)
869 return 0;
870 /*
871 if (ret == E_NOMEM)
872 return -1;
873 */
874 }
875}
876
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000877/* compute parser flags based on compiler flags */
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000878#define PARSER_FLAGS(flags) \
Thomas Wouters34aa7ba2006-02-28 19:02:24 +0000879 ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
Guido van Rossum45aecf42006-03-15 04:58:47 +0000880 PyPARSE_DONT_IMPLY_DEDENT : 0)) : 0)
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000881
Thomas Wouters89f507f2006-12-13 04:49:30 +0000882#if 0
883/* Keep an example of flags with future keyword support. */
884#define PARSER_FLAGS(flags) \
885 ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
886 PyPARSE_DONT_IMPLY_DEDENT : 0) \
887 | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \
888 PyPARSE_WITH_IS_KEYWORD : 0)) : 0)
889#endif
890
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000891int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000892PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000893{
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000894 PyObject *m, *d, *v, *w, *oenc = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +0000896 PyArena *arena;
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000897 char *ps1 = "", *ps2 = "", *enc = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000898 int errcode = 0;
Tim Petersfe2127d2001-07-16 05:37:24 +0000899
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000900 if (fp == stdin) {
901 /* Fetch encoding from sys.stdin */
902 v = PySys_GetObject("stdin");
903 if (!v)
904 return -1;
905 oenc = PyObject_GetAttrString(v, "encoding");
906 if (!oenc)
907 return -1;
908 enc = PyUnicode_AsString(oenc);
909 }
Guido van Rossum82598051997-03-05 00:20:32 +0000910 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000911 if (v != NULL) {
Guido van Rossumc5724de2007-10-10 21:38:59 +0000912 v = PyObject_Unicode(v);
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000913 if (v == NULL)
914 PyErr_Clear();
Guido van Rossumc5724de2007-10-10 21:38:59 +0000915 else if (PyUnicode_Check(v))
916 ps1 = PyUnicode_AsString(v);
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000917 }
Guido van Rossum82598051997-03-05 00:20:32 +0000918 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000919 if (w != NULL) {
Guido van Rossumc5724de2007-10-10 21:38:59 +0000920 w = PyObject_Unicode(w);
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000921 if (w == NULL)
922 PyErr_Clear();
Guido van Rossumc5724de2007-10-10 21:38:59 +0000923 else if (PyUnicode_Check(w))
924 ps2 = PyUnicode_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000925 }
Neal Norwitz9589ee22006-03-04 19:01:22 +0000926 arena = PyArena_New();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000927 if (arena == NULL) {
928 Py_XDECREF(v);
929 Py_XDECREF(w);
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000930 Py_XDECREF(oenc);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000931 return -1;
932 }
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000933 mod = PyParser_ASTFromFile(fp, filename, enc,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934 Py_single_input, ps1, ps2,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000935 flags, &errcode, arena);
Guido van Rossum82598051997-03-05 00:20:32 +0000936 Py_XDECREF(v);
937 Py_XDECREF(w);
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000938 Py_XDECREF(oenc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000939 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +0000940 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941 if (errcode == E_EOF) {
942 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000943 return E_EOF;
944 }
Guido van Rossum82598051997-03-05 00:20:32 +0000945 PyErr_Print();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000946 return -1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000947 }
Guido van Rossum82598051997-03-05 00:20:32 +0000948 m = PyImport_AddModule("__main__");
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000949 if (m == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +0000950 PyArena_Free(arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000951 return -1;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000952 }
Guido van Rossum82598051997-03-05 00:20:32 +0000953 d = PyModule_GetDict(m);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000954 v = run_mod(mod, filename, d, d, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +0000955 PyArena_Free(arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000956 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000957 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000958 return -1;
959 }
Guido van Rossum82598051997-03-05 00:20:32 +0000960 Py_DECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000961 return 0;
962}
963
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000964/* Check whether a file maybe a pyc file: Look at the extension,
965 the file type, and, if we may close it, at the first few bytes. */
966
967static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000968maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000969{
970 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
971 return 1;
972
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000973 /* Only look into the file if we are allowed to close it, since
974 it then should also be seekable. */
975 if (closeit) {
976 /* Read only two bytes of the magic. If the file was opened in
977 text mode, the bytes 3 and 4 of the magic (\r\n) might not
978 be read as they are on disk. */
979 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
980 unsigned char buf[2];
Tim Peters3e876562001-02-11 04:35:39 +0000981 /* Mess: In case of -x, the stream is NOT at its start now,
982 and ungetc() was used to push back the first newline,
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000983 which makes the current stream position formally undefined,
984 and a x-platform nightmare.
985 Unfortunately, we have no direct way to know whether -x
986 was specified. So we use a terrible hack: if the current
987 stream position is not 0, we assume -x was specified, and
988 give up. Bug 132850 on SourceForge spells out the
989 hopelessness of trying anything else (fseek and ftell
990 don't work predictably x-platform for text-mode files).
Tim Peters3e876562001-02-11 04:35:39 +0000991 */
Tim Peters3e876562001-02-11 04:35:39 +0000992 int ispyc = 0;
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000993 if (ftell(fp) == 0) {
994 if (fread(buf, 1, 2, fp) == 2 &&
Tim Petersd08e3822003-04-17 15:24:21 +0000995 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000996 ispyc = 1;
997 rewind(fp);
998 }
Tim Peters3e876562001-02-11 04:35:39 +0000999 return ispyc;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +00001000 }
1001 return 0;
Tim Petersd08e3822003-04-17 15:24:21 +00001002}
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +00001003
Guido van Rossum0df002c2000-08-27 19:21:52 +00001004int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001005PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001006 PyCompilerFlags *flags)
1007{
Guido van Rossum82598051997-03-05 00:20:32 +00001008 PyObject *m, *d, *v;
Martin v. Löwis95292d62002-12-11 14:04:59 +00001009 const char *ext;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001010 int set_file_name = 0, ret;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001011
Guido van Rossum82598051997-03-05 00:20:32 +00001012 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001013 if (m == NULL)
1014 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +00001015 d = PyModule_GetDict(m);
Fred Drake8ed02042002-10-17 21:24:58 +00001016 if (PyDict_GetItemString(d, "__file__") == NULL) {
Guido van Rossum00bc0e02007-10-15 02:52:41 +00001017 PyObject *f;
1018 f = PyUnicode_DecodeFSDefault(filename);
Fred Drake8ed02042002-10-17 21:24:58 +00001019 if (f == NULL)
1020 return -1;
1021 if (PyDict_SetItemString(d, "__file__", f) < 0) {
1022 Py_DECREF(f);
1023 return -1;
1024 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001025 set_file_name = 1;
Fred Drake8ed02042002-10-17 21:24:58 +00001026 Py_DECREF(f);
1027 }
Guido van Rossumfdef2711994-09-14 13:31:04 +00001028 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +00001029 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +00001030 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +00001031 if (closeit)
1032 fclose(fp);
Fred Drake8ed02042002-10-17 21:24:58 +00001033 if ((fp = fopen(filename, "rb")) == NULL) {
Guido van Rossumfdef2711994-09-14 13:31:04 +00001034 fprintf(stderr, "python: Can't reopen .pyc file\n");
Guido van Rossumd8faa362007-04-27 19:54:29 +00001035 ret = -1;
1036 goto done;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001037 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +00001038 /* Turn on optimization if a .pyo file is given */
1039 if (strcmp(ext, ".pyo") == 0)
1040 Py_OptimizeFlag = 1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001041 v = run_pyc_file(fp, filename, d, d, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001042 } else {
Tim Petersd08e3822003-04-17 15:24:21 +00001043 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001044 closeit, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001045 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001046 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +00001047 PyErr_Print();
Guido van Rossumd8faa362007-04-27 19:54:29 +00001048 ret = -1;
1049 goto done;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001050 }
Guido van Rossum82598051997-03-05 00:20:32 +00001051 Py_DECREF(v);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001052 ret = 0;
1053 done:
1054 if (set_file_name && PyDict_DelItemString(d, "__file__"))
1055 PyErr_Clear();
1056 return ret;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001057}
1058
1059int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001060PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
Guido van Rossum393661d2001-08-31 17:40:15 +00001061{
Guido van Rossum82598051997-03-05 00:20:32 +00001062 PyObject *m, *d, *v;
1063 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001064 if (m == NULL)
1065 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +00001066 d = PyModule_GetDict(m);
Guido van Rossum393661d2001-08-31 17:40:15 +00001067 v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001068 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +00001069 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001070 return -1;
1071 }
Guido van Rossum82598051997-03-05 00:20:32 +00001072 Py_DECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001073 return 0;
1074}
1075
Barry Warsaw035574d1997-08-29 22:07:17 +00001076static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001077parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
1078 int *lineno, int *offset, const char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +00001079{
1080 long hold;
1081 PyObject *v;
1082
1083 /* old style errors */
1084 if (PyTuple_Check(err))
Neal Norwitz78293352002-04-01 01:41:20 +00001085 return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001086 lineno, offset, text);
Barry Warsaw035574d1997-08-29 22:07:17 +00001087
1088 /* new style errors. `err' is an instance */
1089
1090 if (! (v = PyObject_GetAttrString(err, "msg")))
1091 goto finally;
1092 *message = v;
1093
1094 if (!(v = PyObject_GetAttrString(err, "filename")))
1095 goto finally;
1096 if (v == Py_None)
1097 *filename = NULL;
1098 else if (! (*filename = PyString_AsString(v)))
1099 goto finally;
1100
1101 Py_DECREF(v);
1102 if (!(v = PyObject_GetAttrString(err, "lineno")))
1103 goto finally;
1104 hold = PyInt_AsLong(v);
1105 Py_DECREF(v);
1106 v = NULL;
1107 if (hold < 0 && PyErr_Occurred())
1108 goto finally;
1109 *lineno = (int)hold;
1110
1111 if (!(v = PyObject_GetAttrString(err, "offset")))
1112 goto finally;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001113 if (v == Py_None) {
1114 *offset = -1;
1115 Py_DECREF(v);
1116 v = NULL;
1117 } else {
1118 hold = PyInt_AsLong(v);
1119 Py_DECREF(v);
1120 v = NULL;
1121 if (hold < 0 && PyErr_Occurred())
1122 goto finally;
1123 *offset = (int)hold;
1124 }
Barry Warsaw035574d1997-08-29 22:07:17 +00001125
1126 if (!(v = PyObject_GetAttrString(err, "text")))
1127 goto finally;
1128 if (v == Py_None)
1129 *text = NULL;
Guido van Rossumc5724de2007-10-10 21:38:59 +00001130 else if (!PyUnicode_Check(v) ||
1131 !(*text = PyUnicode_AsString(v)))
Barry Warsaw035574d1997-08-29 22:07:17 +00001132 goto finally;
1133 Py_DECREF(v);
1134 return 1;
1135
1136finally:
1137 Py_XDECREF(v);
1138 return 0;
1139}
1140
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001141void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001142PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001143{
Guido van Rossuma61691e1998-02-06 22:27:24 +00001144 PyErr_PrintEx(1);
1145}
1146
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001147static void
Martin v. Löwis95292d62002-12-11 14:04:59 +00001148print_error_text(PyObject *f, int offset, const char *text)
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001149{
1150 char *nl;
1151 if (offset >= 0) {
1152 if (offset > 0 && offset == (int)strlen(text))
1153 offset--;
1154 for (;;) {
1155 nl = strchr(text, '\n');
1156 if (nl == NULL || nl-text >= offset)
1157 break;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001158 offset -= (int)(nl+1-text);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001159 text = nl+1;
1160 }
1161 while (*text == ' ' || *text == '\t') {
1162 text++;
1163 offset--;
1164 }
1165 }
1166 PyFile_WriteString(" ", f);
1167 PyFile_WriteString(text, f);
1168 if (*text == '\0' || text[strlen(text)-1] != '\n')
1169 PyFile_WriteString("\n", f);
1170 if (offset == -1)
1171 return;
1172 PyFile_WriteString(" ", f);
1173 offset--;
1174 while (offset > 0) {
1175 PyFile_WriteString(" ", f);
1176 offset--;
1177 }
1178 PyFile_WriteString("^\n", f);
1179}
1180
Guido van Rossum66e8e862001-03-23 17:54:43 +00001181static void
1182handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001183{
Neal Norwitz9589ee22006-03-04 19:01:22 +00001184 PyObject *exception, *value, *tb;
1185 int exitcode = 0;
Tim Peterscf615b52003-04-19 18:47:02 +00001186
Guido van Rossumd8faa362007-04-27 19:54:29 +00001187 if (Py_InspectFlag)
1188 /* Don't exit if -i flag was given. This flag is set to 0
1189 * when entering interactive mode for inspecting. */
1190 return;
1191
Guido van Rossum66e8e862001-03-23 17:54:43 +00001192 PyErr_Fetch(&exception, &value, &tb);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001193 fflush(stdout);
1194 if (value == NULL || value == Py_None)
Tim Peterscf615b52003-04-19 18:47:02 +00001195 goto done;
Brett Cannonbf364092006-03-01 04:25:17 +00001196 if (PyExceptionInstance_Check(value)) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001197 /* The error code should be in the `code' attribute. */
1198 PyObject *code = PyObject_GetAttrString(value, "code");
1199 if (code) {
1200 Py_DECREF(value);
1201 value = code;
1202 if (value == Py_None)
Tim Peterscf615b52003-04-19 18:47:02 +00001203 goto done;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001204 }
1205 /* If we failed to dig out the 'code' attribute,
1206 just let the else clause below print the error. */
1207 }
1208 if (PyInt_Check(value))
Tim Peterscf615b52003-04-19 18:47:02 +00001209 exitcode = (int)PyInt_AsLong(value);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001210 else {
1211 PyObject_Print(value, stderr, Py_PRINT_RAW);
1212 PySys_WriteStderr("\n");
Tim Peterscf615b52003-04-19 18:47:02 +00001213 exitcode = 1;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001214 }
Tim Peterscf615b52003-04-19 18:47:02 +00001215 done:
Neal Norwitz9589ee22006-03-04 19:01:22 +00001216 /* Restore and clear the exception info, in order to properly decref
1217 * the exception, value, and traceback. If we just exit instead,
1218 * these leak, which confuses PYTHONDUMPREFS output, and may prevent
1219 * some finalizers from running.
1220 */
Tim Peterscf615b52003-04-19 18:47:02 +00001221 PyErr_Restore(exception, value, tb);
1222 PyErr_Clear();
1223 Py_Exit(exitcode);
1224 /* NOTREACHED */
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001225}
1226
1227void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001228PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +00001229{
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001230 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001231
1232 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1233 handle_system_exit();
1234 }
Guido van Rossum82598051997-03-05 00:20:32 +00001235 PyErr_Fetch(&exception, &v, &tb);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001236 if (exception == NULL)
1237 return;
Barry Warsaw035574d1997-08-29 22:07:17 +00001238 PyErr_NormalizeException(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001239 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +00001240 return;
Guido van Rossum9d785502006-03-07 18:31:44 +00001241 /* Now we know v != NULL too */
Guido van Rossuma61691e1998-02-06 22:27:24 +00001242 if (set_sys_last_vars) {
1243 PySys_SetObject("last_type", exception);
1244 PySys_SetObject("last_value", v);
Guido van Rossumc5724de2007-10-10 21:38:59 +00001245 PySys_SetObject("last_traceback", tb ? tb : Py_None);
Guido van Rossuma61691e1998-02-06 22:27:24 +00001246 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001247 hook = PySys_GetObject("excepthook");
1248 if (hook) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001249 PyObject *args = PyTuple_Pack(3,
Guido van Rossum9d785502006-03-07 18:31:44 +00001250 exception, v, tb ? tb : Py_None);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001251 PyObject *result = PyEval_CallObject(hook, args);
1252 if (result == NULL) {
1253 PyObject *exception2, *v2, *tb2;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001254 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1255 handle_system_exit();
1256 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001257 PyErr_Fetch(&exception2, &v2, &tb2);
1258 PyErr_NormalizeException(&exception2, &v2, &tb2);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001259 /* It should not be possible for exception2 or v2
1260 to be NULL. However PyErr_Display() can't
1261 tolerate NULLs, so just be safe. */
1262 if (exception2 == NULL) {
1263 exception2 = Py_None;
1264 Py_INCREF(exception2);
1265 }
1266 if (v2 == NULL) {
1267 v2 = Py_None;
1268 Py_INCREF(v2);
1269 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001270 fflush(stdout);
1271 PySys_WriteStderr("Error in sys.excepthook:\n");
1272 PyErr_Display(exception2, v2, tb2);
1273 PySys_WriteStderr("\nOriginal exception was:\n");
1274 PyErr_Display(exception, v, tb);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001275 Py_DECREF(exception2);
1276 Py_DECREF(v2);
Jeremy Hylton07028582001-12-07 15:35:35 +00001277 Py_XDECREF(tb2);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001278 }
1279 Py_XDECREF(result);
1280 Py_XDECREF(args);
1281 } else {
1282 PySys_WriteStderr("sys.excepthook is missing\n");
1283 PyErr_Display(exception, v, tb);
1284 }
1285 Py_XDECREF(exception);
1286 Py_XDECREF(v);
1287 Py_XDECREF(tb);
1288}
1289
Thomas Wouters477c8d52006-05-27 19:21:47 +00001290void
1291PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001292{
1293 int err = 0;
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001294 PyObject *f = PySys_GetObject("stderr");
Armin Rigo5d2c6832004-03-22 20:16:58 +00001295 Py_INCREF(value);
Guido van Rossumce3a72a2007-10-19 23:16:50 +00001296 if (f == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00001297 _PyObject_Dump(value);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001298 fprintf(stderr, "lost sys.stderr\n");
Guido van Rossumce3a72a2007-10-19 23:16:50 +00001299 }
Guido van Rossum3165fe61992-09-25 21:59:05 +00001300 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001301 fflush(stdout);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001302 if (tb && tb != Py_None)
1303 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +00001304 if (err == 0 &&
Armin Rigo5d2c6832004-03-22 20:16:58 +00001305 PyObject_HasAttrString(value, "print_file_and_line"))
Barry Warsaw36b8f941997-08-26 18:09:48 +00001306 {
Guido van Rossum82598051997-03-05 00:20:32 +00001307 PyObject *message;
Martin v. Löwis95292d62002-12-11 14:04:59 +00001308 const char *filename, *text;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001309 int lineno, offset;
Armin Rigo5d2c6832004-03-22 20:16:58 +00001310 if (!parse_syntax_error(value, &message, &filename,
Barry Warsaw035574d1997-08-29 22:07:17 +00001311 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +00001312 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001313 else {
1314 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +00001315 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001316 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +00001317 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001318 else
Guido van Rossum82598051997-03-05 00:20:32 +00001319 PyFile_WriteString(filename, f);
1320 PyFile_WriteString("\", line ", f);
Jeremy Hylton518ab1c2001-11-28 20:42:20 +00001321 PyOS_snprintf(buf, sizeof(buf), "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +00001322 PyFile_WriteString(buf, f);
1323 PyFile_WriteString("\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001324 if (text != NULL)
1325 print_error_text(f, offset, text);
Armin Rigo5d2c6832004-03-22 20:16:58 +00001326 Py_DECREF(value);
1327 value = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001328 /* Can't be bothered to check all those
1329 PyFile_WriteString() calls */
1330 if (PyErr_Occurred())
1331 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001332 }
1333 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001334 if (err) {
1335 /* Don't do anything else */
1336 }
Brett Cannonbf364092006-03-01 04:25:17 +00001337 else if (PyExceptionClass_Check(exception)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001338 PyObject* moduleName;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001339 char* className = PyExceptionClass_Name(exception);
1340 if (className != NULL) {
1341 char *dot = strrchr(className, '.');
1342 if (dot != NULL)
1343 className = dot+1;
1344 }
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001345
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001346 moduleName = PyObject_GetAttrString(exception, "__module__");
Guido van Rossumc5724de2007-10-10 21:38:59 +00001347 if (moduleName == NULL || !PyUnicode_Check(moduleName))
1348 {
1349 Py_DECREF(moduleName);
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001350 err = PyFile_WriteString("<unknown>", f);
Guido van Rossumc5724de2007-10-10 21:38:59 +00001351 }
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001352 else {
Guido van Rossumc5724de2007-10-10 21:38:59 +00001353 char* modstr = PyUnicode_AsString(moduleName);
Neal Norwitz2633c692007-02-26 22:22:47 +00001354 if (modstr && strcmp(modstr, "__builtin__"))
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001355 {
1356 err = PyFile_WriteString(modstr, f);
1357 err += PyFile_WriteString(".", f);
1358 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001359 Py_DECREF(moduleName);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001360 }
1361 if (err == 0) {
1362 if (className == NULL)
1363 err = PyFile_WriteString("<unknown>", f);
1364 else
Brett Cannonbf364092006-03-01 04:25:17 +00001365 err = PyFile_WriteString(className, f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001366 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001367 }
1368 else
1369 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
Brett Cannon2e63b732006-03-02 18:34:57 +00001370 if (err == 0 && (value != Py_None)) {
Guido van Rossumc5724de2007-10-10 21:38:59 +00001371 PyObject *s = PyObject_Unicode(value);
Brett Cannon2e63b732006-03-02 18:34:57 +00001372 /* only print colon if the str() of the
1373 object is not the empty string
1374 */
1375 if (s == NULL)
1376 err = -1;
Guido van Rossumc5724de2007-10-10 21:38:59 +00001377 else if (!PyUnicode_Check(s) ||
1378 PyUnicode_GetSize(s) != 0)
Brett Cannon2e63b732006-03-02 18:34:57 +00001379 err = PyFile_WriteString(": ", f);
1380 if (err == 0)
1381 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1382 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +00001383 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001384 /* try to write a newline in any case */
1385 err += PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001386 }
Armin Rigo5d2c6832004-03-22 20:16:58 +00001387 Py_DECREF(value);
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001388 /* If an error happened here, don't show it.
1389 XXX This is wrong, but too many callers rely on this behavior. */
1390 if (err != 0)
1391 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001392}
1393
Guido van Rossum82598051997-03-05 00:20:32 +00001394PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001395PyRun_StringFlags(const char *str, int start, PyObject *globals,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001396 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001397{
Neal Norwitze92fba02006-03-04 18:52:26 +00001398 PyObject *ret = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001399 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001400 PyArena *arena = PyArena_New();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001401 if (arena == NULL)
1402 return NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001403
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001404 mod = PyParser_ASTFromString(str, "<string>", start, flags, arena);
Neal Norwitze92fba02006-03-04 18:52:26 +00001405 if (mod != NULL)
1406 ret = run_mod(mod, "<string>", globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001407 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001408 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001409}
1410
1411PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001412PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001413 PyObject *locals, int closeit, PyCompilerFlags *flags)
1414{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415 PyObject *ret;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001416 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001417 PyArena *arena = PyArena_New();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001418 if (arena == NULL)
1419 return NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001420
Martin v. Löwis85bcc662007-09-04 09:18:06 +00001421 mod = PyParser_ASTFromFile(fp, filename, NULL, start, 0, 0,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001422 flags, NULL, arena);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001423 if (closeit)
1424 fclose(fp);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001425 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001426 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001427 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001428 }
Neal Norwitze92fba02006-03-04 18:52:26 +00001429 ret = run_mod(mod, filename, globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001430 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001432}
1433
Guido van Rossum82598051997-03-05 00:20:32 +00001434static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001436 PyCompilerFlags *flags, PyArena *arena)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001437{
Guido van Rossum82598051997-03-05 00:20:32 +00001438 PyCodeObject *co;
1439 PyObject *v;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001440 co = PyAST_Compile(mod, filename, flags, arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001441 if (co == NULL)
1442 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001443 v = PyEval_EvalCode(co, globals, locals);
1444 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001445 return v;
1446}
1447
Guido van Rossum82598051997-03-05 00:20:32 +00001448static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001449run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001451{
Guido van Rossum82598051997-03-05 00:20:32 +00001452 PyCodeObject *co;
1453 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001454 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001455 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001456
Guido van Rossum82598051997-03-05 00:20:32 +00001457 magic = PyMarshal_ReadLongFromFile(fp);
1458 if (magic != PyImport_GetMagicNumber()) {
1459 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001460 "Bad magic number in .pyc file");
1461 return NULL;
1462 }
Guido van Rossum82598051997-03-05 00:20:32 +00001463 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001464 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001465 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001466 if (v == NULL || !PyCode_Check(v)) {
1467 Py_XDECREF(v);
1468 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001469 "Bad code object in .pyc file");
1470 return NULL;
1471 }
Guido van Rossum82598051997-03-05 00:20:32 +00001472 co = (PyCodeObject *)v;
1473 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001474 if (v && flags)
1475 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001476 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001477 return v;
1478}
1479
Guido van Rossum82598051997-03-05 00:20:32 +00001480PyObject *
Tim Petersd08e3822003-04-17 15:24:21 +00001481Py_CompileStringFlags(const char *str, const char *filename, int start,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001482 PyCompilerFlags *flags)
1483{
Guido van Rossum82598051997-03-05 00:20:32 +00001484 PyCodeObject *co;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001485 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001486 PyArena *arena = PyArena_New();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001487 if (arena == NULL)
1488 return NULL;
1489
1490 mod = PyParser_ASTFromString(str, filename, start, flags, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001491 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001492 PyArena_Free(arena);
Guido van Rossum5b722181993-03-30 17:46:03 +00001493 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001494 }
Martin v. Löwis2b366e42006-02-26 22:12:35 +00001495 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001496 PyObject *result = PyAST_mod2obj(mod);
1497 PyArena_Free(arena);
1498 return result;
1499 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001500 co = PyAST_Compile(mod, filename, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001501 PyArena_Free(arena);
Guido van Rossum82598051997-03-05 00:20:32 +00001502 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001503}
1504
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001505struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001506Py_SymtableString(const char *str, const char *filename, int start)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001507{
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001508 struct symtable *st;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001509 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001510 PyArena *arena = PyArena_New();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001511 if (arena == NULL)
1512 return NULL;
1513
1514 mod = PyParser_ASTFromString(str, filename, start, NULL, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001515 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001516 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001517 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001518 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001519 st = PySymtable_Build(mod, filename, 0);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001520 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001521 return st;
1522}
1523
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001524/* Preferred access to parser is through AST. */
1525mod_ty
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001526PyParser_ASTFromString(const char *s, const char *filename, int start,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001527 PyCompilerFlags *flags, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001528{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529 mod_ty mod;
1530 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001531 node *n = PyParser_ParseStringFlagsFilename(s, filename,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001532 &_PyParser_Grammar, start, &err,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001533 PARSER_FLAGS(flags));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534 if (n) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001535 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001536 PyNode_Free(n);
1537 return mod;
1538 }
1539 else {
1540 err_input(&err);
1541 return NULL;
1542 }
1543}
1544
1545mod_ty
Martin v. Löwis85bcc662007-09-04 09:18:06 +00001546PyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc,
1547 int start, char *ps1,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001548 char *ps2, PyCompilerFlags *flags, int *errcode,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001549 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001550{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551 mod_ty mod;
1552 perrdetail err;
Martin v. Löwis85bcc662007-09-04 09:18:06 +00001553 node *n = PyParser_ParseFileFlags(fp, filename, enc,
1554 &_PyParser_Grammar,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001555 start, ps1, ps2, &err, PARSER_FLAGS(flags));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001556 if (n) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001557 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558 PyNode_Free(n);
1559 return mod;
1560 }
1561 else {
1562 err_input(&err);
1563 if (errcode)
1564 *errcode = err.error;
1565 return NULL;
1566 }
1567}
1568
Guido van Rossuma110aa61994-08-29 12:50:44 +00001569/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001570
Guido van Rossuma110aa61994-08-29 12:50:44 +00001571node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001572PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001573{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001574 perrdetail err;
Martin v. Löwis85bcc662007-09-04 09:18:06 +00001575 node *n = PyParser_ParseFileFlags(fp, filename, NULL,
1576 &_PyParser_Grammar,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001577 start, NULL, NULL, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001578 if (n == NULL)
1579 err_input(&err);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001580
Guido van Rossuma110aa61994-08-29 12:50:44 +00001581 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001582}
1583
Guido van Rossuma110aa61994-08-29 12:50:44 +00001584/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001585
Guido van Rossuma110aa61994-08-29 12:50:44 +00001586node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001587PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
Tim Petersfe2127d2001-07-16 05:37:24 +00001588{
Tim Petersfe2127d2001-07-16 05:37:24 +00001589 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001590 node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
1591 start, &err, flags);
Tim Petersfe2127d2001-07-16 05:37:24 +00001592 if (n == NULL)
1593 err_input(&err);
1594 return n;
1595}
1596
1597node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001598PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
Thomas Heller6b17abf2002-07-09 09:23:27 +00001599 int start, int flags)
1600{
Thomas Heller6b17abf2002-07-09 09:23:27 +00001601 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001602 node *n = PyParser_ParseStringFlagsFilename(str, filename,
1603 &_PyParser_Grammar, start, &err, flags);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001604 if (n == NULL)
1605 err_input(&err);
1606 return n;
1607}
1608
1609node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001610PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001611{
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001612 return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001613}
1614
Guido van Rossum66ebd912003-04-17 16:02:26 +00001615/* May want to move a more generalized form of this to parsetok.c or
1616 even parser modules. */
1617
1618void
1619PyParser_SetError(perrdetail *err)
1620{
1621 err_input(err);
1622}
1623
Guido van Rossuma110aa61994-08-29 12:50:44 +00001624/* Set the error appropriate to the given input error code (see errcode.h) */
1625
1626static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001627err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001628{
Martin v. Löwis5deb2102007-08-31 11:17:42 +00001629 PyObject *v, *w, *errtype, *errtext;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001630 PyObject* u = NULL;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001631 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001632 errtype = PyExc_SyntaxError;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001633 switch (err->error) {
1634 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001635 errtype = PyExc_IndentationError;
1636 if (err->expected == INDENT)
1637 msg = "expected an indented block";
1638 else if (err->token == INDENT)
1639 msg = "unexpected indent";
1640 else if (err->token == DEDENT)
1641 msg = "unexpected unindent";
1642 else {
1643 errtype = PyExc_SyntaxError;
1644 msg = "invalid syntax";
1645 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001646 break;
1647 case E_TOKEN:
1648 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001649 break;
Skip Montanaro118ec702002-08-15 01:20:16 +00001650 case E_EOFS:
1651 msg = "EOF while scanning triple-quoted string";
1652 break;
1653 case E_EOLS:
1654 msg = "EOL while scanning single-quoted string";
1655 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001656 case E_INTR:
Michael W. Hudson30ea2f22004-07-07 17:44:12 +00001657 if (!PyErr_Occurred())
1658 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001659 return;
1660 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001661 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001662 return;
1663 case E_EOF:
1664 msg = "unexpected EOF while parsing";
1665 break;
Fred Drake85f36392000-07-11 17:53:00 +00001666 case E_TABSPACE:
1667 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001668 msg = "inconsistent use of tabs and spaces in indentation";
1669 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001670 case E_OVERFLOW:
1671 msg = "expression too long";
1672 break;
Fred Drake85f36392000-07-11 17:53:00 +00001673 case E_DEDENT:
1674 errtype = PyExc_IndentationError;
1675 msg = "unindent does not match any outer indentation level";
1676 break;
1677 case E_TOODEEP:
1678 errtype = PyExc_IndentationError;
1679 msg = "too many levels of indentation";
1680 break;
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001681 case E_DECODE: {
1682 PyObject *type, *value, *tb;
1683 PyErr_Fetch(&type, &value, &tb);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001684 if (value != NULL) {
Guido van Rossumc5724de2007-10-10 21:38:59 +00001685 u = PyObject_Unicode(value);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001686 if (u != NULL) {
Guido van Rossumc5724de2007-10-10 21:38:59 +00001687 msg = PyUnicode_AsString(u);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001688 }
1689 }
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001690 if (msg == NULL)
1691 msg = "unknown decode error";
Neal Norwitzdb83eb32005-12-18 05:29:30 +00001692 Py_XDECREF(type);
1693 Py_XDECREF(value);
Neal Norwitz40d37812005-10-02 01:48:49 +00001694 Py_XDECREF(tb);
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001695 break;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001696 }
Martin v. Löwis4bf108d2005-03-03 11:45:45 +00001697 case E_LINECONT:
1698 msg = "unexpected character after line continuation character";
1699 break;
Martin v. Löwis47383402007-08-15 07:32:56 +00001700
1701 case E_IDENTIFIER:
1702 msg = "invalid character in identifier";
1703 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001704 default:
1705 fprintf(stderr, "error=%d\n", err->error);
1706 msg = "unknown parsing error";
1707 break;
1708 }
Martin v. Löwis5deb2102007-08-31 11:17:42 +00001709 /* err->text may not be UTF-8 in case of decoding errors.
1710 Explicitly convert to an object. */
1711 if (!err->text) {
1712 errtext = Py_None;
1713 Py_INCREF(Py_None);
1714 } else {
1715 errtext = PyUnicode_DecodeUTF8(err->text, strlen(err->text),
1716 "replace");
1717 }
1718 v = Py_BuildValue("(ziiN)", err->filename,
1719 err->lineno, err->offset, errtext);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001720 if (err->text != NULL) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001721 PyObject_FREE(err->text);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001722 err->text = NULL;
1723 }
1724 w = NULL;
1725 if (v != NULL)
1726 w = Py_BuildValue("(sO)", msg, v);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001727 Py_XDECREF(u);
Guido van Rossum41318302001-03-23 04:01:07 +00001728 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001729 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001730 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001731}
1732
1733/* Print fatal error message and abort */
1734
1735void
Tim Peters7c321a82002-07-09 02:57:01 +00001736Py_FatalError(const char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001737{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001738 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossumce3a72a2007-10-19 23:16:50 +00001739 if (PyErr_Occurred()) {
1740 PyErr_Print();
1741 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001742#ifdef MS_WINDOWS
Guido van Rossum23c94461997-05-22 20:21:30 +00001743 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001744 OutputDebugString(msg);
1745 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001746#ifdef _DEBUG
1747 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001748#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001749#endif /* MS_WINDOWS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001750 abort();
1751}
1752
1753/* Clean up and exit */
1754
Guido van Rossuma110aa61994-08-29 12:50:44 +00001755#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001756#include "pythread.h"
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001757#endif
1758
Collin Winter670e6922007-03-21 02:57:17 +00001759static void (*pyexitfunc)(void) = NULL;
1760/* For the atexit module. */
1761void _Py_PyAtExit(void (*func)(void))
1762{
1763 pyexitfunc = func;
1764}
1765
1766static void
1767call_py_exitfuncs(void)
1768{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001769 if (pyexitfunc == NULL)
Collin Winter670e6922007-03-21 02:57:17 +00001770 return;
1771
1772 (*pyexitfunc)();
1773 PyErr_Clear();
1774}
1775
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001776#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001777static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001778static int nexitfuncs = 0;
1779
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001780int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001781{
1782 if (nexitfuncs >= NEXITFUNCS)
1783 return -1;
1784 exitfuncs[nexitfuncs++] = func;
1785 return 0;
1786}
1787
Guido van Rossumcc283f51997-08-05 02:22:03 +00001788static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001789call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001790{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001791 while (nexitfuncs > 0)
1792 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001793
1794 fflush(stdout);
1795 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001796}
1797
1798void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001799Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001800{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001801 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001802
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001803 exit(sts);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001804}
1805
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001807initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001808{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001809#ifdef SIGPIPE
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001810 PyOS_setsig(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001811#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00001812#ifdef SIGXFZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001813 PyOS_setsig(SIGXFZ, SIG_IGN);
Guido van Rossum70d893a2001-08-16 08:21:42 +00001814#endif
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001815#ifdef SIGXFSZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001816 PyOS_setsig(SIGXFSZ, SIG_IGN);
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001817#endif
Guido van Rossum82598051997-03-05 00:20:32 +00001818 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001819}
1820
Guido van Rossum7433b121997-02-14 19:45:36 +00001821
1822/*
1823 * The file descriptor fd is considered ``interactive'' if either
1824 * a) isatty(fd) is TRUE, or
1825 * b) the -i flag was given, and the filename associated with
1826 * the descriptor is NULL or "<stdin>" or "???".
1827 */
1828int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001829Py_FdIsInteractive(FILE *fp, const char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001830{
1831 if (isatty((int)fileno(fp)))
1832 return 1;
1833 if (!Py_InteractiveFlag)
1834 return 0;
1835 return (filename == NULL) ||
1836 (strcmp(filename, "<stdin>") == 0) ||
1837 (strcmp(filename, "???") == 0);
1838}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001839
1840
Tim Petersd08e3822003-04-17 15:24:21 +00001841#if defined(USE_STACKCHECK)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001842#if defined(WIN32) && defined(_MSC_VER)
1843
1844/* Stack checking for Microsoft C */
1845
1846#include <malloc.h>
1847#include <excpt.h>
1848
Fred Drakee8de31c2000-08-31 05:38:39 +00001849/*
1850 * Return non-zero when we run out of memory on the stack; zero otherwise.
1851 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001852int
Fred Drake399739f2000-08-31 05:52:44 +00001853PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001854{
1855 __try {
Tim Peters92e4dd82002-10-05 01:47:34 +00001856 /* alloca throws a stack overflow exception if there's
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001857 not enough space left on the stack */
Tim Peters92e4dd82002-10-05 01:47:34 +00001858 alloca(PYOS_STACK_MARGIN * sizeof(void*));
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001859 return 0;
1860 } __except (EXCEPTION_EXECUTE_HANDLER) {
1861 /* just ignore all errors */
1862 }
1863 return 1;
1864}
1865
1866#endif /* WIN32 && _MSC_VER */
1867
1868/* Alternate implementations can be added here... */
1869
1870#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001871
1872
1873/* Wrappers around sigaction() or signal(). */
1874
1875PyOS_sighandler_t
1876PyOS_getsig(int sig)
1877{
1878#ifdef HAVE_SIGACTION
1879 struct sigaction context;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001880 if (sigaction(sig, NULL, &context) == -1)
1881 return SIG_ERR;
Guido van Rossum6f256182000-09-16 16:32:19 +00001882 return context.sa_handler;
1883#else
1884 PyOS_sighandler_t handler;
Martin v. Löwisb45b3152005-11-28 17:34:23 +00001885/* Special signal handling for the secure CRT in Visual Studio 2005 */
1886#if defined(_MSC_VER) && _MSC_VER >= 1400
1887 switch (sig) {
1888 /* Only these signals are valid */
1889 case SIGINT:
1890 case SIGILL:
1891 case SIGFPE:
1892 case SIGSEGV:
1893 case SIGTERM:
1894 case SIGBREAK:
1895 case SIGABRT:
1896 break;
1897 /* Don't call signal() with other values or it will assert */
1898 default:
1899 return SIG_ERR;
1900 }
1901#endif /* _MSC_VER && _MSC_VER >= 1400 */
Guido van Rossum6f256182000-09-16 16:32:19 +00001902 handler = signal(sig, SIG_IGN);
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001903 if (handler != SIG_ERR)
1904 signal(sig, handler);
Guido van Rossum6f256182000-09-16 16:32:19 +00001905 return handler;
1906#endif
1907}
1908
1909PyOS_sighandler_t
1910PyOS_setsig(int sig, PyOS_sighandler_t handler)
1911{
1912#ifdef HAVE_SIGACTION
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001913 struct sigaction context, ocontext;
Guido van Rossum6f256182000-09-16 16:32:19 +00001914 context.sa_handler = handler;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001915 sigemptyset(&context.sa_mask);
1916 context.sa_flags = 0;
1917 if (sigaction(sig, &context, &ocontext) == -1)
1918 return SIG_ERR;
1919 return ocontext.sa_handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001920#else
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001921 PyOS_sighandler_t oldhandler;
1922 oldhandler = signal(sig, handler);
1923#ifdef HAVE_SIGINTERRUPT
1924 siginterrupt(sig, 1);
1925#endif
1926 return oldhandler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001927#endif
1928}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929
1930/* Deprecated C API functions still provided for binary compatiblity */
1931
1932#undef PyParser_SimpleParseFile
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001933PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001934PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
1935{
1936 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1937}
1938
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001939#undef PyParser_SimpleParseString
1940PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941PyParser_SimpleParseString(const char *str, int start)
1942{
1943 return PyParser_SimpleParseStringFlags(str, start, 0);
1944}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001945
1946#undef PyRun_AnyFile
1947PyAPI_FUNC(int)
1948PyRun_AnyFile(FILE *fp, const char *name)
1949{
1950 return PyRun_AnyFileExFlags(fp, name, 0, NULL);
1951}
1952
1953#undef PyRun_AnyFileEx
1954PyAPI_FUNC(int)
1955PyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
1956{
1957 return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
1958}
1959
1960#undef PyRun_AnyFileFlags
1961PyAPI_FUNC(int)
1962PyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
1963{
1964 return PyRun_AnyFileExFlags(fp, name, 0, flags);
1965}
1966
1967#undef PyRun_File
1968PyAPI_FUNC(PyObject *)
1969PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
1970{
1971 return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
1972}
1973
1974#undef PyRun_FileEx
1975PyAPI_FUNC(PyObject *)
1976PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
1977{
1978 return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
1979}
1980
1981#undef PyRun_FileFlags
1982PyAPI_FUNC(PyObject *)
1983PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
1984 PyCompilerFlags *flags)
1985{
1986 return PyRun_FileExFlags(fp, p, s, g, l, 0, flags);
1987}
1988
1989#undef PyRun_SimpleFile
1990PyAPI_FUNC(int)
1991PyRun_SimpleFile(FILE *f, const char *p)
1992{
1993 return PyRun_SimpleFileExFlags(f, p, 0, NULL);
1994}
1995
1996#undef PyRun_SimpleFileEx
1997PyAPI_FUNC(int)
1998PyRun_SimpleFileEx(FILE *f, const char *p, int c)
1999{
2000 return PyRun_SimpleFileExFlags(f, p, c, NULL);
2001}
2002
2003
2004#undef PyRun_String
2005PyAPI_FUNC(PyObject *)
2006PyRun_String(const char *str, int s, PyObject *g, PyObject *l)
2007{
2008 return PyRun_StringFlags(str, s, g, l, NULL);
2009}
2010
2011#undef PyRun_SimpleString
2012PyAPI_FUNC(int)
2013PyRun_SimpleString(const char *s)
2014{
2015 return PyRun_SimpleStringFlags(s, NULL);
2016}
2017
2018#undef Py_CompileString
2019PyAPI_FUNC(PyObject *)
2020Py_CompileString(const char *str, const char *p, int s)
2021{
2022 return Py_CompileStringFlags(str, p, s, NULL);
2023}
2024
2025#undef PyRun_InteractiveOne
2026PyAPI_FUNC(int)
2027PyRun_InteractiveOne(FILE *f, const char *p)
2028{
2029 return PyRun_InteractiveOneFlags(f, p, NULL);
2030}
2031
2032#undef PyRun_InteractiveLoop
2033PyAPI_FUNC(int)
2034PyRun_InteractiveLoop(FILE *f, const char *p)
2035{
2036 return PyRun_InteractiveLoopFlags(f, p, NULL);
2037}
2038
2039#ifdef __cplusplus
2040}
2041#endif