pythonrun.c revision 3e0055f8c65c407e74ce476b8e2b1fb889723514
11984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
21984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Python interpreter top-level routines, including init/exit */
31984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum#include "Python.h"
51984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
63e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "Python-ast.h"
71984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "grammar.h"
81984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "node.h"
985f363990cbd6df21015eebdc171c533176e3407Fred Drake#include "token.h"
101984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "parsetok.h"
111984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "errcode.h"
123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "code.h"
131984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "compile.h"
144b38da664c107bc08768235a66621429beef5444Jeremy Hylton#include "symtable.h"
153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "ast.h"
16ff4949eeee7f86117d4a69599777ff5564315e39Guido van Rossum#include "eval.h"
17fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum#include "marshal.h"
181984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
19a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum#include <signal.h>
20a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum
2173d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#ifdef HAVE_LANGINFO_H
2273d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#include <locale.h>
2373d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#include <langinfo.h>
2473d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#endif
2573d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis
266238d2b024f061159b2613387ff700695c10deefMartin v. Löwis#ifdef MS_WINDOWS
27a44823b7764281d398215564f2070257d08d0855Guido van Rossum#undef BYTE
28a44823b7764281d398215564f2070257d08d0855Guido van Rossum#include "windows.h"
29a44823b7764281d398215564f2070257d08d0855Guido van Rossum#endif
30a44823b7764281d398215564f2070257d08d0855Guido van Rossum
31f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersextern char *Py_GetPath(void);
321984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
3382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumextern grammar _PyParser_Grammar; /* From graminit.c */
341984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
35b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossum/* Forward */
36dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void initmain(void);
37dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void initsite(void);
383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyObject *run_err_mod(mod_ty, const char *, PyObject *, PyObject *,
399f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton			      PyCompilerFlags *);
403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
419f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton			  PyCompilerFlags *);
4295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwisstatic PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
43bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton			      PyCompilerFlags *);
44dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void err_input(perrdetail *);
45dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void initsigs(void);
46dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void call_sys_exitfunc(void);
47dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void call_ll_exitfuncs(void);
48f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersextern void _PyUnicode_Init(void);
49f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersextern void _PyUnicode_Fini(void);
50c94044c11d5e1f61443163d1c5ea44019d7c5871Guido van Rossum
518d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond#ifdef WITH_THREAD
528d98d2cb95ac37147a4de5a119869211e8351324Mark Hammondextern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
538d98d2cb95ac37147a4de5a119869211e8351324Mark Hammondextern void _PyGILState_Fini(void);
548d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond#endif /* WITH_THREAD */
558d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond
5682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumint Py_DebugFlag; /* Needed by parser.c */
5782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumint Py_VerboseFlag; /* Needed by import.c */
587433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossumint Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
59dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossumint Py_NoSiteFlag; /* Suppress 'import site' */
603ce096459e348c95c2c3348f8d84720f25c1a4c9Barry Warsawint Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
61a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossumint Py_FrozenFlag; /* Needed by getpath.c */
62b16d197d661915bf16c84e06cb07e1f7a934ad10Guido van Rossumint Py_UnicodeFlag = 0; /* Needed by compile.c */
637d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauerint Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
643caca2326e04ea3c0d1f8c6a588e646d8201af38Tim Peters/* _XXX Py_QnewFlag should go away in 2.3.  It's true iff -Qnew is passed,
653caca2326e04ea3c0d1f8c6a588e646d8201af38Tim Peters  on the command line, and is used in 2.2 by ceval.c to make all "/" divisions
663caca2326e04ea3c0d1f8c6a588e646d8201af38Tim Peters  true divisions (which they will be in 2.3). */
673caca2326e04ea3c0d1f8c6a588e646d8201af38Tim Petersint _Py_QnewFlag = 0;
681984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
69a43fd0c8996eec2bdd0ec59edc252cb4f4ff4436Mark Hammond/* Reference to 'warnings' module, to avoid importing it
70edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond   on the fly when the import lock may be held.  See 683658/771097
71a43fd0c8996eec2bdd0ec59edc252cb4f4ff4436Mark Hammond*/
72edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammondstatic PyObject *warnings_module = NULL;
73edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond
74edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond/* Returns a borrowed reference to the 'warnings' module, or NULL.
75edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond   If the module is returned, it is guaranteed to have been obtained
76edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond   without acquiring the import lock
77edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond*/
78a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. LöwisPyObject *PyModule_GetWarningsModule(void)
79edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond{
80edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	PyObject *typ, *val, *tb;
81edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	PyObject *all_modules;
82edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	/* If we managed to get the module at init time, just use it */
83edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	if (warnings_module)
84edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond		return warnings_module;
85edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	/* If it wasn't available at init time, it may be available
86edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	   now in sys.modules (common scenario is frozen apps: import
87edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	   at init time fails, but the frozen init code sets up sys.path
88edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	   correctly, then does an implicit import of warnings for us
89edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	*/
90edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	/* Save and restore any exceptions */
91edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	PyErr_Fetch(&typ, &val, &tb);
92edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond
935f4e8ca3767db1b9e2b783d0dacf15ea1fbf0589Mark Hammond	all_modules = PySys_GetObject("modules");
94edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	if (all_modules) {
95edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond		warnings_module = PyDict_GetItemString(all_modules, "warnings");
96edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond		/* We keep a ref in the global */
97edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond		Py_XINCREF(warnings_module);
98edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	}
99edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	PyErr_Restore(typ, val, tb);
100edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	return warnings_module;
101edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond}
102a43fd0c8996eec2bdd0ec59edc252cb4f4ff4436Mark Hammond
10325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossumstatic int initialized = 0;
10425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
1057e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters/* API to access the initialized flag -- useful for esoteric use */
106e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum
107e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossumint
108f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_IsInitialized(void)
109e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum{
110e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum	return initialized;
111e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum}
112e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum
11325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum/* Global initializations.  Can be undone by Py_Finalize().  Don't
11425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   call this twice without an intervening Py_Finalize() call.  When
11525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   initializations fail, a fatal error is issued and the function does
11625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   not return.  On return, the first thread and interpreter state have
11725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   been created.
11825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
11925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   Locking: you must hold the interpreter lock while calling this.
12025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   (If the lock has not yet been initialized, that's equivalent to
12125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   having the lock, but you cannot use multiple threads.)
12225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
12325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum*/
1241984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1259abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossumstatic int
1269abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossumadd_flag(int flag, const char *envs)
1279abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum{
1289abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum	int env = atoi(envs);
1299abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum	if (flag < env)
1309abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum		flag = env;
1319abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum	if (flag < 1)
1329abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum		flag = 1;
1339abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum	return flag;
1349abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum}
1359abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum
1361984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumvoid
137336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. LöwisPy_InitializeEx(int install_sigs)
1381984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
13925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyInterpreterState *interp;
14025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyThreadState *tstate;
14125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyObject *bimod, *sysmod;
14225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	char *p;
143a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
144a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis	char *codeset;
145a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis	char *saved_locale;
146a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis	PyObject *sys_stream, *sys_isatty;
147a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis#endif
14870d893a6aaf335383d2efcf7c40194e4f1a7e474Guido van Rossum	extern void _Py_ReadyTypes(void);
14925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
150dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum	if (initialized)
151aa61505fd222fb15cc2507c8a2a44dcfce0c971fGuido van Rossum		return;
152dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum	initialized = 1;
153d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters
1547d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
1559abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum		Py_DebugFlag = add_flag(Py_DebugFlag, p);
1567d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
1579abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum		Py_VerboseFlag = add_flag(Py_VerboseFlag, p);
1587d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
1599abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum		Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
16025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
16125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	interp = PyInterpreterState_New();
16225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	if (interp == NULL)
16325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		Py_FatalError("Py_Initialize: can't make first interpreter");
16425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
16525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	tstate = PyThreadState_New(interp);
16625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	if (tstate == NULL)
16725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		Py_FatalError("Py_Initialize: can't make first thread");
16825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	(void) PyThreadState_Swap(tstate);
1691984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
17070d893a6aaf335383d2efcf7c40194e4f1a7e474Guido van Rossum	_Py_ReadyTypes();
171528b7eb0b0fa5a6bbbf5f3dfbfb7c356edaf031cGuido van Rossum
172b2501f4cd18f65cc671482ceb1abe88c289b664cNeal Norwitz	if (!_PyFrame_Init())
173c91ed400e053dc9f11dd30c84e2bb611999dce50Neal Norwitz		Py_FatalError("Py_Initialize: can't init frames");
174c91ed400e053dc9f11dd30c84e2bb611999dce50Neal Norwitz
175b2501f4cd18f65cc671482ceb1abe88c289b664cNeal Norwitz	if (!_PyInt_Init())
176c91ed400e053dc9f11dd30c84e2bb611999dce50Neal Norwitz		Py_FatalError("Py_Initialize: can't init ints");
177c91ed400e053dc9f11dd30c84e2bb611999dce50Neal Norwitz
178ba283e2b7f3d970246fbd53981b18234b6ca447cMichael W. Hudson	_PyFloat_Init();
179ba283e2b7f3d970246fbd53981b18234b6ca447cMichael W. Hudson
18025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	interp->modules = PyDict_New();
18125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	if (interp->modules == NULL)
18225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		Py_FatalError("Py_Initialize: can't make modules dictionary");
18325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
184339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#ifdef Py_USING_UNICODE
185c94044c11d5e1f61443163d1c5ea44019d7c5871Guido van Rossum	/* Init Unicode implementation; relies on the codec registry */
186c94044c11d5e1f61443163d1c5ea44019d7c5871Guido van Rossum	_PyUnicode_Init();
187339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#endif
188c94044c11d5e1f61443163d1c5ea44019d7c5871Guido van Rossum
189f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw	bimod = _PyBuiltin_Init();
19025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	if (bimod == NULL)
19125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		Py_FatalError("Py_Initialize: can't initialize __builtin__");
1924a1f39a26bd5ff97f0388b2a35ea6edf089a0e07Guido van Rossum	interp->builtins = PyModule_GetDict(bimod);
1934a1f39a26bd5ff97f0388b2a35ea6edf089a0e07Guido van Rossum	Py_INCREF(interp->builtins);
19425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
19525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	sysmod = _PySys_Init();
19625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	if (sysmod == NULL)
19725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		Py_FatalError("Py_Initialize: can't initialize sys");
19825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	interp->sysdict = PyModule_GetDict(sysmod);
19925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	Py_INCREF(interp->sysdict);
20025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	_PyImport_FixupExtension("sys", "sys");
20182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PySys_SetPath(Py_GetPath());
20225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyDict_SetItemString(interp->sysdict, "modules",
20325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum			     interp->modules);
20425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
2057c85ab829db9628a2f093767966cd92d6f71607bGuido van Rossum	_PyImport_Init();
2067c85ab829db9628a2f093767966cd92d6f71607bGuido van Rossum
207f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw	/* initialize builtin exceptions */
2086d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters	_PyExc_Init();
2095821bc5145437fd68f4ebc9dad01d1192462f60dBarry Warsaw	_PyImport_FixupExtension("exceptions", "exceptions");
210f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw
211035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	/* phase 2 of builtins */
212963b871e86bd85b7fb3551fa9fac5363977fc43bBarry Warsaw	_PyImport_FixupExtension("__builtin__", "__builtin__");
213035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
21452e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum	_PyImportHooks_Init();
21552e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum
216336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis	if (install_sigs)
217336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis		initsigs(); /* Signal handling stuff, including initintr() */
2186135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum
21925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	initmain(); /* Module __main__ */
220dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum	if (!Py_NoSiteFlag)
221dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum		initsite(); /* Module site */
2225bfba3aeb9f451599b89f6239467d485f4370b81Just van Rossum
2238d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond	/* auto-thread-state API, if available */
2248d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond#ifdef WITH_THREAD
2258d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond	_PyGILState_Init(interp, tstate);
2268d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond#endif /* WITH_THREAD */
2278d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond
228edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	warnings_module = PyImport_ImportModule("warnings");
229edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	if (!warnings_module)
230edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond		PyErr_Clear();
23173d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis
23273d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
23373d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis	/* On Unix, set the file system encoding according to the
23473d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis	   user's preference, if the CODESET names a well-known
23573d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis	   Python codec, and Py_FileSystemDefaultEncoding isn't
236a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis	   initialized by other means. Also set the encoding of
237a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis	   stdin and stdout if these are terminals.  */
238a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis
239f56d015a7123de2df3a32bc38f666a79dd8cab79Martin v. Löwis	saved_locale = strdup(setlocale(LC_CTYPE, NULL));
240a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis	setlocale(LC_CTYPE, "");
241a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis	codeset = nl_langinfo(CODESET);
242a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis	if (codeset && *codeset) {
243a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		PyObject *enc = PyCodec_Encoder(codeset);
244a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		if (enc) {
245a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis			codeset = strdup(codeset);
246a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis			Py_DECREF(enc);
247a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		} else {
248a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis			codeset = NULL;
249a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis			PyErr_Clear();
250a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		}
251a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis	} else
252a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		codeset = NULL;
253a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis	setlocale(LC_CTYPE, saved_locale);
254f56d015a7123de2df3a32bc38f666a79dd8cab79Martin v. Löwis	free(saved_locale);
255a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis
256a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis	if (codeset) {
25768debc935b01b55ab4daf4032131101f86dc750eMichael W. Hudson		sys_stream = PySys_GetObject("stdin");
258a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
259a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		if (!sys_isatty)
260a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis			PyErr_Clear();
261a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
262a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis			if (!PyFile_SetEncoding(sys_stream, codeset))
263a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis				Py_FatalError("Cannot set codeset of stdin");
26473d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis		}
265a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		Py_XDECREF(sys_isatty);
266a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis
267a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		sys_stream = PySys_GetObject("stdout");
268a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
269a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		if (!sys_isatty)
270a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis			PyErr_Clear();
271a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
272a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis			if (!PyFile_SetEncoding(sys_stream, codeset))
273a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis				Py_FatalError("Cannot set codeset of stdout");
274a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		}
275a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		Py_XDECREF(sys_isatty);
276a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis
277a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		if (!Py_FileSystemDefaultEncoding)
278a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis			Py_FileSystemDefaultEncoding = codeset;
279a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis		else
280a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis			free(codeset);
28173d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis	}
28273d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#endif
2836135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum}
2846135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum
285336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwisvoid
286336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. LöwisPy_Initialize(void)
287336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis{
288336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis	Py_InitializeEx(1);
289336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis}
290336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis
291336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis
2922edcf0d71c2938b4f7159bf586c2174326d57bd6Guido van Rossum#ifdef COUNT_ALLOCS
293dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersextern void dump_counts(void);
2942edcf0d71c2938b4f7159bf586c2174326d57bd6Guido van Rossum#endif
2952edcf0d71c2938b4f7159bf586c2174326d57bd6Guido van Rossum
29625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum/* Undo the effect of Py_Initialize().
29725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
29825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   Beware: if multiple interpreter and/or thread states exist, these
29925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   are not wiped out; only the current thread and interpreter state
30025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   are deleted.  But since everything else is deleted, those other
30125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   interpreter and thread states should no longer be used.
30225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
30325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   (XXX We should do better, e.g. wipe out all interpreters and
30425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   threads.)
30525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
30625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   Locking: as above.
30725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
30825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum*/
309a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum
310a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossumvoid
311f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_Finalize(void)
312a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum{
31325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyInterpreterState *interp;
314a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum	PyThreadState *tstate;
31525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
316dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum	if (!initialized)
317aa61505fd222fb15cc2507c8a2a44dcfce0c971fGuido van Rossum		return;
31825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
319384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters	/* The interpreter is still entirely intact at this point, and the
320384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters	 * exit funcs may be relying on that.  In particular, if some thread
321384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters	 * or exit func is still waiting to do an import, the import machinery
322384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters	 * expects Py_IsInitialized() to return true.  So don't say the
323384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters	 * interpreter is uninitialized until after the exit funcs have run.
324384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters	 * Note that Threading.py uses an exit func to do a join on all the
325384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters	 * threads created thru it, so this also protects pending imports in
326384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters	 * the threads created via Threading.
327384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters	 */
3284cc462e85b1c2c393460e780c314e73691e15852Guido van Rossum	call_sys_exitfunc();
329384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters	initialized = 0;
3304cc462e85b1c2c393460e780c314e73691e15852Guido van Rossum
3313a44e1b9fbf914769083239a1c5deb1a71b2862dGuido van Rossum	/* Get current thread state and interpreter pointer */
332e5662aedef12b8d49c5c6c52d0e3fb47e66dbe0aNicholas Bastin	tstate = PyThreadState_GET();
33325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	interp = tstate->interp;
33425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
3353a44e1b9fbf914769083239a1c5deb1a71b2862dGuido van Rossum	/* Disable signal handling */
3363a44e1b9fbf914769083239a1c5deb1a71b2862dGuido van Rossum	PyOS_FiniInterrupts();
3373a44e1b9fbf914769083239a1c5deb1a71b2862dGuido van Rossum
338a43fd0c8996eec2bdd0ec59edc252cb4f4ff4436Mark Hammond	/* drop module references we saved */
339edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	Py_XDECREF(warnings_module);
340edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond	warnings_module = NULL;
341a43fd0c8996eec2bdd0ec59edc252cb4f4ff4436Mark Hammond
342e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum	/* Collect garbage.  This may call finalizers; it's nice to call these
3431d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * before all modules are destroyed.
3441d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX If a __del__ or weakref callback is triggered here, and tries to
3451d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX import a module, bad things can happen, because Python no
3461d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX longer believes it's initialized.
3471d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX     Fatal Python error: Interpreter not initialized (version mismatch?)
3481d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX is easy to provoke that way.  I've also seen, e.g.,
3491d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX     Exception exceptions.ImportError: 'No module named sha'
3501d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX         in <function callback at 0x008F5718> ignored
3511d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX but I'm unclear on exactly how that one happens.  In any case,
3521d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX I haven't seen a real-life report of either of these.
3531d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters         */
354e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum	PyGC_Collect();
355e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum
3563a44e1b9fbf914769083239a1c5deb1a71b2862dGuido van Rossum	/* Destroy all modules */
35725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyImport_Cleanup();
3583a44e1b9fbf914769083239a1c5deb1a71b2862dGuido van Rossum
359e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum	/* Collect final garbage.  This disposes of cycles created by
3601d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * new-style class definitions, for example.
3611d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX This is disabled because it caused too many problems.  If
3621d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX a __del__ or weakref callback triggers here, Python code has
3631d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX a hard time running, because even the sys module has been
3641d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
3651d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX One symptom is a sequence of information-free messages
3661d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX coming from threads (if a __del__ or callback is invoked,
3671d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX other threads can execute too, and any exception they encounter
3681d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX triggers a comedy of errors as subsystem after subsystem
3691d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX fails to find what it *expects* to find in sys to help report
3701d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX the exception and consequent unexpected failures).  I've also
3711d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX seen segfaults then, after adding print statements to the
3721d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 * XXX Python code getting called.
3731d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters	 */
3741d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters#if 0
375e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum	PyGC_Collect();
3761d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters#endif
377e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum
3781707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum	/* Destroy the database used by _PyImport_{Fixup,Find}Extension */
3791707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum	_PyImport_Fini();
3801707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum
3811707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum	/* Debugging stuff */
3821707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum#ifdef COUNT_ALLOCS
3831707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum	dump_counts();
3841707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum#endif
3851707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum
3861707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum#ifdef Py_REF_DEBUG
3871707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum	fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
3881707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum#endif
3891707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum
3909cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters#ifdef Py_TRACE_REFS
3919cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters	/* Display all objects still alive -- this can invoke arbitrary
3929cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters	 * __repr__ overrides, so requires a mostly-intact interpreter.
3939cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters	 * Alas, a lot of stuff may still be alive now that will be cleaned
3949cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters	 * up later.
3959cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters	 */
396269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters	if (Py_GETENV("PYTHONDUMPREFS"))
3979cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters		_Py_PrintReferences(stderr);
3989cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters#endif /* Py_TRACE_REFS */
3999cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters
4006cb9029a2273ae2d9ca3c3a0a7fe1111111c2713Mark Hammond	/* Cleanup auto-thread-state */
4016cb9029a2273ae2d9ca3c3a0a7fe1111111c2713Mark Hammond#ifdef WITH_THREAD
4026cb9029a2273ae2d9ca3c3a0a7fe1111111c2713Mark Hammond	_PyGILState_Fini();
4036cb9029a2273ae2d9ca3c3a0a7fe1111111c2713Mark Hammond#endif /* WITH_THREAD */
4046cb9029a2273ae2d9ca3c3a0a7fe1111111c2713Mark Hammond
405d922fa46ce0763e63c3d6a14bc89059b0eef33eaGuido van Rossum	/* Clear interpreter state */
406f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw	PyInterpreterState_Clear(interp);
407d922fa46ce0763e63c3d6a14bc89059b0eef33eaGuido van Rossum
40812b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter	/* Now we decref the exception classes.  After this point nothing
40912b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter	   can raise an exception.  That's okay, because each Fini() method
41012b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter	   below has been checked to make sure no exceptions are ever
41112b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter	   raised.
41212b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter	*/
41312b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter
41412b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter	_PyExc_Fini();
41512b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter
416d922fa46ce0763e63c3d6a14bc89059b0eef33eaGuido van Rossum	/* Delete current thread */
417f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw	PyThreadState_Swap(NULL);
418f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw	PyInterpreterState_Delete(interp);
419f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw
420d922fa46ce0763e63c3d6a14bc89059b0eef33eaGuido van Rossum	/* Sundry finalizers */
421cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	PyMethod_Fini();
422cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	PyFrame_Fini();
423cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	PyCFunction_Fini();
424cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	PyTuple_Fini();
425fb09f0e85cd75ec46700562687a9da3063ff0b7cRaymond Hettinger	PyList_Fini();
426d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger	PySet_Fini();
42725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyString_Fini();
428cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	PyInt_Fini();
429cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	PyFloat_Fini();
430cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum
43195de5c16310e0ace7dc2de17fd610daf19b9cdeaMarc-André Lemburg#ifdef Py_USING_UNICODE
43295de5c16310e0ace7dc2de17fd610daf19b9cdeaMarc-André Lemburg	/* Cleanup Unicode implementation */
43395de5c16310e0ace7dc2de17fd610daf19b9cdeaMarc-André Lemburg	_PyUnicode_Fini();
43495de5c16310e0ace7dc2de17fd610daf19b9cdeaMarc-André Lemburg#endif
43595de5c16310e0ace7dc2de17fd610daf19b9cdeaMarc-André Lemburg
436cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	/* XXX Still allocated:
437cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	   - various static ad-hoc pointers to interned strings
438cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	   - int and float free list blocks
439cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	   - whatever various modules and libraries allocate
440cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	*/
44125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
44225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
443cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum
444269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters#ifdef Py_TRACE_REFS
445269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters	/* Display addresses (& refcnts) of all objects still alive.
446269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters	 * An address can be used to find the repr of the object, printed
447269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters	 * above by _Py_PrintReferences.
448269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters	 */
449269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters	if (Py_GETENV("PYTHONDUMPREFS"))
450269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters		_Py_PrintReferenceAddresses(stderr);
451269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters#endif /* Py_TRACE_REFS */
4520e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters#ifdef PYMALLOC_DEBUG
4530e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters	if (Py_GETENV("PYTHONMALLOCSTATS"))
4540e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters		_PyObject_DebugMallocStats();
4550e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters#endif
4560e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters
457cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	call_ll_exitfuncs();
45825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum}
45925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
46025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum/* Create and initialize a new interpreter and thread, and return the
46125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   new thread.  This requires that Py_Initialize() has been called
46225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   first.
46325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
46425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   Unsuccessful initialization yields a NULL pointer.  Note that *no*
46525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   exception information is available even in this case -- the
46625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   exception information is held in the thread, and there is no
46725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   thread.
46825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
46925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   Locking: as above.
47025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
47125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum*/
47225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
47325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van RossumPyThreadState *
474f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_NewInterpreter(void)
47525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum{
476a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum	PyInterpreterState *interp;
47725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyThreadState *tstate, *save_tstate;
47825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyObject *bimod, *sysmod;
479ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum
48025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	if (!initialized)
48125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
482ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum
483a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum	interp = PyInterpreterState_New();
484a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum	if (interp == NULL)
48525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		return NULL;
486ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum
487a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum	tstate = PyThreadState_New(interp);
48825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	if (tstate == NULL) {
48925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		PyInterpreterState_Delete(interp);
49025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		return NULL;
49125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	}
492a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum
49325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	save_tstate = PyThreadState_Swap(tstate);
494a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum
49525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	/* XXX The following is lax in error checking */
49625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
49725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	interp->modules = PyDict_New();
49825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
49925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
50025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	if (bimod != NULL) {
5014a1f39a26bd5ff97f0388b2a35ea6edf089a0e07Guido van Rossum		interp->builtins = PyModule_GetDict(bimod);
5024a1f39a26bd5ff97f0388b2a35ea6edf089a0e07Guido van Rossum		Py_INCREF(interp->builtins);
50325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	}
50425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	sysmod = _PyImport_FindExtension("sys", "sys");
50525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	if (bimod != NULL && sysmod != NULL) {
50625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		interp->sysdict = PyModule_GetDict(sysmod);
50725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		Py_INCREF(interp->sysdict);
50825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		PySys_SetPath(Py_GetPath());
50925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		PyDict_SetItemString(interp->sysdict, "modules",
51025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum				     interp->modules);
511d7ceb222bd19ea25b0b4d234623df0a9f73c96b5Martin v. Löwis		_PyImportHooks_Init();
51225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		initmain();
513dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum		if (!Py_NoSiteFlag)
514dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum			initsite();
51525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	}
51625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
51725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	if (!PyErr_Occurred())
51825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		return tstate;
51925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
52025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	/* Oops, it didn't work.  Undo it all. */
52125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
52225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyErr_Print();
52325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyThreadState_Clear(tstate);
52425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyThreadState_Swap(save_tstate);
52525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyThreadState_Delete(tstate);
52625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyInterpreterState_Delete(interp);
52725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
52825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	return NULL;
52925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum}
53025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
53125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum/* Delete an interpreter and its last thread.  This requires that the
53225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   given thread state is current, that the thread has no remaining
53325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   frames, and that it is its interpreter's only remaining thread.
53425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   It is a fatal error to violate these constraints.
53525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
53625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   (Py_Finalize() doesn't have these constraints -- it zaps
53725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   everything, regardless.)
53825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
53925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   Locking: as above.
54025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
54125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum*/
54225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
54325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossumvoid
544f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_EndInterpreter(PyThreadState *tstate)
54525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum{
54625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyInterpreterState *interp = tstate->interp;
54725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
548e5662aedef12b8d49c5c6c52d0e3fb47e66dbe0aNicholas Bastin	if (tstate != PyThreadState_GET())
54925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		Py_FatalError("Py_EndInterpreter: thread is not current");
55025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	if (tstate->frame != NULL)
55125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		Py_FatalError("Py_EndInterpreter: thread still has a frame");
55225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	if (tstate != interp->tstate_head || tstate->next != NULL)
55325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum		Py_FatalError("Py_EndInterpreter: not the last thread");
55425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
55525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyImport_Cleanup();
55625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyInterpreterState_Clear(interp);
55725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyThreadState_Swap(NULL);
55825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	PyInterpreterState_Delete(interp);
559ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum}
560ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum
561ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossumstatic char *progname = "python";
562ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum
563ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossumvoid
564f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_SetProgramName(char *pn)
565ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum{
566ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum	if (pn && *pn)
567ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum		progname = pn;
568ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum}
569ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum
570ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossumchar *
571f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_GetProgramName(void)
572ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum{
573ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum	return progname;
574a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum}
575a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum
576a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossumstatic char *default_home = NULL;
577a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum
578a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossumvoid
579f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_SetPythonHome(char *home)
580a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum{
581a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum	default_home = home;
582a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum}
583a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum
584a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossumchar *
585f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_GetPythonHome(void)
586a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum{
587a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum	char *home = default_home;
5887d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer	if (home == NULL && !Py_IgnoreEnvironmentFlag)
5897d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer		home = Py_GETENV("PYTHONHOME");
590a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum	return home;
591a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum}
592a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum
5936135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum/* Create __main__ module */
5946135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum
5956135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossumstatic void
596f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersinitmain(void)
5976135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum{
59882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyObject *m, *d;
59982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	m = PyImport_AddModule("__main__");
6006135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum	if (m == NULL)
60182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		Py_FatalError("can't create __main__ module");
60282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	d = PyModule_GetDict(m);
60382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	if (PyDict_GetItemString(d, "__builtins__") == NULL) {
604858cb73bb2643b73f4262857c865db285280e900Guido van Rossum		PyObject *bimod = PyImport_ImportModule("__builtin__");
605858cb73bb2643b73f4262857c865db285280e900Guido van Rossum		if (bimod == NULL ||
606858cb73bb2643b73f4262857c865db285280e900Guido van Rossum		    PyDict_SetItemString(d, "__builtins__", bimod) != 0)
60782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum			Py_FatalError("can't add __builtins__ to __main__");
6083d05b1a0ae8ad4acf733f03b45cf9c51bf3ff47cBarry Warsaw		Py_DECREF(bimod);
6096135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum	}
6101984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
6111984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
612dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum/* Import the site module (not into __main__ though) */
613dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum
614dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossumstatic void
615f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersinitsite(void)
616dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum{
617dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum	PyObject *m, *f;
618dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum	m = PyImport_ImportModule("site");
619dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum	if (m == NULL) {
620dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum		f = PySys_GetObject("stderr");
621dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum		if (Py_VerboseFlag) {
622dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum			PyFile_WriteString(
623dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum				"'import site' failed; traceback:\n", f);
624dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum			PyErr_Print();
625dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum		}
626dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum		else {
627dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum			PyFile_WriteString(
628dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum			  "'import site' failed; use -v for traceback\n", f);
629dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum			PyErr_Clear();
630dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum		}
631dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum	}
632dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum	else {
633dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum		Py_DECREF(m);
634dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum	}
635dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum}
636dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum
6371984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Parse input from a file and execute it */
6381984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
6391984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint
6403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyRun_AnyFileExFlags(FILE *fp, char *filename, int closeit,
641bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		     PyCompilerFlags *flags)
642bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{
6431984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	if (filename == NULL)
6441984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum		filename = "???";
6450df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum	if (Py_FdIsInteractive(fp, filename)) {
646bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
6470df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum		if (closeit)
6480df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum			fclose(fp);
6490df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum		return err;
6500df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum	}
6511984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	else
652bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
6531984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
6541984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
6551984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint
65695292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
657bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{
65882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyObject *v;
6591984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	int ret;
660bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton	PyCompilerFlags local_flags;
6619f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton
662bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton	if (flags == NULL) {
663bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		flags = &local_flags;
6645ba58662817b708a453020f0425fe4747ea6d5cbTim Peters		local_flags.cf_flags = 0;
665bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton	}
66682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	v = PySys_GetObject("ps1");
6671984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	if (v == NULL) {
66882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		PySys_SetObject("ps1", v = PyString_FromString(">>> "));
66982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		Py_XDECREF(v);
6701984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	}
67182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	v = PySys_GetObject("ps2");
6721984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	if (v == NULL) {
67382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		PySys_SetObject("ps2", v = PyString_FromString("... "));
67482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		Py_XDECREF(v);
6751984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	}
6761984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	for (;;) {
677bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		ret = PyRun_InteractiveOneFlags(fp, filename, flags);
678aae0d32f6639894f33f336bad115660ad82de5d2Guido van Rossum#ifdef Py_REF_DEBUG
6796f9e433ab3520d06fd3bc0c97a6ba49c0d67816dGuido van Rossum		fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
6801984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#endif
6811984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum		if (ret == E_EOF)
6821984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum			return 0;
6831984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum		/*
6841984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum		if (ret == E_NOMEM)
6851984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum			return -1;
6861984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum		*/
6871984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	}
6881984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
6891984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
690c24ea08644279224a7a8be419648261f9566c9b3Neil Schemenauer/* compute parser flags based on compiler flags */
691c24ea08644279224a7a8be419648261f9566c9b3Neil Schemenauer#define PARSER_FLAGS(flags) \
6924b499dd3fb49181efbd99f87e45ff923146cba8aGuido van Rossum	(((flags) && (flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
6934b499dd3fb49181efbd99f87e45ff923146cba8aGuido van Rossum		PyPARSE_DONT_IMPLY_DEDENT : 0)
694c24ea08644279224a7a8be419648261f9566c9b3Neil Schemenauer
6959f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hyltonint
69695292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
6979f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton{
69882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyObject *m, *d, *v, *w;
6993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	mod_ty mod;
700ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum	char *ps1 = "", *ps2 = "";
7013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	int errcode = 0;
702fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Peters
70382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	v = PySys_GetObject("ps1");
704ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum	if (v != NULL) {
705ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum		v = PyObject_Str(v);
706ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum		if (v == NULL)
707ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum			PyErr_Clear();
708ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum		else if (PyString_Check(v))
709ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum			ps1 = PyString_AsString(v);
7101984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	}
711ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum	w = PySys_GetObject("ps2");
712ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum	if (w != NULL) {
713ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum		w = PyObject_Str(w);
714ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum		if (w == NULL)
715ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum			PyErr_Clear();
716ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum		else if (PyString_Check(w))
717ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum			ps2 = PyString_AsString(w);
7181984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	}
7193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	mod = PyParser_ASTFromFile(fp, filename,
7203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				   Py_single_input, ps1, ps2,
7213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				   flags, &errcode);
72282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	Py_XDECREF(v);
72382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	Py_XDECREF(w);
7243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (mod == NULL) {
7253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (errcode == E_EOF) {
7263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			PyErr_Clear();
727a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum			return E_EOF;
728a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		}
72982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		PyErr_Print();
7303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return -1;
7311984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	}
73282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	m = PyImport_AddModule("__main__");
7331984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	if (m == NULL)
7341984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum		return -1;
73582598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	d = PyModule_GetDict(m);
7363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	v = run_mod(mod, filename, d, d, flags);
7373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	free_mod(mod);
7381984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	if (v == NULL) {
73982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		PyErr_Print();
7401984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum		return -1;
7411984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	}
74282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	Py_DECREF(v);
74378a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum	if (Py_FlushLine())
74478a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum		PyErr_Clear();
7451984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	return 0;
7461984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
7471984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
748be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis/* Check whether a file maybe a pyc file: Look at the extension,
749be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis   the file type, and, if we may close it, at the first few bytes. */
750be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis
751be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwisstatic int
75295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwismaybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
753be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis{
754be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis	if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
755be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis		return 1;
756be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis
757be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis	/* Only look into the file if we are allowed to close it, since
758be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis	   it then should also be seekable. */
759be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis	if (closeit) {
760be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis		/* Read only two bytes of the magic. If the file was opened in
761be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis		   text mode, the bytes 3 and 4 of the magic (\r\n) might not
762be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis		   be read as they are on disk. */
763be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis		unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
764be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis		unsigned char buf[2];
7653e876565a3913427fc64b57553cb6986f1f7512bTim Peters		/* Mess:  In case of -x, the stream is NOT at its start now,
7663e876565a3913427fc64b57553cb6986f1f7512bTim Peters		   and ungetc() was used to push back the first newline,
7676f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters		   which makes the current stream position formally undefined,
7686f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters		   and a x-platform nightmare.
7696f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters		   Unfortunately, we have no direct way to know whether -x
7706f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters		   was specified.  So we use a terrible hack:  if the current
7716f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters		   stream position is not 0, we assume -x was specified, and
7726f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters		   give up.  Bug 132850 on SourceForge spells out the
7736f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters		   hopelessness of trying anything else (fseek and ftell
7746f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters		   don't work predictably x-platform for text-mode files).
7753e876565a3913427fc64b57553cb6986f1f7512bTim Peters		*/
7763e876565a3913427fc64b57553cb6986f1f7512bTim Peters		int ispyc = 0;
7776f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters		if (ftell(fp) == 0) {
7786f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters			if (fread(buf, 1, 2, fp) == 2 &&
779d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters			    ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
7806f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters				ispyc = 1;
7816f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters			rewind(fp);
7826f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters		}
7833e876565a3913427fc64b57553cb6986f1f7512bTim Peters		return ispyc;
784be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis	}
785be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis	return 0;
786d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters}
787be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis
7880df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossumint
78995292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
790bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton			PyCompilerFlags *flags)
791bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{
79282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyObject *m, *d, *v;
79395292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwis	const char *ext;
794fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum
79582598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	m = PyImport_AddModule("__main__");
7961984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	if (m == NULL)
7971984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum		return -1;
79882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	d = PyModule_GetDict(m);
7998ed0204bc9249d314442158348b3949f1be50100Fred Drake	if (PyDict_GetItemString(d, "__file__") == NULL) {
8008ed0204bc9249d314442158348b3949f1be50100Fred Drake		PyObject *f = PyString_FromString(filename);
8018ed0204bc9249d314442158348b3949f1be50100Fred Drake		if (f == NULL)
8028ed0204bc9249d314442158348b3949f1be50100Fred Drake			return -1;
8038ed0204bc9249d314442158348b3949f1be50100Fred Drake		if (PyDict_SetItemString(d, "__file__", f) < 0) {
8048ed0204bc9249d314442158348b3949f1be50100Fred Drake			Py_DECREF(f);
8058ed0204bc9249d314442158348b3949f1be50100Fred Drake			return -1;
8068ed0204bc9249d314442158348b3949f1be50100Fred Drake		}
8078ed0204bc9249d314442158348b3949f1be50100Fred Drake		Py_DECREF(f);
8088ed0204bc9249d314442158348b3949f1be50100Fred Drake	}
809fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum	ext = filename + strlen(filename) - 4;
810be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis	if (maybe_pyc_file(fp, filename, ext, closeit)) {
811fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum		/* Try to run a pyc file. First, re-open in binary */
8120df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum		if (closeit)
8130df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum			fclose(fp);
8148ed0204bc9249d314442158348b3949f1be50100Fred Drake		if ((fp = fopen(filename, "rb")) == NULL) {
815fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum			fprintf(stderr, "python: Can't reopen .pyc file\n");
816fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum			return -1;
817fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum		}
8182a7f58de1c3011a9ed167172e628ecdc70dbdb82Guido van Rossum		/* Turn on optimization if a .pyo file is given */
8192a7f58de1c3011a9ed167172e628ecdc70dbdb82Guido van Rossum		if (strcmp(ext, ".pyo") == 0)
8202a7f58de1c3011a9ed167172e628ecdc70dbdb82Guido van Rossum			Py_OptimizeFlag = 1;
821bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		v = run_pyc_file(fp, filename, d, d, flags);
822fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum	} else {
823d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters		v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
824bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton				      closeit, flags);
825fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum	}
8261984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	if (v == NULL) {
82782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		PyErr_Print();
8281984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum		return -1;
8291984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	}
83082598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	Py_DECREF(v);
83178a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum	if (Py_FlushLine())
83278a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum		PyErr_Clear();
8331984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	return 0;
8341984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
8351984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
8361984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint
83795292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
838393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum{
83982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyObject *m, *d, *v;
84082598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	m = PyImport_AddModule("__main__");
8411984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	if (m == NULL)
8421984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum		return -1;
84382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	d = PyModule_GetDict(m);
844393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum	v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
8451984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	if (v == NULL) {
84682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		PyErr_Print();
8471984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum		return -1;
8481984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	}
84982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	Py_DECREF(v);
85078a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum	if (Py_FlushLine())
85178a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum		PyErr_Clear();
8521984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	return 0;
8531984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
8541984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
855035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsawstatic int
85695292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwisparse_syntax_error(PyObject *err, PyObject **message, const char **filename,
85795292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwis		   int *lineno, int *offset, const char **text)
858035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw{
859035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	long hold;
860035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	PyObject *v;
861035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
862035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	/* old style errors */
863035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	if (PyTuple_Check(err))
8647829335763ef520b909d657525f8a0a6e7b759dbNeal Norwitz		return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
8657829335763ef520b909d657525f8a0a6e7b759dbNeal Norwitz				        lineno, offset, text);
866035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
867035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	/* new style errors.  `err' is an instance */
868035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
869035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	if (! (v = PyObject_GetAttrString(err, "msg")))
870035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw		goto finally;
871035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	*message = v;
872035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
873035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	if (!(v = PyObject_GetAttrString(err, "filename")))
874035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw		goto finally;
875035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	if (v == Py_None)
876035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw		*filename = NULL;
877035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	else if (! (*filename = PyString_AsString(v)))
878035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw		goto finally;
879035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
880035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	Py_DECREF(v);
881035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	if (!(v = PyObject_GetAttrString(err, "lineno")))
882035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw		goto finally;
883035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	hold = PyInt_AsLong(v);
884035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	Py_DECREF(v);
885035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	v = NULL;
886035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	if (hold < 0 && PyErr_Occurred())
887035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw		goto finally;
888035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	*lineno = (int)hold;
889035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
890035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	if (!(v = PyObject_GetAttrString(err, "offset")))
891035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw		goto finally;
8929f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	if (v == Py_None) {
8939f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		*offset = -1;
8949f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		Py_DECREF(v);
8959f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		v = NULL;
8969f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	} else {
8979f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		hold = PyInt_AsLong(v);
8989f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		Py_DECREF(v);
8999f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		v = NULL;
9009f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		if (hold < 0 && PyErr_Occurred())
9019f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton			goto finally;
9029f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		*offset = (int)hold;
9039f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	}
904035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
905035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	if (!(v = PyObject_GetAttrString(err, "text")))
906035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw		goto finally;
907035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	if (v == Py_None)
908035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw		*text = NULL;
909035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	else if (! (*text = PyString_AsString(v)))
910035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw		goto finally;
911035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	Py_DECREF(v);
912035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	return 1;
913035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
914035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsawfinally:
915035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	Py_XDECREF(v);
916035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	return 0;
917035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw}
918035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
9191984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumvoid
920f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyErr_Print(void)
9211984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
922a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum	PyErr_PrintEx(1);
923a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum}
924a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum
9259f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hyltonstatic void
92695292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwisprint_error_text(PyObject *f, int offset, const char *text)
9279f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton{
9289f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	char *nl;
9299f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	if (offset >= 0) {
9309f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		if (offset > 0 && offset == (int)strlen(text))
9319f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton			offset--;
9329f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		for (;;) {
9339f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton			nl = strchr(text, '\n');
9349f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton			if (nl == NULL || nl-text >= offset)
9359f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton				break;
9369f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton			offset -= (nl+1-text);
9379f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton			text = nl+1;
9389f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		}
9399f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		while (*text == ' ' || *text == '\t') {
9409f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton			text++;
9419f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton			offset--;
9429f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		}
9439f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	}
9449f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	PyFile_WriteString("    ", f);
9459f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	PyFile_WriteString(text, f);
9469f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	if (*text == '\0' || text[strlen(text)-1] != '\n')
9479f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		PyFile_WriteString("\n", f);
9489f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	if (offset == -1)
9499f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		return;
9509f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	PyFile_WriteString("    ", f);
9519f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	offset--;
9529f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	while (offset > 0) {
9539f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		PyFile_WriteString(" ", f);
9549f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton		offset--;
9559f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	}
9569f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton	PyFile_WriteString("^\n", f);
9579f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton}
9589f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton
95966e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossumstatic void
96066e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossumhandle_system_exit(void)
96126fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee{
96266e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum        PyObject *exception, *value, *tb;
963cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters        int exitcode = 0;
964cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters
96566e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum	PyErr_Fetch(&exception, &value, &tb);
96626fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee	if (Py_FlushLine())
96726fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee		PyErr_Clear();
96826fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee	fflush(stdout);
96926fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee	if (value == NULL || value == Py_None)
970cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters		goto done;
97126fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee	if (PyInstance_Check(value)) {
97226fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee		/* The error code should be in the `code' attribute. */
97326fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee		PyObject *code = PyObject_GetAttrString(value, "code");
97426fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee		if (code) {
97526fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee			Py_DECREF(value);
97626fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee			value = code;
97726fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee			if (value == Py_None)
978cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters				goto done;
97926fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee		}
98026fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee		/* If we failed to dig out the 'code' attribute,
98126fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee		   just let the else clause below print the error. */
98226fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee	}
98326fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee	if (PyInt_Check(value))
984cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters		exitcode = (int)PyInt_AsLong(value);
98526fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee	else {
98626fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee		PyObject_Print(value, stderr, Py_PRINT_RAW);
98726fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee		PySys_WriteStderr("\n");
988cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters		exitcode = 1;
98926fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee	}
990cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters done:
991cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters 	/* Restore and clear the exception info, in order to properly decref
992cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters 	 * the exception, value, and traceback.  If we just exit instead,
993cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters 	 * these leak, which confuses PYTHONDUMPREFS output, and may prevent
994cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters 	 * some finalizers from running.
995cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters 	 */
996cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters	PyErr_Restore(exception, value, tb);
997cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters	PyErr_Clear();
998cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters	Py_Exit(exitcode);
999cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters	/* NOTREACHED */
100026fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee}
100126fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee
100226fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yeevoid
1003f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyErr_PrintEx(int set_sys_last_vars)
1004a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum{
1005b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee	PyObject *exception, *v, *tb, *hook;
100666e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum
100766e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum	if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
100866e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum		handle_system_exit();
100966e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum	}
101082598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyErr_Fetch(&exception, &v, &tb);
10113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (exception == NULL)
10123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return;
1013035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw	PyErr_NormalizeException(&exception, &v, &tb);
10141ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum	if (exception == NULL)
1015296b4751e1dc6b40504e45e795d52594bee720d2Guido van Rossum		return;
1016a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum	if (set_sys_last_vars) {
1017a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum		PySys_SetObject("last_type", exception);
1018a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum		PySys_SetObject("last_value", v);
1019a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum		PySys_SetObject("last_traceback", tb);
1020a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum	}
1021b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee	hook = PySys_GetObject("excepthook");
1022b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee	if (hook) {
10238ae468965700fd9900efc28bff8fa2015dae2befRaymond Hettinger		PyObject *args = PyTuple_Pack(3,
1024b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee                    exception, v ? v : Py_None, tb ? tb : Py_None);
1025b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee		PyObject *result = PyEval_CallObject(hook, args);
1026b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee		if (result == NULL) {
1027b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee			PyObject *exception2, *v2, *tb2;
102866e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum			if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
102966e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum				handle_system_exit();
103066e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum			}
1031b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee			PyErr_Fetch(&exception2, &v2, &tb2);
1032b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee			PyErr_NormalizeException(&exception2, &v2, &tb2);
1033b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee			if (Py_FlushLine())
1034b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee				PyErr_Clear();
1035b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee			fflush(stdout);
1036b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee			PySys_WriteStderr("Error in sys.excepthook:\n");
1037b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee			PyErr_Display(exception2, v2, tb2);
1038b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee			PySys_WriteStderr("\nOriginal exception was:\n");
1039b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee			PyErr_Display(exception, v, tb);
10400702858d733e1ab37e3e7bb6258557fd7aca3d10Jeremy Hylton			Py_XDECREF(exception2);
10410702858d733e1ab37e3e7bb6258557fd7aca3d10Jeremy Hylton			Py_XDECREF(v2);
10420702858d733e1ab37e3e7bb6258557fd7aca3d10Jeremy Hylton			Py_XDECREF(tb2);
1043b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee		}
1044b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee		Py_XDECREF(result);
1045b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee		Py_XDECREF(args);
1046b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee	} else {
1047b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee		PySys_WriteStderr("sys.excepthook is missing\n");
1048b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee		PyErr_Display(exception, v, tb);
1049b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee	}
1050b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee	Py_XDECREF(exception);
1051b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee	Py_XDECREF(v);
1052b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee	Py_XDECREF(tb);
1053b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee}
1054b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee
1055b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yeevoid PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
1056b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee{
1057b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee	int err = 0;
1058b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee	PyObject *f = PySys_GetObject("stderr");
10595d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo	Py_INCREF(value);
10603165fe6a56c07f4f85f4ea54b69f5b1f243e2463Guido van Rossum	if (f == NULL)
10613165fe6a56c07f4f85f4ea54b69f5b1f243e2463Guido van Rossum		fprintf(stderr, "lost sys.stderr\n");
10623165fe6a56c07f4f85f4ea54b69f5b1f243e2463Guido van Rossum	else {
10630829c754bbb7b3ea66801c7da69f6cb189b80543Guido van Rossum		if (Py_FlushLine())
10640829c754bbb7b3ea66801c7da69f6cb189b80543Guido van Rossum			PyErr_Clear();
106578a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum		fflush(stdout);
1066b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee		if (tb && tb != Py_None)
1067b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee			err = PyTraceBack_Print(tb, f);
106836b8f945e794e8483a185db3b6847c083a724e44Barry Warsaw		if (err == 0 &&
10695d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo		    PyObject_HasAttrString(value, "print_file_and_line"))
107036b8f945e794e8483a185db3b6847c083a724e44Barry Warsaw		{
107182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum			PyObject *message;
107295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwis			const char *filename, *text;
1073a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum			int lineno, offset;
10745d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo			if (!parse_syntax_error(value, &message, &filename,
1075035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw						&lineno, &offset, &text))
107682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum				PyErr_Clear();
1077a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum			else {
1078a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum				char buf[10];
107982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum				PyFile_WriteString("  File \"", f);
1080a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum				if (filename == NULL)
108182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum					PyFile_WriteString("<string>", f);
1082a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum				else
108382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum					PyFile_WriteString(filename, f);
108482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum				PyFile_WriteString("\", line ", f);
1085518ab1c02a01a1a502fedeccb62ea73f2a952ba7Jeremy Hylton				PyOS_snprintf(buf, sizeof(buf), "%d", lineno);
108682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum				PyFile_WriteString(buf, f);
108782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum				PyFile_WriteString("\n", f);
10889f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton				if (text != NULL)
10899f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton					print_error_text(f, offset, text);
10905d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo				Py_DECREF(value);
10915d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo				value = message;
109278a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum				/* Can't be bothered to check all those
109378a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum				   PyFile_WriteString() calls */
109478a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum				if (PyErr_Occurred())
109578a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum					err = -1;
1096a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum			}
1097a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		}
109878a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum		if (err) {
109978a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum			/* Don't do anything else */
110078a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum		}
110178a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum		else if (PyClass_Check(exception)) {
11022f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw			PyClassObject* exc = (PyClassObject*)exception;
11032f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw			PyObject* className = exc->cl_name;
11042f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw			PyObject* moduleName =
11052f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw			      PyDict_GetItemString(exc->cl_dict, "__module__");
11062f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw
11072f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw			if (moduleName == NULL)
110878a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum				err = PyFile_WriteString("<unknown>", f);
11092f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw			else {
11102f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw				char* modstr = PyString_AsString(moduleName);
1111d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters				if (modstr && strcmp(modstr, "exceptions"))
11122f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw				{
11132f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw					err = PyFile_WriteString(modstr, f);
11142f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw					err += PyFile_WriteString(".", f);
11152f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw				}
11162f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw			}
11172f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw			if (err == 0) {
11182f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw				if (className == NULL)
11192f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw				      err = PyFile_WriteString("<unknown>", f);
11202f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw				else
11212f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw				      err = PyFile_WriteObject(className, f,
11222f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw							       Py_PRINT_RAW);
11232f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw			}
1124262e124107806a16ba45e2b68a76d89ebb7d2dc8Guido van Rossum		}
112578a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum		else
112678a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum			err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
112778a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum		if (err == 0) {
11285d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo			if (value != Py_None) {
11295d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo				PyObject *s = PyObject_Str(value);
1130035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw				/* only print colon if the str() of the
1131035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw				   object is not the empty string
1132035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw				*/
1133d6bf45bcf669a13b2d8c3996b466c5171eca0e53Guido van Rossum				if (s == NULL)
1134d6bf45bcf669a13b2d8c3996b466c5171eca0e53Guido van Rossum					err = -1;
1135d6bf45bcf669a13b2d8c3996b466c5171eca0e53Guido van Rossum				else if (!PyString_Check(s) ||
1136d6bf45bcf669a13b2d8c3996b466c5171eca0e53Guido van Rossum					 PyString_GET_SIZE(s) != 0)
1137035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw					err = PyFile_WriteString(": ", f);
113878a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum				if (err == 0)
1139d6bf45bcf669a13b2d8c3996b466c5171eca0e53Guido van Rossum				  err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1140d6bf45bcf669a13b2d8c3996b466c5171eca0e53Guido van Rossum				Py_XDECREF(s);
114178a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum			}
11423165fe6a56c07f4f85f4ea54b69f5b1f243e2463Guido van Rossum		}
114378a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum		if (err == 0)
114478a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum			err = PyFile_WriteString("\n", f);
11451984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	}
11465d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo	Py_DECREF(value);
114778a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum	/* If an error happened here, don't show it.
114878a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum	   XXX This is wrong, but too many callers rely on this behavior. */
114978a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum	if (err != 0)
115078a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum		PyErr_Clear();
11511984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
11521984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
115382598051e6831fadad5f27a20f24f484a54691f3Guido van RossumPyObject *
11543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyRun_StringFlags(const char *str, int start, PyObject *globals,
11553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		  PyObject *locals, PyCompilerFlags *flags)
11561984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
11573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *ret;
11583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	mod_ty mod = PyParser_ASTFromString(str, "<string>", start, flags);
11593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	ret = run_err_mod(mod, "<string>", globals, locals, flags);
11603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	free_mod(mod);
11613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return ret;
1162bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton}
1163bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton
1164bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy HyltonPyObject *
116595292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
1166bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		  PyObject *locals, int closeit, PyCompilerFlags *flags)
1167bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{
11683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	PyObject *ret;
11693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	mod_ty mod = PyParser_ASTFromFile(fp, filename, start, 0, 0,
11703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					  flags, NULL);
11713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (mod == NULL)
11723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return NULL;
1173bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton	if (closeit)
1174bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		fclose(fp);
11753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	ret = run_err_mod(mod, filename, globals, locals, flags);
11763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	free_mod(mod);
11773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return ret;
1178bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton}
1179bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton
118082598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumstatic PyObject *
11813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonrun_err_mod(mod_ty mod, const char *filename, PyObject *globals,
11823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	    PyObject *locals, PyCompilerFlags *flags)
11831984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
11843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (mod == NULL)
1185a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		return  NULL;
11863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return run_mod(mod, filename, globals, locals, flags);
11871984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
11881984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
118982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumstatic PyObject *
11903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonrun_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
11919f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton	 PyCompilerFlags *flags)
11921984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
119382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyCodeObject *co;
119482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyObject *v;
11953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	co = PyAST_Compile(mod, filename, flags);
11961984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	if (co == NULL)
11971984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum		return NULL;
119882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	v = PyEval_EvalCode(co, globals, locals);
119982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	Py_DECREF(co);
12001984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	return v;
12011984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
12021984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
120382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumstatic PyObject *
12043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonrun_pyc_file(FILE *fp, const char *filename, PyObject *globals,
12053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	     PyObject *locals, PyCompilerFlags *flags)
1206fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum{
120782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyCodeObject *co;
120882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyObject *v;
1209fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum	long magic;
1210e8de31cbd094bf9e909e1cb12a19c6c3ca854dd7Fred Drake	long PyImport_GetMagicNumber(void);
1211fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum
121282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	magic = PyMarshal_ReadLongFromFile(fp);
121382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	if (magic != PyImport_GetMagicNumber()) {
121482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		PyErr_SetString(PyExc_RuntimeError,
1215fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum			   "Bad magic number in .pyc file");
1216fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum		return NULL;
1217fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum	}
121882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	(void) PyMarshal_ReadLongFromFile(fp);
1219d9b9ac855c6bb297e7d5549e0d140ff7f48ebee6Tim Peters	v = PyMarshal_ReadLastObjectFromFile(fp);
1220fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum	fclose(fp);
122182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	if (v == NULL || !PyCode_Check(v)) {
122282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		Py_XDECREF(v);
122382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		PyErr_SetString(PyExc_RuntimeError,
1224fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum			   "Bad code object in .pyc file");
1225fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum		return NULL;
1226fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum	}
122782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	co = (PyCodeObject *)v;
122882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	v = PyEval_EvalCode(co, globals, locals);
1229b857ba261fc468d956e350f51469efd7d5773da2Jeremy Hylton	if (v && flags)
1230b857ba261fc468d956e350f51469efd7d5773da2Jeremy Hylton		flags->cf_flags |= (co->co_flags & PyCF_MASK);
123182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	Py_DECREF(co);
1232fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum	return v;
1233fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum}
1234fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum
123582598051e6831fadad5f27a20f24f484a54691f3Guido van RossumPyObject *
1236d08e3824d40daa4c2fba9d6635256e44fe71936eTim PetersPy_CompileStringFlags(const char *str, const char *filename, int start,
1237bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton		      PyCompilerFlags *flags)
1238bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{
12393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	mod_ty mod;
124082598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyCodeObject *co;
12413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	mod = PyParser_ASTFromString(str, filename, start, flags);
12423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (mod == NULL)
12435b7221849e240c2a62ebbc48d58607417b42ef44Guido van Rossum		return NULL;
12443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	co = PyAST_Compile(mod, filename, flags);
12453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	free_mod(mod);
124682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	return (PyObject *)co;
12475b7221849e240c2a62ebbc48d58607417b42ef44Guido van Rossum}
12485b7221849e240c2a62ebbc48d58607417b42ef44Guido van Rossum
12494b38da664c107bc08768235a66621429beef5444Jeremy Hyltonstruct symtable *
125095292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPy_SymtableString(const char *str, const char *filename, int start)
12514b38da664c107bc08768235a66621429beef5444Jeremy Hylton{
12523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	mod_ty mod;
12534b38da664c107bc08768235a66621429beef5444Jeremy Hylton	struct symtable *st;
12543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	mod = PyParser_ASTFromString(str, filename, start, NULL);
12563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (mod == NULL)
12574b38da664c107bc08768235a66621429beef5444Jeremy Hylton		return NULL;
12583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	st = PySymtable_Build(mod, filename, 0);
12593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	free_mod(mod);
12604b38da664c107bc08768235a66621429beef5444Jeremy Hylton	return st;
12614b38da664c107bc08768235a66621429beef5444Jeremy Hylton}
12624b38da664c107bc08768235a66621429beef5444Jeremy Hylton
12633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Preferred access to parser is through AST. */
12643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonmod_ty
12653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_ASTFromString(const char *s, const char *filename, int start,
12663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		       PyCompilerFlags *flags)
12673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
12683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	node *n;
12693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	mod_ty mod;
12703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	perrdetail err;
12713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	n = PyParser_ParseStringFlagsFilename(s, filename, &_PyParser_Grammar,
12723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					      start, &err,
12733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton					      PARSER_FLAGS(flags));
12743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (n) {
12753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		mod = PyAST_FromNode(n, flags, filename);
12763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		PyNode_Free(n);
12773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return mod;
12783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
12793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	else {
12803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		err_input(&err);
12813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return NULL;
12823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
12833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
12843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
12853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonmod_ty
12863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1,
12873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		     char *ps2, PyCompilerFlags *flags, int *errcode)
12883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
12893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	node *n;
12903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	mod_ty mod;
12913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	perrdetail err;
12923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
12933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton				    ps1, ps2, &err, PARSER_FLAGS(flags));
12943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (n) {
12953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		mod = PyAST_FromNode(n, flags, filename);
12963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		PyNode_Free(n);
12973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return mod;
12983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
12993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	else {
13003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		err_input(&err);
13013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		if (errcode)
13023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			*errcode = err.error;
13033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		return NULL;
13043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
13053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
13063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1307a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Simplified interface to parsefile -- return node or set exception */
13081984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1309a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumnode *
131095292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
13111984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
1312a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	node *n;
1313a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	perrdetail err;
1314fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Peters	n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
1315fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Peters					(char *)0, (char *)0, &err, flags);
1316a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	if (n == NULL)
1317a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		err_input(&err);
13183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
1319a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	return n;
13201984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
13211984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1322a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Simplified interface to parsestring -- return node or set exception */
13231984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1324a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumnode *
132595292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFlags(const char *str, int start, int flags)
13261984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
1327a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	node *n;
1328a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	perrdetail err;
1329fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Peters	n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err,
1330fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Peters				      flags);
1331a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	if (n == NULL)
1332a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		err_input(&err);
1333a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	return n;
1334a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum}
1335a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum
1336fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Petersnode *
133795292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
13386b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller					int start, int flags)
13396b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller{
13406b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller	node *n;
13416b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller	perrdetail err;
13426b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller
1343d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters	n = PyParser_ParseStringFlagsFilename(str, filename,
13446b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller					      &_PyParser_Grammar,
13456b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller					      start, &err, flags);
13466b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller	if (n == NULL)
13476b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller		err_input(&err);
13486b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller	return n;
13496b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller}
13506b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller
13516b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Hellernode *
135295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
13536b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller{
13546b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller	return PyParser_SimpleParseStringFlagsFilename(str, filename,
13556b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller						       start, 0);
13566b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller}
13576b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller
135866ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum/* May want to move a more generalized form of this to parsetok.c or
135966ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum   even parser modules. */
136066ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum
136166ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossumvoid
136266ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van RossumPyParser_SetError(perrdetail *err)
136366ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum{
136466ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum	err_input(err);
136566ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum}
136666ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum
1367a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Set the error appropriate to the given input error code (see errcode.h) */
1368a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum
1369a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumstatic void
1370f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterserr_input(perrdetail *err)
1371a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum{
137285f363990cbd6df21015eebdc171c533176e3407Fred Drake	PyObject *v, *w, *errtype;
137300f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis	PyObject* u = NULL;
1374a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	char *msg = NULL;
137585f363990cbd6df21015eebdc171c533176e3407Fred Drake	errtype = PyExc_SyntaxError;
1376a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	switch (err->error) {
1377a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	case E_SYNTAX:
137885f363990cbd6df21015eebdc171c533176e3407Fred Drake		errtype = PyExc_IndentationError;
137985f363990cbd6df21015eebdc171c533176e3407Fred Drake		if (err->expected == INDENT)
138085f363990cbd6df21015eebdc171c533176e3407Fred Drake			msg = "expected an indented block";
138185f363990cbd6df21015eebdc171c533176e3407Fred Drake		else if (err->token == INDENT)
138285f363990cbd6df21015eebdc171c533176e3407Fred Drake			msg = "unexpected indent";
138385f363990cbd6df21015eebdc171c533176e3407Fred Drake		else if (err->token == DEDENT)
138485f363990cbd6df21015eebdc171c533176e3407Fred Drake			msg = "unexpected unindent";
138585f363990cbd6df21015eebdc171c533176e3407Fred Drake		else {
138685f363990cbd6df21015eebdc171c533176e3407Fred Drake			errtype = PyExc_SyntaxError;
138785f363990cbd6df21015eebdc171c533176e3407Fred Drake			msg = "invalid syntax";
138885f363990cbd6df21015eebdc171c533176e3407Fred Drake		}
1389a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		break;
1390a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	case E_TOKEN:
1391a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		msg = "invalid token";
1392a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		break;
1393118ec70ea27000db428ba3e3a757f4b423670db6Skip Montanaro	case E_EOFS:
1394118ec70ea27000db428ba3e3a757f4b423670db6Skip Montanaro		msg = "EOF while scanning triple-quoted string";
1395118ec70ea27000db428ba3e3a757f4b423670db6Skip Montanaro		break;
1396118ec70ea27000db428ba3e3a757f4b423670db6Skip Montanaro	case E_EOLS:
1397118ec70ea27000db428ba3e3a757f4b423670db6Skip Montanaro		msg = "EOL while scanning single-quoted string";
1398118ec70ea27000db428ba3e3a757f4b423670db6Skip Montanaro		break;
1399a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	case E_INTR:
140030ea2f223f5c0a85a13bd893063555a9f587cd6dMichael W. Hudson		if (!PyErr_Occurred())
140130ea2f223f5c0a85a13bd893063555a9f587cd6dMichael W. Hudson			PyErr_SetNone(PyExc_KeyboardInterrupt);
1402a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		return;
1403a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	case E_NOMEM:
140482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		PyErr_NoMemory();
1405a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		return;
1406a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	case E_EOF:
1407a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		msg = "unexpected EOF while parsing";
1408a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		break;
140985f363990cbd6df21015eebdc171c533176e3407Fred Drake	case E_TABSPACE:
141085f363990cbd6df21015eebdc171c533176e3407Fred Drake		errtype = PyExc_TabError;
1411560e8adef71dd10898e0f8a0a9a20599e6bec857Guido van Rossum		msg = "inconsistent use of tabs and spaces in indentation";
1412560e8adef71dd10898e0f8a0a9a20599e6bec857Guido van Rossum		break;
141394988067b96c6187fd940eaff99c2c5a68daac68Jeremy Hylton	case E_OVERFLOW:
141494988067b96c6187fd940eaff99c2c5a68daac68Jeremy Hylton		msg = "expression too long";
141594988067b96c6187fd940eaff99c2c5a68daac68Jeremy Hylton		break;
141685f363990cbd6df21015eebdc171c533176e3407Fred Drake	case E_DEDENT:
141785f363990cbd6df21015eebdc171c533176e3407Fred Drake		errtype = PyExc_IndentationError;
141885f363990cbd6df21015eebdc171c533176e3407Fred Drake		msg = "unindent does not match any outer indentation level";
141985f363990cbd6df21015eebdc171c533176e3407Fred Drake		break;
142085f363990cbd6df21015eebdc171c533176e3407Fred Drake	case E_TOODEEP:
142185f363990cbd6df21015eebdc171c533176e3407Fred Drake		errtype = PyExc_IndentationError;
142285f363990cbd6df21015eebdc171c533176e3407Fred Drake		msg = "too many levels of indentation";
142385f363990cbd6df21015eebdc171c533176e3407Fred Drake		break;
1424d35edda68245a7ab5f74c0f94ab13f6574df6a4eMartin v. Löwis	case E_DECODE: {
1425d35edda68245a7ab5f74c0f94ab13f6574df6a4eMartin v. Löwis		PyObject *type, *value, *tb;
1426d35edda68245a7ab5f74c0f94ab13f6574df6a4eMartin v. Löwis		PyErr_Fetch(&type, &value, &tb);
142700f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis		if (value != NULL) {
1428d35edda68245a7ab5f74c0f94ab13f6574df6a4eMartin v. Löwis			u = PyObject_Str(value);
142900f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis			if (u != NULL) {
143000f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis				msg = PyString_AsString(u);
143100f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis			}
143200f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis		}
1433c2632a5c34de3448fedc581a978a9a1924089fcdMartin v. Löwis		if (msg == NULL)
1434c2632a5c34de3448fedc581a978a9a1924089fcdMartin v. Löwis			msg = "unknown decode error";
1435d35edda68245a7ab5f74c0f94ab13f6574df6a4eMartin v. Löwis		Py_DECREF(type);
1436d35edda68245a7ab5f74c0f94ab13f6574df6a4eMartin v. Löwis		Py_DECREF(value);
143740d37814166380b0fb585f818b446159cfbcec0fNeal Norwitz		Py_XDECREF(tb);
1438c2632a5c34de3448fedc581a978a9a1924089fcdMartin v. Löwis		break;
143900f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis	}
14404bf108d74f2e36f16f4c0c00e7791e418e2d47ffMartin v. Löwis	case E_LINECONT:
14414bf108d74f2e36f16f4c0c00e7791e418e2d47ffMartin v. Löwis		msg = "unexpected character after line continuation character";
14424bf108d74f2e36f16f4c0c00e7791e418e2d47ffMartin v. Löwis		break;
1443a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	default:
1444a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		fprintf(stderr, "error=%d\n", err->error);
1445a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		msg = "unknown parsing error";
1446a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum		break;
1447a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum	}
14483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	v = Py_BuildValue("(ziiz)", err->filename,
14493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton			  err->lineno, err->offset, err->text);
14503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 	if (err->text != NULL) {
14513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		PyMem_DEL(err->text);
14523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		err->text = NULL;
14533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	}
14543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	w = NULL;
14553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	if (v != NULL)
14563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton		w = Py_BuildValue("(sO)", msg, v);
145700f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis	Py_XDECREF(u);
14584131830c23727aac262291934007c0b731b6e00cGuido van Rossum	Py_XDECREF(v);
145985f363990cbd6df21015eebdc171c533176e3407Fred Drake	PyErr_SetObject(errtype, w);
146082598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	Py_XDECREF(w);
14611984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
14621984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
14631984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Print fatal error message and abort */
14641984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
14651984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumvoid
14667c321a80f93a572a5f4a94d5d2897f70b8315a2cTim PetersPy_FatalError(const char *msg)
14671984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
146883dd6c319e8c353b185038064e57282d8e396107Guido van Rossum	fprintf(stderr, "Fatal Python error: %s\n", msg);
14696238d2b024f061159b2613387ff700695c10deefMartin v. Löwis#ifdef MS_WINDOWS
147023c9446d9ab4b063211327a6f81eddf920c801caGuido van Rossum	OutputDebugString("Fatal Python error: ");
1471a44823b7764281d398215564f2070257d08d0855Guido van Rossum	OutputDebugString(msg);
1472a44823b7764281d398215564f2070257d08d0855Guido van Rossum	OutputDebugString("\n");
14730ba353608fb6315e2dfaab6d767aa92c05628b71Guido van Rossum#ifdef _DEBUG
14740ba353608fb6315e2dfaab6d767aa92c05628b71Guido van Rossum	DebugBreak();
1475a44823b7764281d398215564f2070257d08d0855Guido van Rossum#endif
14766238d2b024f061159b2613387ff700695c10deefMartin v. Löwis#endif /* MS_WINDOWS */
14771984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	abort();
14781984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
14791984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
14801984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Clean up and exit */
14811984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1482a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum#ifdef WITH_THREAD
148349b560698b0bba848c4f8325803a26a4477fb12dGuido van Rossum#include "pythread.h"
1484f9f2e82fcade2d44a69bbdac1ba59bdf591743f4Guido van Rossum#endif
1485f9f2e82fcade2d44a69bbdac1ba59bdf591743f4Guido van Rossum
14862dcfc9618dbf1cf467436c4a0ccbb2d7df2ba25fGuido van Rossum#define NEXITFUNCS 32
1487f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersstatic void (*exitfuncs[NEXITFUNCS])(void);
14881662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossumstatic int nexitfuncs = 0;
14891662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum
1490f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersint Py_AtExit(void (*func)(void))
14911662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum{
14921662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum	if (nexitfuncs >= NEXITFUNCS)
14931662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum		return -1;
14941662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum	exitfuncs[nexitfuncs++] = func;
14951662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum	return 0;
14961662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum}
14971662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum
1498cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossumstatic void
1499f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterscall_sys_exitfunc(void)
15001984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
150182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyObject *exitfunc = PySys_GetObject("exitfunc");
150259bff399a08b29b93b9d87c422f7077fc75c2a2aGuido van Rossum
150359bff399a08b29b93b9d87c422f7077fc75c2a2aGuido van Rossum	if (exitfunc) {
15046a12d8d3b4b7c70f92a17a20cb811b18069fd349Fred Drake		PyObject *res;
150582598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		Py_INCREF(exitfunc);
150682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		PySys_SetObject("exitfunc", (PyObject *)NULL);
150782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
150859bff399a08b29b93b9d87c422f7077fc75c2a2aGuido van Rossum		if (res == NULL) {
150926fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee			if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
151026fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee				PySys_WriteStderr("Error in sys.exitfunc:\n");
151126fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee			}
151282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum			PyErr_Print();
151359bff399a08b29b93b9d87c422f7077fc75c2a2aGuido van Rossum		}
151482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum		Py_DECREF(exitfunc);
151559bff399a08b29b93b9d87c422f7077fc75c2a2aGuido van Rossum	}
151659bff399a08b29b93b9d87c422f7077fc75c2a2aGuido van Rossum
15170829c754bbb7b3ea66801c7da69f6cb189b80543Guido van Rossum	if (Py_FlushLine())
15180829c754bbb7b3ea66801c7da69f6cb189b80543Guido van Rossum		PyErr_Clear();
1519cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum}
15201662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum
1521cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossumstatic void
1522f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterscall_ll_exitfuncs(void)
1523cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum{
15241662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum	while (nexitfuncs > 0)
15251662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum		(*exitfuncs[--nexitfuncs])();
152625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
152725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	fflush(stdout);
152825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum	fflush(stderr);
1529a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum}
1530a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum
1531a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossumvoid
1532f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_Exit(int sts)
1533a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum{
1534cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum	Py_Finalize();
15351984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
15361984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum	exit(sts);
15371984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
15381984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1539f1dc56632881fe4e5beed047580bf927679f3669Guido van Rossumstatic void
1540f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersinitsigs(void)
1541a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum{
1542a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum#ifdef SIGPIPE
15439ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	PyOS_setsig(SIGPIPE, SIG_IGN);
1544a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum#endif
154570d893a6aaf335383d2efcf7c40194e4f1a7e474Guido van Rossum#ifdef SIGXFZ
15469ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	PyOS_setsig(SIGXFZ, SIG_IGN);
154770d893a6aaf335383d2efcf7c40194e4f1a7e474Guido van Rossum#endif
15481b0bf9b7616a5d8b624ccb1670c7b71fa0850209Jeremy Hylton#ifdef SIGXFSZ
15499ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	PyOS_setsig(SIGXFSZ, SIG_IGN);
15501b0bf9b7616a5d8b624ccb1670c7b71fa0850209Jeremy Hylton#endif
155182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum	PyOS_InitInterrupts(); /* May imply initsignal() */
1552a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum}
1553a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum
15547433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum
15557433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum/*
15567433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum * The file descriptor fd is considered ``interactive'' if either
15577433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum *   a) isatty(fd) is TRUE, or
15587433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum *   b) the -i flag was given, and the filename associated with
15597433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum *      the descriptor is NULL or "<stdin>" or "???".
15607433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum */
15617433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossumint
156295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPy_FdIsInteractive(FILE *fp, const char *filename)
15637433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum{
15647433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum	if (isatty((int)fileno(fp)))
15657433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum		return 1;
15667433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum	if (!Py_InteractiveFlag)
15677433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum		return 0;
15687433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum	return (filename == NULL) ||
15697433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum	       (strcmp(filename, "<stdin>") == 0) ||
15707433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum	       (strcmp(filename, "???") == 0);
15717433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum}
15722f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
15732f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
1574d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters#if defined(USE_STACKCHECK)
15752f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#if defined(WIN32) && defined(_MSC_VER)
15762f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
15772f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh/* Stack checking for Microsoft C */
15782f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
15792f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#include <malloc.h>
15802f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#include <excpt.h>
15812f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
1582e8de31cbd094bf9e909e1cb12a19c6c3ca854dd7Fred Drake/*
1583e8de31cbd094bf9e909e1cb12a19c6c3ca854dd7Fred Drake * Return non-zero when we run out of memory on the stack; zero otherwise.
1584e8de31cbd094bf9e909e1cb12a19c6c3ca854dd7Fred Drake */
15852f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundhint
1586399739f79f1d6cef6bc8a8ec63f9a81255464f15Fred DrakePyOS_CheckStack(void)
15872f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh{
15882f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh	__try {
158992e4dd865709f4a4be2b11453ef4de954b8d7b14Tim Peters		/* alloca throws a stack overflow exception if there's
15902f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh		   not enough space left on the stack */
159192e4dd865709f4a4be2b11453ef4de954b8d7b14Tim Peters		alloca(PYOS_STACK_MARGIN * sizeof(void*));
15922f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh		return 0;
15932f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh	} __except (EXCEPTION_EXECUTE_HANDLER) {
15942f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh		/* just ignore all errors */
15952f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh	}
15962f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh	return 1;
15972f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh}
15982f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
15992f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#endif /* WIN32 && _MSC_VER */
16002f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
16012f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh/* Alternate implementations can be added here... */
16022f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
16032f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#endif /* USE_STACKCHECK */
16046f25618be5d8756284dc99c47953268e398175d0Guido van Rossum
16056f25618be5d8756284dc99c47953268e398175d0Guido van Rossum
16066f25618be5d8756284dc99c47953268e398175d0Guido van Rossum/* Wrappers around sigaction() or signal(). */
16076f25618be5d8756284dc99c47953268e398175d0Guido van Rossum
16086f25618be5d8756284dc99c47953268e398175d0Guido van RossumPyOS_sighandler_t
16096f25618be5d8756284dc99c47953268e398175d0Guido van RossumPyOS_getsig(int sig)
16106f25618be5d8756284dc99c47953268e398175d0Guido van Rossum{
16116f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#ifdef HAVE_SIGACTION
16126f25618be5d8756284dc99c47953268e398175d0Guido van Rossum	struct sigaction context;
16139ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	if (sigaction(sig, NULL, &context) == -1)
16149ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter		return SIG_ERR;
16156f25618be5d8756284dc99c47953268e398175d0Guido van Rossum	return context.sa_handler;
16166f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#else
16176f25618be5d8756284dc99c47953268e398175d0Guido van Rossum	PyOS_sighandler_t handler;
16186f25618be5d8756284dc99c47953268e398175d0Guido van Rossum	handler = signal(sig, SIG_IGN);
16199ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	if (handler != SIG_ERR)
16209ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter		signal(sig, handler);
16216f25618be5d8756284dc99c47953268e398175d0Guido van Rossum	return handler;
16226f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#endif
16236f25618be5d8756284dc99c47953268e398175d0Guido van Rossum}
16246f25618be5d8756284dc99c47953268e398175d0Guido van Rossum
16256f25618be5d8756284dc99c47953268e398175d0Guido van RossumPyOS_sighandler_t
16266f25618be5d8756284dc99c47953268e398175d0Guido van RossumPyOS_setsig(int sig, PyOS_sighandler_t handler)
16276f25618be5d8756284dc99c47953268e398175d0Guido van Rossum{
16286f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#ifdef HAVE_SIGACTION
16299ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	struct sigaction context, ocontext;
16306f25618be5d8756284dc99c47953268e398175d0Guido van Rossum	context.sa_handler = handler;
16319ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	sigemptyset(&context.sa_mask);
16329ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	context.sa_flags = 0;
16339ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	if (sigaction(sig, &context, &ocontext) == -1)
16349ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter		return SIG_ERR;
16359ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	return ocontext.sa_handler;
16366f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#else
16379ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	PyOS_sighandler_t oldhandler;
16389ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	oldhandler = signal(sig, handler);
16399ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter#ifdef HAVE_SIGINTERRUPT
16409ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	siginterrupt(sig, 1);
16419ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter#endif
16429ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter	return oldhandler;
16436f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#endif
16446f25618be5d8756284dc99c47953268e398175d0Guido van Rossum}
16453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
16463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Deprecated C API functions still provided for binary compatiblity */
16473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
16483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#undef PyParser_SimpleParseFile
16493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#undef PyParser_SimpleParseString
16503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
16513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonnode *
16523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
16533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
16543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
16553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
16563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
16573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonnode *
16583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_SimpleParseString(const char *str, int start)
16593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
16603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton	return PyParser_SimpleParseStringFlags(str, start, 0);
16613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
1662