pythonrun.c revision ad6dfda9afa3459eb802618c07969f6a1a0a1287
1f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum/***********************************************************
2e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van RossumCopyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumThe Netherlands.
4f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum
5f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum                        All Rights Reserved
6e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossum
7f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumPermission to use, copy, modify, and distribute this software and its
8f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossumdocumentation for any purpose and without fee is hereby granted,
9f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossumprovided that the above copyright notice appear in all copies and that
10f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossumboth that copyright notice and this permission notice appear in
11f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossumsupporting documentation, and that the names of Stichting Mathematisch
12e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van RossumCentrum or CWI or Corporation for National Research Initiatives or
13f0dfc7ac5c2f76baaae0c3b45bc339281cfa2adcWalter DörwaldCNRI not be used in advertising or publicity pertaining to
14f2b16f3eb4ae0bdcf267c49a6c46d230db2fbe23Nick Coghlandistribution of the software without specific, written prior
15f2b16f3eb4ae0bdcf267c49a6c46d230db2fbe23Nick Coghlanpermission.
16f2b16f3eb4ae0bdcf267c49a6c46d230db2fbe23Nick Coghlan
17f2b16f3eb4ae0bdcf267c49a6c46d230db2fbe23Nick CoghlanWhile CWI is the initial source for this software, a modified version
183fb55ca80e9edd3f87061d2ba7f82fbbe23ce674Nick Coghlanis made available by the Corporation for National Research Initiatives
1962b297b698634969d6ce69f14ef3d268c8904a48Guido van Rossum(CNRI) at the Internet address ftp://ftp.python.org.
2062b297b698634969d6ce69f14ef3d268c8904a48Guido van Rossum
21e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van RossumSTICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumREGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumMERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumCENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumPROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27facf24bdc7b292029b3e611d241feee157cda4c4Guido van RossumTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van RossumPERFORMANCE OF THIS SOFTWARE.
29f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum
306e482569c8cba727d803e2283ae1481c5c308d54Neal Norwitz******************************************************************/
3162b297b698634969d6ce69f14ef3d268c8904a48Guido van Rossum
3262b297b698634969d6ce69f14ef3d268c8904a48Guido van Rossum/* Python interpreter top-level routines, including init/exit */
3362b297b698634969d6ce69f14ef3d268c8904a48Guido van Rossum
34f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "Python.h"
35f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum
36f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "grammar.h"
37f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "node.h"
38f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "parsetok.h"
39f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#undef argument /* Avoid conflict on Mac */
40f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "errcode.h"
41f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "compile.h"
42f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "eval.h"
43f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "marshal.h"
44f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum
45f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#ifdef HAVE_UNISTD_H
46f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include <unistd.h>
476e482569c8cba727d803e2283ae1481c5c308d54Neal Norwitz#endif
486e482569c8cba727d803e2283ae1481c5c308d54Neal Norwitz
49f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#ifdef HAVE_SIGNAL_H
50f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include <signal.h>
51f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#endif
52f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum
53e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossum#ifdef MS_WIN32
54e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossum#undef BYTE
55f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#undef arglist
56f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "windows.h"
57f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#endif
58e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossum
59e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossumextern char *Py_GetPath();
60e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossum
610096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonextern grammar _PyParser_Grammar; /* From graminit.c */
620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
630096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon/* Forward */
645874ed6cee569a73cd0e947605210822b251df7fR. David Murraystatic void initmain Py_PROTO((void));
65e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossumstatic PyObject *run_err_node Py_PROTO((node *n, char *filename,
66af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes				   PyObject *globals, PyObject *locals));
67af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesstatic PyObject *run_node Py_PROTO((node *n, char *filename,
68af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes			       PyObject *globals, PyObject *locals));
69af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesstatic PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
70af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes				   PyObject *globals, PyObject *locals));
71764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadéstatic void err_input Py_PROTO((perrdetail *));
72af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesstatic void initsigs Py_PROTO((void));
73764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé
74764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadéint Py_DebugFlag; /* Needed by parser.c */
75af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesint Py_VerboseFlag; /* Needed by import.c */
76af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesint Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
77af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes
78d74fb6b12a9a53ce09648484076c84e727561612Guido van Rossum/* Initialize the current interpreter; pass in the Python path. */
7938cb9f1f174415d3b37fbaeb5d152d65525839d2Fred Drake
80d2f6ae63cd546d84310324012740425772e83de7Victor Stinnervoid
81d2f6ae63cd546d84310324012740425772e83de7Victor StinnerPy_Setup()
82d2f6ae63cd546d84310324012740425772e83de7Victor Stinner{
83d2f6ae63cd546d84310324012740425772e83de7Victor Stinner	PyImport_Init();
84d2f6ae63cd546d84310324012740425772e83de7Victor Stinner
851fb5ce0323926406e6b3db6879152e0dcc40f5ecFred Drake	/* Modules '__builtin__' and 'sys' are initialized here,
8638cb9f1f174415d3b37fbaeb5d152d65525839d2Fred Drake	   they are needed by random bits of the interpreter.
87af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	   All other modules are optional and are initialized
880096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	   when they are first imported. */
890096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
900096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	PyBuiltin_Init(); /* Also initializes builtin exceptions */
910c469854bcb6f7180d261bc1f6adb67f27656419Neal Norwitz	PySys_Init();
92470321108019367e3bdd96309e89d79f04784d45Phillip J. Eby
930096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	PySys_SetPath(Py_GetPath());
940096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
95d2f6ae63cd546d84310324012740425772e83de7Victor Stinner	initsigs(); /* Signal handling stuff, including initintr() */
96d2f6ae63cd546d84310324012740425772e83de7Victor Stinner
970096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	initmain();
98af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes}
990096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
1000096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon/* Create and interpreter and thread state and initialize them;
1010096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon   if we already have an interpreter and thread, do nothing.
1020096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon   Fatal error if the creation fails. */
1030096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
1040096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonvoid
1050096e262ffe836b4c7511158678f9e257cc3a020Brett CannonPy_Initialize()
1060096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon{
1070096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	PyThreadState *tstate;
1080096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	PyInterpreterState *interp;
1090096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	char *p;
1100096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
1110096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if (PyThreadState_Get())
1120096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		return;
1130096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
1140096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
1150096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		Py_DebugFlag = 1;
1160096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
117af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		Py_VerboseFlag = 1;
1187f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake
1190096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	interp = PyInterpreterState_New();
1200096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if (interp == NULL)
1217f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake		Py_FatalError("PyInterpreterState_New() failed");
1220096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
1230096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	tstate = PyThreadState_New(interp);
1240096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if (tstate == NULL)
1250096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		Py_FatalError("PyThreadState_New() failed");
1260096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	(void) PyThreadState_Swap(tstate);
1277f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake
1280096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	Py_Setup();
1297f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake
130af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	PySys_SetPath(Py_GetPath());
1310096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	/* XXX Who should set the path -- Setup or Initialize? */
1328d76cca0265aaa23d2a59af3bfb1bcd133c0a59dGeorg Brandl}
1338d76cca0265aaa23d2a59af3bfb1bcd133c0a59dGeorg Brandl
1348d76cca0265aaa23d2a59af3bfb1bcd133c0a59dGeorg Brandlstatic char *progname = "python";
1358d76cca0265aaa23d2a59af3bfb1bcd133c0a59dGeorg Brandl
1360096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonvoid
1377f5296e7c06f5a6010960f34ae7db89d8902cddbFred DrakePy_SetProgramName(pn)
1387f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake	char *pn;
1397f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake{
1407f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake	if (pn && *pn)
1410096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		progname = pn;
1420096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon}
1434d0bddfee66383e746a79d60cd64e40fc1ab1df7Brett Cannon
1440096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonchar *
1450096e262ffe836b4c7511158678f9e257cc3a020Brett CannonPy_GetProgramName()
146af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes{
1475874ed6cee569a73cd0e947605210822b251df7fR. David Murray	return progname;
1480096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon}
1490096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
1505874ed6cee569a73cd0e947605210822b251df7fR. David Murray/*
1515874ed6cee569a73cd0e947605210822b251df7fR. David Murray  Py_Initialize()
1525874ed6cee569a73cd0e947605210822b251df7fR. David Murray  -- do everything, no-op on second call, call fatal on failure, set path
1535874ed6cee569a73cd0e947605210822b251df7fR. David Murray
1545874ed6cee569a73cd0e947605210822b251df7fR. David Murray  #2
1555874ed6cee569a73cd0e947605210822b251df7fR. David Murray  -- create new interp+tstate & make it current, return NULL on failure,
1565874ed6cee569a73cd0e947605210822b251df7fR. David Murray     make it current, do all setup, set path
1575874ed6cee569a73cd0e947605210822b251df7fR. David Murray
1585874ed6cee569a73cd0e947605210822b251df7fR. David Murray  #3
1595874ed6cee569a73cd0e947605210822b251df7fR. David Murray  -- #2 without set path
1605874ed6cee569a73cd0e947605210822b251df7fR. David Murray
1615874ed6cee569a73cd0e947605210822b251df7fR. David Murray  #4
1625874ed6cee569a73cd0e947605210822b251df7fR. David Murray  -- is there any point to #3 for caller-provided current interp+tstate?
1635874ed6cee569a73cd0e947605210822b251df7fR. David Murray
1645874ed6cee569a73cd0e947605210822b251df7fR. David Murray*/
1655874ed6cee569a73cd0e947605210822b251df7fR. David Murray
1665874ed6cee569a73cd0e947605210822b251df7fR. David Murray/* Create __main__ module */
1670096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
1680096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonstatic void
1690096e262ffe836b4c7511158678f9e257cc3a020Brett Cannoninitmain()
1700096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon{
171af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	PyObject *m, *d;
17212f8c4d2e3edf2717869c7578616f188ecd2daedBrett Cannon	m = PyImport_AddModule("__main__");
1730096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if (m == NULL)
1740096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		Py_FatalError("can't create __main__ module");
1750096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	d = PyModule_GetDict(m);
1764d0bddfee66383e746a79d60cd64e40fc1ab1df7Brett Cannon	if (PyDict_GetItemString(d, "__builtins__") == NULL) {
1770096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		if (PyDict_SetItemString(d, "__builtins__",
1780096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon					 PyEval_GetBuiltins()))
1790096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			Py_FatalError("can't add __builtins__ to __main__");
1801fb5ce0323926406e6b3db6879152e0dcc40f5ecFred Drake	}
1810096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon}
18245e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum
183f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum/* Parse input from a file and execute it */
18445e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum
185f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossumint
18645e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van RossumPyRun_AnyFile(fp, filename)
187af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	FILE *fp;
188af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	char *filename;
189af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes{
190af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	if (filename == NULL)
1917f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake		filename = "???";
1920096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if (Py_FdIsInteractive(fp, filename))
1930096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		return PyRun_InteractiveLoop(fp, filename);
1940096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	else
195af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		return PyRun_SimpleFile(fp, filename);
196af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes}
197af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes
198af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesint
1995217d5d6784759eea18b6d49e2fcaa9503fa6b62Andrew M. KuchlingPyRun_InteractiveLoop(fp, filename)
200af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	FILE *fp;
201af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	char *filename;
202af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes{
203af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	PyObject *v;
204af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	int ret;
205af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	v = PySys_GetObject("ps1");
206c3939142e867f39210766f46a7d19564dd4e91feNan Zhang	if (v == NULL) {
207c3939142e867f39210766f46a7d19564dd4e91feNan Zhang		PySys_SetObject("ps1", v = PyString_FromString(">>> "));
208c3939142e867f39210766f46a7d19564dd4e91feNan Zhang		Py_XDECREF(v);
209c3939142e867f39210766f46a7d19564dd4e91feNan Zhang	}
210af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	v = PySys_GetObject("ps2");
211af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	if (v == NULL) {
212af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		PySys_SetObject("ps2", v = PyString_FromString("... "));
213af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		Py_XDECREF(v);
214af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	}
215af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	for (;;) {
216af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		ret = PyRun_InteractiveOne(fp, filename);
217af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes#ifdef Py_REF_DEBUG
218af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
219af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes#endif
220af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		if (ret == E_EOF)
221af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes			return 0;
222af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		/*
223af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		if (ret == E_NOMEM)
224764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé			return -1;
225764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		*/
226af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	}
227764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé}
228764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé
229764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadéint
230af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian HeimesPyRun_InteractiveOne(fp, filename)
231764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	FILE *fp;
232764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	char *filename;
233764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé{
2345633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé	PyObject *m, *d, *v, *w;
2355633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé	node *n;
236764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	perrdetail err;
237764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	char *ps1, *ps2;
238764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	v = PySys_GetObject("ps1");
239764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	w = PySys_GetObject("ps2");
240764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	if (v != NULL && PyString_Check(v)) {
241764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		Py_INCREF(v);
242764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		ps1 = PyString_AsString(v);
243764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	}
244764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	else {
245764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		v = NULL;
246764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		ps1 = "";
247764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	}
248764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	if (w != NULL && PyString_Check(w)) {
249764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		Py_INCREF(w);
2505633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé		ps2 = PyString_AsString(w);
2515633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé	}
2522f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren	else {
2532f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren		w = NULL;
2542f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren		ps2 = "";
2552f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren	}
2562f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren	Py_BEGIN_ALLOW_THREADS
2572f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren	n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
2582f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren			       Py_single_input, ps1, ps2, &err);
2595633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé	Py_END_ALLOW_THREADS
260764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	Py_XDECREF(v);
261764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	Py_XDECREF(w);
262764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	if (n == NULL) {
263764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		if (err.error == E_EOF) {
264764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé			if (err.text)
265764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé				free(err.text);
266764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé			return E_EOF;
267764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		}
268764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		err_input(&err);
269764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		PyErr_Print();
270764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		return err.error;
271764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	}
272764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	m = PyImport_AddModule("__main__");
273764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	if (m == NULL)
274af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		return -1;
275af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	d = PyModule_GetDict(m);
276764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	v = run_node(n, filename, d, d);
277764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	if (v == NULL) {
278764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		PyErr_Print();
279af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		return -1;
280764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	}
281764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	Py_DECREF(v);
282764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	if (Py_FlushLine())
283764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		PyErr_Clear();
284764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	return 0;
2853b95934e0585762661269d41b5a5d79f1b9c2244Benjamin Peterson}
286af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes
287af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesint
288af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian HeimesPyRun_SimpleFile(fp, filename)
289af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	FILE *fp;
2903b95934e0585762661269d41b5a5d79f1b9c2244Benjamin Peterson	char *filename;
291af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes{
292af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	PyObject *m, *d, *v;
293764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	char *ext;
294af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes
295764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	m = PyImport_AddModule("__main__");
296af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	if (m == NULL)
297af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		return -1;
298764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	d = PyModule_GetDict(m);
299af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	ext = filename + strlen(filename) - 4;
300764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
301764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé#ifdef macintosh
302764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	/* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
303af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	    || getfiletype(filename) == 'PYC '
304764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé	    || getfiletype(filename) == 'APPL'
305764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé#endif /* macintosh */
306764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé		) {
307af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		/* Try to run a pyc file. First, re-open in binary */
308af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		/* Don't close, done in main: fclose(fp); */
309af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		if( (fp = fopen(filename, "rb")) == NULL ) {
310af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes			fprintf(stderr, "python: Can't reopen .pyc file\n");
3110096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			return -1;
3120096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		}
3130096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		/* Turn on optimization if a .pyo file is given */
3140096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		if (strcmp(ext, ".pyo") == 0)
3150096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			Py_OptimizeFlag = 1;
3160096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		v = run_pyc_file(fp, filename, d, d);
3170096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	} else {
3184e0e1b6a540e664e89739456db4c706701bf062bTim Peters		v = PyRun_File(fp, filename, Py_file_input, d, d);
3190096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	}
3202e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre	if (v == NULL) {
3212e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre		PyErr_Print();
3222e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre		return -1;
3232e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre	}
3242e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre	Py_DECREF(v);
3252e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre	if (Py_FlushLine())
3262e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre		PyErr_Clear();
3272e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre	return 0;
3282e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre}
3290096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
330bc96f3272d77f587da975eac0c753b7dc7a621aaBrian Curtinint
331bc96f3272d77f587da975eac0c753b7dc7a621aaBrian CurtinPyRun_SimpleString(command)
332bc96f3272d77f587da975eac0c753b7dc7a621aaBrian Curtin	char *command;
333bc96f3272d77f587da975eac0c753b7dc7a621aaBrian Curtin{
3340096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	PyObject *m, *d, *v;
3350096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	m = PyImport_AddModule("__main__");
3360096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if (m == NULL)
33724cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl		return -1;
3380096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	d = PyModule_GetDict(m);
33924cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl	v = PyRun_String(command, Py_file_input, d, d);
3400096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if (v == NULL) {
34124cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl		PyErr_Print();
34288ca467ca4b1f13a9fb172712cf25eeae94e3095Tim Peters		return -1;
34324cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl	}
34424cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl	Py_DECREF(v);
34524cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl	if (Py_FlushLine())
34624cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl		PyErr_Clear();
34724cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl	return 0;
34824cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl}
349d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser
350d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiservoid
351d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. KaiserPyErr_Print()
352d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser{
353d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser	int err = 0;
354d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser	PyObject *exception, *v, *tb, *f;
35524cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl	PyErr_Fetch(&exception, &v, &tb);
35624cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl	if (exception == NULL)
35724cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl		return;
3580096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if (exception == PyExc_SystemExit) {
3590096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		err = Py_FlushLine();
3600096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		fflush(stdout);
3610096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		if (v == NULL || v == Py_None)
3620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			Py_Exit(0);
363d89fa0c5761254c970af72e5abcea420fd23e893Guido van Rossum		if (PyInt_Check(v))
364d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum			Py_Exit((int)PyInt_AsLong(v));
365d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum		else {
366f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum			/* OK to use real stderr here */
367f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum			PyObject_Print(v, stderr, Py_PRINT_RAW);
368f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum			fprintf(stderr, "\n");
369f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum			Py_Exit(1);
370f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum		}
371f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum	}
372f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum	PySys_SetObject("last_type", exception);
373f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum	PySys_SetObject("last_value", v);
374f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum	PySys_SetObject("last_traceback", tb);
375f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum	f = PySys_GetObject("stderr");
376f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum	if (f == NULL)
377f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum		fprintf(stderr, "lost sys.stderr\n");
3780096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	else {
3790096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		err = Py_FlushLine();
380f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum		fflush(stdout);
3810096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		if (err == 0)
382f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum			err = PyTraceBack_Print(tb, f);
383f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum		if (err == 0 && exception == PyExc_SyntaxError) {
384f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum			PyObject *message;
385f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum			char *filename, *text;
386f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum			int lineno, offset;
387f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum			if (!PyArg_Parse(v, "(O(ziiz))", &message,
388f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum				     &filename, &lineno, &offset, &text))
389f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum				PyErr_Clear();
390f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum			else {
391f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum				char buf[10];
392d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum				PyFile_WriteString("  File \"", f);
393d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum				if (filename == NULL)
394d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum					PyFile_WriteString("<string>", f);
395f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum				else
396f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum					PyFile_WriteString(filename, f);
397f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum				PyFile_WriteString("\", line ", f);
398f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum				sprintf(buf, "%d", lineno);
399f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum				PyFile_WriteString(buf, f);
400f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum				PyFile_WriteString("\n", f);
401f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum				if (text != NULL) {
402f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum					char *nl;
403d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum					if (offset > 0 &&
404d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum					    offset == (int)strlen(text))
405d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum						offset--;
406d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum					for (;;) {
407d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum						nl = strchr(text, '\n');
408d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum						if (nl == NULL ||
409d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum						    nl-text >= offset)
410d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum							break;
411d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum						offset -= (nl+1-text);
412d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum						text = nl+1;
413d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum					}
414d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum					while (*text == ' ' || *text == '\t') {
415d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum						text++;
416d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum						offset--;
417d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum					}
418d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum					PyFile_WriteString("    ", f);
419d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum					PyFile_WriteString(text, f);
420d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum					if (*text == '\0' ||
4210096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon					    text[strlen(text)-1] != '\n')
4220096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon						PyFile_WriteString("\n", f);
4230096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon					PyFile_WriteString("    ", f);
4240096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon					offset--;
4250096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon					while (offset > 0) {
4260096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon						PyFile_WriteString(" ", f);
4270096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon						offset--;
4280096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon					}
4290096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon					PyFile_WriteString("^\n", f);
4300096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon				}
4310096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon				Py_INCREF(message);
4320096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon				Py_DECREF(v);
4330096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon				v = message;
43475461e3e2ebefa4a6ef0f191658ce5599e1580a1Benjamin Peterson				/* Can't be bothered to check all those
4350096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon				   PyFile_WriteString() calls */
4360096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon				if (PyErr_Occurred())
4370096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon					err = -1;
4380096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			}
4390096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		}
440bc96f3272d77f587da975eac0c753b7dc7a621aaBrian Curtin		if (err) {
4410096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			/* Don't do anything else */
4420096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		}
4430096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		else if (PyClass_Check(exception)) {
4440096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			PyObject* className =
44583213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum				((PyClassObject*)exception)->cl_name;
44683213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum			if (className == NULL)
44783213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum				err = PyFile_WriteString("<unknown>", f);
44883213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum			else
44983213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum				err = PyFile_WriteObject(className, f,
45083213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum							 Py_PRINT_RAW);
45183213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum		}
4520096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		else
4530096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
4540096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		if (err == 0) {
4550096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			if (v != NULL && v != Py_None) {
4560096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon				err = PyFile_WriteString(": ", f);
4570096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon				if (err == 0)
4580096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon				  err = PyFile_WriteObject(v, f, Py_PRINT_RAW);
4590096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			}
4600096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		}
4610096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		if (err == 0)
4620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			err = PyFile_WriteString("\n", f);
4630096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	}
4640096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	Py_XDECREF(exception);
4650096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	Py_XDECREF(v);
4660096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	Py_XDECREF(tb);
4670096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	/* If an error happened here, don't show it.
4680096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	   XXX This is wrong, but too many callers rely on this behavior. */
4690096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if (err != 0)
4700096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		PyErr_Clear();
4710096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon}
4720096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
4730096e262ffe836b4c7511158678f9e257cc3a020Brett CannonPyObject *
4740096e262ffe836b4c7511158678f9e257cc3a020Brett CannonPyRun_String(str, start, globals, locals)
4750096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	char *str;
4760096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	int start;
4770096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	PyObject *globals, *locals;
4780096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon{
4790096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	return run_err_node(PyParser_SimpleParseString(str, start),
4800096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			    "<string>", globals, locals);
4810096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon}
4820096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
4830096e262ffe836b4c7511158678f9e257cc3a020Brett CannonPyObject *
4840096e262ffe836b4c7511158678f9e257cc3a020Brett CannonPyRun_File(fp, filename, start, globals, locals)
4850096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	FILE *fp;
4860096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	char *filename;
4870096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	int start;
4880096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	PyObject *globals, *locals;
4890096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon{
4900096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
4910096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			    filename, globals, locals);
4920096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon}
4930096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
4940096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonstatic PyObject *
4950096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonrun_err_node(n, filename, globals, locals)
4966664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner	node *n;
4976664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner	char *filename;
4986664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner	PyObject *globals, *locals;
4996664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner{
5006664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner	if (n == NULL)
5016664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner		return  NULL;
5020096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	return run_node(n, filename, globals, locals);
5030096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon}
504af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes
505af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesstatic PyObject *
506af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesrun_node(n, filename, globals, locals)
507af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	node *n;
508af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	char *filename;
509af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	PyObject *globals, *locals;
5106664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner{
5116664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner	PyCodeObject *co;
5126664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner	PyObject *v;
5136664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner	co = PyNode_Compile(n, filename);
5146664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner	PyNode_Free(n);
5153ec32005e8fa40c2471e7869a6e49407241442abVictor Stinner	if (co == NULL)
516af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		return NULL;
517af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	v = PyEval_EvalCode(co, globals, locals);
5180096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	Py_DECREF(co);
519af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	return v;
520af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes}
5210096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
522af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesstatic PyObject *
523af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesrun_pyc_file(fp, filename, globals, locals)
524af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	FILE *fp;
525c3939142e867f39210766f46a7d19564dd4e91feNan Zhang	char *filename;
526c3939142e867f39210766f46a7d19564dd4e91feNan Zhang	PyObject *globals, *locals;
527c3939142e867f39210766f46a7d19564dd4e91feNan Zhang{
528af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	PyCodeObject *co;
5290096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	PyObject *v;
5300096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	long magic;
5310096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	long PyImport_GetMagicNumber();
5320096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon
5330096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	magic = PyMarshal_ReadLongFromFile(fp);
5340096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if (magic != PyImport_GetMagicNumber()) {
5350096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		PyErr_SetString(PyExc_RuntimeError,
5360096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			   "Bad magic number in .pyc file");
537af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		return NULL;
538af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	}
5390096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	(void) PyMarshal_ReadLongFromFile(fp);
5400096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	v = PyMarshal_ReadObjectFromFile(fp);
5410096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	fclose(fp);
5420096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon	if (v == NULL || !PyCode_Check(v)) {
5430096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		Py_XDECREF(v);
5440096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon		PyErr_SetString(PyExc_RuntimeError,
5450096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon			   "Bad code object in .pyc file");
546f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum		return NULL;
547af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	}
548af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	co = (PyCodeObject *)v;
549af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	v = PyEval_EvalCode(co, globals, locals);
550af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	Py_DECREF(co);
551af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	return v;
552af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes}
553af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes
554af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian HeimesPyObject *
555af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian HeimesPy_CompileString(str, filename, start)
556af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	char *str;
55717433d206c1a705c8dad9a52d33c5546dc069e42Christian Heimes	char *filename;
558af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	int start;
559af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes{
560af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	node *n;
561af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	PyCodeObject *co;
562af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	n = PyParser_SimpleParseString(str, start);
563af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	if (n == NULL)
564af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		return NULL;
565af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	co = PyNode_Compile(n, filename);
566af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	PyNode_Free(n);
567af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	return (PyObject *)co;
568af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes}
569af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes
570af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes/* Simplified interface to parsefile -- return node or set exception */
571af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes
572af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesnode *
573af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian HeimesPyParser_SimpleParseFile(fp, filename, start)
574af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	FILE *fp;
575af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	char *filename;
576af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	int start;
577af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes{
578af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	node *n;
579af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	perrdetail err;
580af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	Py_BEGIN_ALLOW_THREADS
581af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
582af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes				(char *)0, (char *)0, &err);
583af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	Py_END_ALLOW_THREADS
584af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	if (n == NULL)
585af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes		err_input(&err);
586af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	return n;
587af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes}
588af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes
589af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes/* Simplified interface to parsestring -- return node or set exception */
590af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes
591af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesnode *
592af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian HeimesPyParser_SimpleParseString(str, start)
593af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	char *str;
594af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	int start;
595f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum{
596f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum	node *n;
597af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes	perrdetail err;
598	n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
599	if (n == NULL)
600		err_input(&err);
601	return n;
602}
603
604/* Set the error appropriate to the given input error code (see errcode.h) */
605
606static void
607err_input(err)
608	perrdetail *err;
609{
610	PyObject *v, *w;
611	char *msg = NULL;
612	v = Py_BuildValue("(ziiz)", err->filename,
613			    err->lineno, err->offset, err->text);
614	if (err->text != NULL) {
615		free(err->text);
616		err->text = NULL;
617	}
618	switch (err->error) {
619	case E_SYNTAX:
620		msg = "invalid syntax";
621		break;
622	case E_TOKEN:
623		msg = "invalid token";
624
625		break;
626	case E_INTR:
627		PyErr_SetNone(PyExc_KeyboardInterrupt);
628		return;
629	case E_NOMEM:
630		PyErr_NoMemory();
631		return;
632	case E_EOF:
633		msg = "unexpected EOF while parsing";
634		break;
635	default:
636		fprintf(stderr, "error=%d\n", err->error);
637		msg = "unknown parsing error";
638		break;
639	}
640	w = Py_BuildValue("(sO)", msg, v);
641	Py_XDECREF(v);
642	PyErr_SetObject(PyExc_SyntaxError, w);
643	Py_XDECREF(w);
644}
645
646/* Print fatal error message and abort */
647
648void
649Py_FatalError(msg)
650	char *msg;
651{
652	fprintf(stderr, "Fatal Python error: %s\n", msg);
653#ifdef macintosh
654	for (;;);
655#endif
656#ifdef MS_WIN32
657	OutputDebugString("Fatal Python error: ");
658	OutputDebugString(msg);
659	OutputDebugString("\n");
660#endif
661	abort();
662}
663
664/* Clean up and exit */
665
666#ifdef WITH_THREAD
667#include "thread.h"
668int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
669#endif
670
671#define NEXITFUNCS 32
672static void (*exitfuncs[NEXITFUNCS])();
673static int nexitfuncs = 0;
674
675int Py_AtExit(func)
676	void (*func) Py_PROTO((void));
677{
678	if (nexitfuncs >= NEXITFUNCS)
679		return -1;
680	exitfuncs[nexitfuncs++] = func;
681	return 0;
682}
683
684void
685Py_Cleanup()
686{
687	PyObject *exitfunc = PySys_GetObject("exitfunc");
688
689	if (exitfunc) {
690		PyObject *res;
691		Py_INCREF(exitfunc);
692		PySys_SetObject("exitfunc", (PyObject *)NULL);
693		res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
694		if (res == NULL) {
695			fprintf(stderr, "Error in sys.exitfunc:\n");
696			PyErr_Print();
697		}
698		Py_DECREF(exitfunc);
699	}
700
701	Py_FlushLine();
702
703	while (nexitfuncs > 0)
704		(*exitfuncs[--nexitfuncs])();
705}
706
707#ifdef COUNT_ALLOCS
708extern void dump_counts Py_PROTO((void));
709#endif
710
711void
712Py_Exit(sts)
713	int sts;
714{
715	Py_Cleanup();
716
717#ifdef COUNT_ALLOCS
718	dump_counts();
719#endif
720
721#ifdef WITH_THREAD
722
723	/* Other threads may still be active, so skip most of the
724	   cleanup actions usually done (these are mostly for
725	   debugging anyway). */
726
727	(void) PyEval_SaveThread();
728#ifndef NO_EXIT_PROG
729	if (_PyThread_Started)
730		_exit_prog(sts);
731	else
732		exit_prog(sts);
733#else /* !NO_EXIT_PROG */
734	if (_PyThread_Started)
735		_exit(sts);
736	else
737		exit(sts);
738#endif /* !NO_EXIT_PROG */
739
740#else /* WITH_THREAD */
741
742	PyImport_Cleanup();
743
744	PyErr_Clear();
745
746#ifdef Py_REF_DEBUG
747	fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
748#endif
749
750#ifdef Py_TRACE_REFS
751	if (_Py_AskYesNo("Print left references?")) {
752		_Py_PrintReferences(stderr);
753	}
754#endif /* Py_TRACE_REFS */
755
756#ifdef macintosh
757	PyMac_Exit(sts);
758#else
759	exit(sts);
760#endif
761#endif /* WITH_THREAD */
762	/*NOTREACHED*/
763}
764
765#ifdef HAVE_SIGNAL_H
766static RETSIGTYPE
767sighandler(sig)
768	int sig;
769{
770	signal(sig, SIG_DFL); /* Don't catch recursive signals */
771	Py_Cleanup(); /* Do essential clean-up */
772#ifdef HAVE_KILL
773	kill(getpid(), sig); /* Pretend the signal killed us */
774#else
775	exit(1);
776#endif
777	/*NOTREACHED*/
778}
779#endif
780
781static void
782initsigs()
783{
784	RETSIGTYPE (*t)();
785#ifdef HAVE_SIGNAL_H
786#ifdef SIGPIPE
787	signal(SIGPIPE, SIG_IGN);
788#endif
789#ifdef SIGHUP
790	t = signal(SIGHUP, SIG_IGN);
791	if (t == SIG_DFL)
792		signal(SIGHUP, sighandler);
793	else
794		signal(SIGHUP, t);
795#endif
796#ifdef SIGTERM
797	t = signal(SIGTERM, SIG_IGN);
798	if (t == SIG_DFL)
799		signal(SIGTERM, sighandler);
800	else
801		signal(SIGTERM, t);
802#endif
803#endif /* HAVE_SIGNAL_H */
804	PyOS_InitInterrupts(); /* May imply initsignal() */
805}
806
807#ifdef Py_TRACE_REFS
808/* Ask a yes/no question */
809
810int
811_Py_AskYesNo(prompt)
812	char *prompt;
813{
814	char buf[256];
815
816	printf("%s [ny] ", prompt);
817	if (fgets(buf, sizeof buf, stdin) == NULL)
818		return 0;
819	return buf[0] == 'y' || buf[0] == 'Y';
820}
821#endif
822
823#ifdef MPW
824
825/* Check for file descriptor connected to interactive device.
826   Pretend that stdin is always interactive, other files never. */
827
828int
829isatty(fd)
830	int fd;
831{
832	return fd == fileno(stdin);
833}
834
835#endif
836
837/*
838 * The file descriptor fd is considered ``interactive'' if either
839 *   a) isatty(fd) is TRUE, or
840 *   b) the -i flag was given, and the filename associated with
841 *      the descriptor is NULL or "<stdin>" or "???".
842 */
843int
844Py_FdIsInteractive(fp, filename)
845	FILE *fp;
846	char *filename;
847{
848	if (isatty((int)fileno(fp)))
849		return 1;
850	if (!Py_InteractiveFlag)
851		return 0;
852	return (filename == NULL) ||
853	       (strcmp(filename, "<stdin>") == 0) ||
854	       (strcmp(filename, "???") == 0);
855}
856