pythonrun.c revision 65fd0592fb3845c17b27c441380553fc22f78812
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"
7d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum#undef Yield /* undefine macro conflicting with winbase.h */
81984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "grammar.h"
91984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "node.h"
1085f363990cbd6df21015eebdc171c533176e3407Fred Drake#include "token.h"
111984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "parsetok.h"
121984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "errcode.h"
133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "code.h"
144b38da664c107bc08768235a66621429beef5444Jeremy Hylton#include "symtable.h"
153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "ast.h"
16fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum#include "marshal.h"
17790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#include "osdefs.h"
181984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
190e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters#ifdef HAVE_SIGNAL_H
20a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum#include <signal.h>
210e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters#endif
22a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum
2380a50acbe9de08730124bf557e042be1829d0838Benjamin Peterson#ifdef MS_WINDOWS
245c88d8178442af4d2ac9f42774bc9ab4c45e5751Martin v. Löwis#include "malloc.h" /* for alloca */
2580a50acbe9de08730124bf557e042be1829d0838Benjamin Peterson#endif
265c88d8178442af4d2ac9f42774bc9ab4c45e5751Martin v. Löwis
2773d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#ifdef HAVE_LANGINFO_H
2873d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#include <locale.h>
2973d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#include <langinfo.h>
3073d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#endif
3173d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis
326238d2b024f061159b2613387ff700695c10deefMartin v. Löwis#ifdef MS_WINDOWS
33a44823b7764281d398215564f2070257d08d0855Guido van Rossum#undef BYTE
34a44823b7764281d398215564f2070257d08d0855Guido van Rossum#include "windows.h"
35790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#define PATH_MAX MAXPATHLEN
36a44823b7764281d398215564f2070257d08d0855Guido van Rossum#endif
37a44823b7764281d398215564f2070257d08d0855Guido van Rossum
384281cef2057e24384a1d59b6bcf9e9161fde26e8Neal Norwitz#ifndef Py_REF_DEBUG
3949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#define PRINT_TOTAL_REFS()
404281cef2057e24384a1d59b6bcf9e9161fde26e8Neal Norwitz#else /* Py_REF_DEBUG */
41f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#define PRINT_TOTAL_REFS() fprintf(stderr,                              \
42f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   "[%" PY_FORMAT_SIZE_T "d refs]\n",                   \
43f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   _Py_GetRefTotal())
4449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
4549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
4649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
4749fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" {
484281cef2057e24384a1d59b6bcf9e9161fde26e8Neal Norwitz#endif
494281cef2057e24384a1d59b6bcf9e9161fde26e8Neal Norwitz
50790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisextern wchar_t *Py_GetPath(void);
511984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
5282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumextern grammar _PyParser_Grammar; /* From graminit.c */
531984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
54b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossum/* Forward */
5585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlanstatic void initmain(PyInterpreterState *interp);
56793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinnerstatic int initfsencoding(PyInterpreterState *interp);
57dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void initsite(void);
58ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossumstatic int initstdio(void);
597fedbe513d5ccc735d36e1da9781fcab1ca5961eAmaury Forgeot d'Arcstatic void flush_io(void);
603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
61f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                          PyCompilerFlags *, PyArena *);
6295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwisstatic PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
63f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                              PyCompilerFlags *);
64dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void err_input(perrdetail *);
657f2fee36401f7b987a368fe043637b3ae7116600Victor Stinnerstatic void err_free(perrdetail *);
66dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void initsigs(void);
67670e6921349dd408b6958a0c5d3b1486725f9bebCollin Winterstatic void call_py_exitfuncs(void);
68011bd62c8ca1888e04e579a4dac3dcc103e9a74bAntoine Pitroustatic void wait_for_thread_shutdown(void);
69dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void call_ll_exitfuncs(void);
703a50e7056ebfb835785c84df925d79bde6d0d209Victor Stinnerextern int _PyUnicode_Init(void);
71f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersextern void _PyUnicode_Fini(void);
72ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossumextern int _PyLong_Init(void);
73ddefaf31b366ea84250fc5090837c2b764a04102Guido van Rossumextern void PyLong_Fini(void);
74024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinnerextern int _PyFaulthandler_Init(void);
75024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinnerextern void _PyFaulthandler_Fini(void);
76c94044c11d5e1f61443163d1c5ea44019d7c5871Guido van Rossum
778d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond#ifdef WITH_THREAD
788d98d2cb95ac37147a4de5a119869211e8351324Mark Hammondextern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
798d98d2cb95ac37147a4de5a119869211e8351324Mark Hammondextern void _PyGILState_Fini(void);
808d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond#endif /* WITH_THREAD */
818d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond
8282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumint Py_DebugFlag; /* Needed by parser.c */
8382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumint Py_VerboseFlag; /* Needed by import.c */
848aa7e999b5ab87cdbefe441649c223647875c110Georg Brandlint Py_QuietFlag; /* Needed by sysmodule.c */
857433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossumint Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
860b2489e986dd8fa3c58c242dd30559fce5135aaaGeorg Brandlint Py_InspectFlag; /* Needed to determine whether to exit at SystemExit */
87dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossumint Py_NoSiteFlag; /* Suppress 'import site' */
8898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumint Py_BytesWarningFlag; /* Warn on str(bytes) and str(buffer) */
89790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimesint Py_DontWriteBytecodeFlag; /* Suppress writing bytecode files (*.py[co]) */
903ce096459e348c95c2c3348f8d84720f25c1a4c9Barry Warsawint Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
91a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossumint Py_FrozenFlag; /* Needed by getpath.c */
927d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauerint Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
938dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimesint Py_NoUserSiteDirectory = 0; /* for -s and site.py */
940560843b8fe8d4dd9e830f7b3ae7984154914516Antoine Pitrouint Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */
952daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandlint Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */
961984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
970d5e52d3469a310001afe50689f77ddba6d554d1Antoine PitrouPyThreadState *_Py_Finalizing = NULL;
980d5e52d3469a310001afe50689f77ddba6d554d1Antoine Pitrou
9949e61806f5675c7830f2290f3099588bd8f221dcChristian Heimes/* Hack to force loading of object files */
10049e61806f5675c7830f2290f3099588bd8f221dcChristian Heimesint (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t) = \
10149e61806f5675c7830f2290f3099588bd8f221dcChristian Heimes    PyOS_mystrnicmp; /* Python/pystrcmp.o */
10249e61806f5675c7830f2290f3099588bd8f221dcChristian Heimes
10333fe8093df5c13e41d7dba764279c71c142a4a7dChristian Heimes/* PyModule_GetWarningsModule is no longer necessary as of 2.6
10433fe8093df5c13e41d7dba764279c71c142a4a7dChristian Heimessince _warnings is builtin.  This API should not be used. */
10533fe8093df5c13e41d7dba764279c71c142a4a7dChristian HeimesPyObject *
10633fe8093df5c13e41d7dba764279c71c142a4a7dChristian HeimesPyModule_GetWarningsModule(void)
107edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond{
108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyImport_ImportModule("warnings");
109edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond}
110a43fd0c8996eec2bdd0ec59edc252cb4f4ff4436Mark Hammond
11125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossumstatic int initialized = 0;
11225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
1137e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters/* API to access the initialized flag -- useful for esoteric use */
114e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum
115e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossumint
116f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_IsInitialized(void)
117e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum{
118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return initialized;
119e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum}
120e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum
12125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum/* Global initializations.  Can be undone by Py_Finalize().  Don't
12225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   call this twice without an intervening Py_Finalize() call.  When
12325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   initializations fail, a fatal error is issued and the function does
12425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   not return.  On return, the first thread and interpreter state have
12525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   been created.
12625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
12725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   Locking: you must hold the interpreter lock while calling this.
12825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   (If the lock has not yet been initialized, that's equivalent to
12925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   having the lock, but you cannot use multiple threads.)
13025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
13125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum*/
1321984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1339abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossumstatic int
1349abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossumadd_flag(int flag, const char *envs)
1359abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum{
136f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int env = atoi(envs);
137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flag < env)
138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flag = env;
139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flag < 1)
140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flag = 1;
141f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return flag;
1429abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum}
1439abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum
1445833a2f6fdc6ee58b23a02380093bf1bfb015f3cChristian Heimesstatic char*
14594908bbc1503df830d1d615e7b57744ae1b41079Victor Stinnerget_codec_name(const char *encoding)
1465833a2f6fdc6ee58b23a02380093bf1bfb015f3cChristian Heimes{
14794908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner    char *name_utf8, *name_str;
148386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner    PyObject *codec, *name = NULL;
149bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(name);
1505833a2f6fdc6ee58b23a02380093bf1bfb015f3cChristian Heimes
15194908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner    codec = _PyCodec_Lookup(encoding);
152f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!codec)
153f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
1545833a2f6fdc6ee58b23a02380093bf1bfb015f3cChristian Heimes
1551ee1b6fe0dd7baca0da50e365929d03d42128705Martin v. Löwis    name = _PyObject_GetAttrId(codec, &PyId_name);
156f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_CLEAR(codec);
157f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!name)
158f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
1595833a2f6fdc6ee58b23a02380093bf1bfb015f3cChristian Heimes
16094908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner    name_utf8 = _PyUnicode_AsString(name);
1614ca2809b5c9dd9ffbad52d6c57113756365835fdVictor Stinner    if (name_utf8 == NULL)
162386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner        goto error;
16394908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner    name_str = strdup(name_utf8);
164f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(name);
16594908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner    if (name_str == NULL) {
16694908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner        PyErr_NoMemory();
16794908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner        return NULL;
16894908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner    }
16994908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner    return name_str;
1705833a2f6fdc6ee58b23a02380093bf1bfb015f3cChristian Heimes
1715833a2f6fdc6ee58b23a02380093bf1bfb015f3cChristian Heimeserror:
172f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(codec);
173386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner    Py_XDECREF(name);
174f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return NULL;
1755833a2f6fdc6ee58b23a02380093bf1bfb015f3cChristian Heimes}
17694908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner
17794908bbc1503df830d1d615e7b57744ae1b41079Victor Stinnerstatic char*
178d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinnerget_locale_encoding(void)
17994908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner{
180d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner#ifdef MS_WINDOWS
181d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner    char codepage[100];
182d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner    PyOS_snprintf(codepage, sizeof(codepage), "cp%d", GetACP());
183d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner    return get_codec_name(codepage);
184d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner#elif defined(HAVE_LANGINFO_H) && defined(CODESET)
18594908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner    char* codeset = nl_langinfo(CODESET);
18694908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner    if (!codeset || codeset[0] == '\0') {
18794908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner        PyErr_SetString(PyExc_ValueError, "CODESET is not set or empty");
18894908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner        return NULL;
18994908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner    }
19094908bbc1503df830d1d615e7b57744ae1b41079Victor Stinner    return get_codec_name(codeset);
191d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner#else
192d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner    PyErr_SetNone(PyExc_NotImplementedError);
193d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner    return NULL;
1945833a2f6fdc6ee58b23a02380093bf1bfb015f3cChristian Heimes#endif
195d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner}
1965833a2f6fdc6ee58b23a02380093bf1bfb015f3cChristian Heimes
197fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannonstatic void
198fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannonimport_init(PyInterpreterState *interp, PyObject *sysmod)
199fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon{
200fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    PyObject *importlib;
201fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    PyObject *impmod;
202fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    PyObject *sys_modules;
203fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    PyObject *value;
204fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
205fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    /* Import _importlib through its frozen version, _frozen_importlib. */
206fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) {
207fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        Py_FatalError("Py_Initialize: can't import _frozen_importlib");
208fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    }
209fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    else if (Py_VerboseFlag) {
210fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        PySys_FormatStderr("import _frozen_importlib # frozen\n");
211fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    }
212fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    importlib = PyImport_AddModule("_frozen_importlib");
213fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    if (importlib == NULL) {
214fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        Py_FatalError("Py_Initialize: couldn't get _frozen_importlib from "
215fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon                      "sys.modules");
216fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    }
217fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    interp->importlib = importlib;
218fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    Py_INCREF(interp->importlib);
219fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
220fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    /* Install _importlib as __import__ */
221fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    impmod = PyInit_imp();
222fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    if (impmod == NULL) {
223fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        Py_FatalError("Py_Initialize: can't import imp");
224fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    }
225fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    else if (Py_VerboseFlag) {
226fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        PySys_FormatStderr("import imp # builtin\n");
227fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    }
228fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    sys_modules = PyImport_GetModuleDict();
229fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    if (Py_VerboseFlag) {
230fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        PySys_FormatStderr("import sys # builtin\n");
231fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    }
2326f44d66bc491bad5b8d897a68da68e009e27829dBrett Cannon    if (PyDict_SetItemString(sys_modules, "_imp", impmod) < 0) {
2336f44d66bc491bad5b8d897a68da68e009e27829dBrett Cannon        Py_FatalError("Py_Initialize: can't save _imp to sys.modules");
234fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    }
235fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
236e0d88a173c5ccc346b8d7c6e805f0e49b4ea92f7Brett Cannon    value = PyObject_CallMethod(importlib, "_install", "OO", sysmod, impmod);
237fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    if (value == NULL) {
238fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        PyErr_Print();
239fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        Py_FatalError("Py_Initialize: importlib install failed");
240fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    }
241fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    Py_DECREF(value);
242fc9ca274b8d814e1fdfce72828414ae628fdba88Brett Cannon    Py_DECREF(impmod);
243fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
244fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    _PyImportZip_Init();
245fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon}
246fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
247fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
2481984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumvoid
249e67f48ce5e7ad122b17e23b2705bf66cff76d42bAntoine Pitrou_Py_InitializeEx_Private(int install_sigs, int install_importlib)
2501984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
251f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyInterpreterState *interp;
252f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyThreadState *tstate;
253f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *bimod, *sysmod, *pstderr;
254f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *p;
255f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    extern void _Py_ReadyTypes(void);
25625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
257f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (initialized)
258f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
259f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    initialized = 1;
2600d5e52d3469a310001afe50689f77ddba6d554d1Antoine Pitrou    _Py_Finalizing = NULL;
261d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters
262b2ceb3ad9e30db522ee26fe340af18397c607c24Andrew M. Kuchling#if defined(HAVE_LANGINFO_H) && defined(HAVE_SETLOCALE)
263f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Set up the LC_CTYPE locale, so we can obtain
264f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       the locale's charset without having to switch
265f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       locales. */
266f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    setlocale(LC_CTYPE, "");
267d1cd4d41762ba55bfa121875fbcbde19fb6a35f1Martin v. Löwis#endif
268d1cd4d41762ba55bfa121875fbcbde19fb6a35f1Martin v. Löwis
269f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
270f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DebugFlag = add_flag(Py_DebugFlag, p);
271f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
272f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_VerboseFlag = add_flag(Py_VerboseFlag, p);
273f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
274f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
275f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0')
276f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p);
2772daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl    /* The variable is only tested for existence here; _PyRandom_Init will
2782daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl       check its value further. */
2792daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl    if ((p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0')
2802daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl        Py_HashRandomizationFlag = add_flag(Py_HashRandomizationFlag, p);
2812daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl
2822daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl    _PyRandom_Init();
283f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
284f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    interp = PyInterpreterState_New();
285f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (interp == NULL)
286f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_Initialize: can't make first interpreter");
287f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
288f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    tstate = PyThreadState_New(interp);
289f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (tstate == NULL)
290f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_Initialize: can't make first thread");
291f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    (void) PyThreadState_Swap(tstate);
292f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2936961bd690e617b963a55ce86a640eedb590bc23bVictor Stinner#ifdef WITH_THREAD
294b0b384b7c0333bf1183cd6f90c0a3f9edaadd6b9Antoine Pitrou    /* We can't call _PyEval_FiniThreads() in Py_Finalize because
295b0b384b7c0333bf1183cd6f90c0a3f9edaadd6b9Antoine Pitrou       destroying the GIL might fail when it is being referenced from
296b0b384b7c0333bf1183cd6f90c0a3f9edaadd6b9Antoine Pitrou       another running thread (see issue #9901).
297b0b384b7c0333bf1183cd6f90c0a3f9edaadd6b9Antoine Pitrou       Instead we destroy the previously created GIL here, which ensures
298b0b384b7c0333bf1183cd6f90c0a3f9edaadd6b9Antoine Pitrou       that we can call Py_Initialize / Py_Finalize multiple times. */
299b0b384b7c0333bf1183cd6f90c0a3f9edaadd6b9Antoine Pitrou    _PyEval_FiniThreads();
300b0b384b7c0333bf1183cd6f90c0a3f9edaadd6b9Antoine Pitrou
301b0b384b7c0333bf1183cd6f90c0a3f9edaadd6b9Antoine Pitrou    /* Auto-thread-state API */
3026961bd690e617b963a55ce86a640eedb590bc23bVictor Stinner    _PyGILState_Init(interp, tstate);
3036961bd690e617b963a55ce86a640eedb590bc23bVictor Stinner#endif /* WITH_THREAD */
3046961bd690e617b963a55ce86a640eedb590bc23bVictor Stinner
305f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _Py_ReadyTypes();
306f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
307f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!_PyFrame_Init())
308f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_Initialize: can't init frames");
309f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
310f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!_PyLong_Init())
311f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_Initialize: can't init longs");
312f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
313f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyByteArray_Init())
314f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_Initialize: can't init bytearray");
315f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
316f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _PyFloat_Init();
317f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
318f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    interp->modules = PyDict_New();
319f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (interp->modules == NULL)
320f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_Initialize: can't make modules dictionary");
321f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
322f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Init Unicode implementation; relies on the codec registry */
3233a50e7056ebfb835785c84df925d79bde6d0d209Victor Stinner    if (_PyUnicode_Init() < 0)
3243a50e7056ebfb835785c84df925d79bde6d0d209Victor Stinner        Py_FatalError("Py_Initialize: can't initialize unicode");
325f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
326f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    bimod = _PyBuiltin_Init();
327f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (bimod == NULL)
328f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_Initialize: can't initialize builtins modules");
32949d3f2514b4edcabae3b08286016c98b584bb3a2Victor Stinner    _PyImport_FixupBuiltin(bimod, "builtins");
330f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    interp->builtins = PyModule_GetDict(bimod);
331f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (interp->builtins == NULL)
332f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_Initialize: can't initialize builtins dict");
333f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_INCREF(interp->builtins);
334f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* initialize builtin exceptions */
336fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    _PyExc_Init(bimod);
337f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
338f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    sysmod = _PySys_Init();
339f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (sysmod == NULL)
340f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_Initialize: can't initialize sys");
341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    interp->sysdict = PyModule_GetDict(sysmod);
342f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (interp->sysdict == NULL)
343f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_Initialize: can't initialize sys dict");
344f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_INCREF(interp->sysdict);
34549d3f2514b4edcabae3b08286016c98b584bb3a2Victor Stinner    _PyImport_FixupBuiltin(sysmod, "sys");
346f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetPath(Py_GetPath());
347f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyDict_SetItemString(interp->sysdict, "modules",
348f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                         interp->modules);
349f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
350f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Set up a preliminary stderr printer until we have enough
351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       infrastructure for the io module in place. */
352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    pstderr = PyFile_NewStdPrinter(fileno(stderr));
353f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (pstderr == NULL)
354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_Initialize: can't set preliminary stderr");
355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetObject("stderr", pstderr);
356f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetObject("__stderr__", pstderr);
357daf83acf003466777db394cb5e41d72ee6aea035Hirokazu Yamamoto    Py_DECREF(pstderr);
358f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
359f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _PyImport_Init();
360f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
361f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _PyImportHooks_Init();
36252e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum
3637d79b8b7714b5e7d8a0582a07b5625c280c879c0Victor Stinner    /* Initialize _warnings. */
3647d79b8b7714b5e7d8a0582a07b5625c280c879c0Victor Stinner    _PyWarnings_Init();
3657d79b8b7714b5e7d8a0582a07b5625c280c879c0Victor Stinner
366e67f48ce5e7ad122b17e23b2705bf66cff76d42bAntoine Pitrou    if (!install_importlib)
367e67f48ce5e7ad122b17e23b2705bf66cff76d42bAntoine Pitrou        return;
368e67f48ce5e7ad122b17e23b2705bf66cff76d42bAntoine Pitrou
369fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    import_init(interp, sysmod);
370fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
371d5698cbbcade36d49bb32e797499d1190c38558aVictor Stinner    /* initialize the faulthandler module */
372d5698cbbcade36d49bb32e797499d1190c38558aVictor Stinner    if (_PyFaulthandler_Init())
373d5698cbbcade36d49bb32e797499d1190c38558aVictor Stinner        Py_FatalError("Py_Initialize: can't initialize faulthandler");
374d5698cbbcade36d49bb32e797499d1190c38558aVictor Stinner
3756fc4ade2bb44a176555703ebc2dbfb54b57e1148Alexander Belopolsky    _PyTime_Init();
3766fc4ade2bb44a176555703ebc2dbfb54b57e1148Alexander Belopolsky
377793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinner    if (initfsencoding(interp) < 0)
378793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinner        Py_FatalError("Py_Initialize: unable to load the file system codec");
379011e8420339245f9b55d41082ec6036f2f83a182Martin v. Löwis
380f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (install_sigs)
381f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        initsigs(); /* Signal handling stuff, including initintr() */
382f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
38385e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    initmain(interp); /* Module __main__ */
384cf9f98034a6bc7c55486042da1867447cfd2f0b5Antoine Pitrou    if (initstdio() < 0)
385cf9f98034a6bc7c55486042da1867447cfd2f0b5Antoine Pitrou        Py_FatalError(
386cf9f98034a6bc7c55486042da1867447cfd2f0b5Antoine Pitrou            "Py_Initialize: can't initialize sys standard streams");
387cf9f98034a6bc7c55486042da1867447cfd2f0b5Antoine Pitrou
388f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Initialize warnings. */
389f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PySys_HasWarnOptions()) {
390f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *warnings_module = PyImport_ImportModule("warnings");
391cf9f98034a6bc7c55486042da1867447cfd2f0b5Antoine Pitrou        if (warnings_module == NULL) {
392cf9f98034a6bc7c55486042da1867447cfd2f0b5Antoine Pitrou            fprintf(stderr, "'import warnings' failed; traceback:\n");
393cf9f98034a6bc7c55486042da1867447cfd2f0b5Antoine Pitrou            PyErr_Print();
394cf9f98034a6bc7c55486042da1867447cfd2f0b5Antoine Pitrou        }
395f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(warnings_module);
396f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
398f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_NoSiteFlag)
399f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        initsite(); /* Module site */
4006135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum}
4016135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum
402336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwisvoid
403e67f48ce5e7ad122b17e23b2705bf66cff76d42bAntoine PitrouPy_InitializeEx(int install_sigs)
404e67f48ce5e7ad122b17e23b2705bf66cff76d42bAntoine Pitrou{
405e67f48ce5e7ad122b17e23b2705bf66cff76d42bAntoine Pitrou    _Py_InitializeEx_Private(install_sigs, 1);
406e67f48ce5e7ad122b17e23b2705bf66cff76d42bAntoine Pitrou}
407e67f48ce5e7ad122b17e23b2705bf66cff76d42bAntoine Pitrou
408e67f48ce5e7ad122b17e23b2705bf66cff76d42bAntoine Pitrouvoid
409336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. LöwisPy_Initialize(void)
410336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis{
411f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_InitializeEx(1);
412336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis}
413336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis
414336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis
4152edcf0d71c2938b4f7159bf586c2174326d57bd6Guido van Rossum#ifdef COUNT_ALLOCS
41649fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern void dump_counts(FILE*);
4172edcf0d71c2938b4f7159bf586c2174326d57bd6Guido van Rossum#endif
4182edcf0d71c2938b4f7159bf586c2174326d57bd6Guido van Rossum
419e8432ac42f9030bd75de03a07fd9059006292b7aGuido van Rossum/* Flush stdout and stderr */
420e8432ac42f9030bd75de03a07fd9059006292b7aGuido van Rossum
421d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitroustatic int
422d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitroufile_is_closed(PyObject *fobj)
423d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou{
424d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou    int r;
425d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou    PyObject *tmp = PyObject_GetAttrString(fobj, "closed");
426d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou    if (tmp == NULL) {
427d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou        PyErr_Clear();
428d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou        return 0;
429d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou    }
430d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou    r = PyObject_IsTrue(tmp);
431d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou    Py_DECREF(tmp);
432d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou    if (r < 0)
433d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou        PyErr_Clear();
434d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou    return r > 0;
435d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou}
436d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou
4372bad9702930f620b61c8bc3cec3d4cd811df3693Neal Norwitzstatic void
4381bd2122041d06782f46dd5f3c6b2b50909a7bd65Guido van Rossumflush_std_files(void)
439e8432ac42f9030bd75de03a07fd9059006292b7aGuido van Rossum{
440f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *fout = PySys_GetObject("stdout");
441f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *ferr = PySys_GetObject("stderr");
442f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *tmp;
443bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(flush);
444e8432ac42f9030bd75de03a07fd9059006292b7aGuido van Rossum
445d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou    if (fout != NULL && fout != Py_None && !file_is_closed(fout)) {
446afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis        tmp = _PyObject_CallMethodId(fout, &PyId_flush, "");
447f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (tmp == NULL)
448bddc9fe22bb5d78bfb3db891d3b2d56d963f6e04Antoine Pitrou            PyErr_WriteUnraisable(fout);
449f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
450f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(tmp);
451f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
452e8432ac42f9030bd75de03a07fd9059006292b7aGuido van Rossum
453d7c8fbf89e751d43c56de0071702d2578676d0a1Antoine Pitrou    if (ferr != NULL && ferr != Py_None && !file_is_closed(ferr)) {
454afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis        tmp = _PyObject_CallMethodId(ferr, &PyId_flush, "");
455f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (tmp == NULL)
456f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
457f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
458f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(tmp);
459f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
460e8432ac42f9030bd75de03a07fd9059006292b7aGuido van Rossum}
461e8432ac42f9030bd75de03a07fd9059006292b7aGuido van Rossum
46225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum/* Undo the effect of Py_Initialize().
46325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
46425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   Beware: if multiple interpreter and/or thread states exist, these
46525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   are not wiped out; only the current thread and interpreter state
46625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   are deleted.  But since everything else is deleted, those other
46725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   interpreter and thread states should no longer be used.
46825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
46925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   (XXX We should do better, e.g. wipe out all interpreters and
47025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   threads.)
47125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
47225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   Locking: as above.
47325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
47425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum*/
475a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum
476a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossumvoid
477f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_Finalize(void)
478a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum{
479f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyInterpreterState *interp;
480f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyThreadState *tstate;
481f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
482f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!initialized)
483f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
484f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
485f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wait_for_thread_shutdown();
486f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
487f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* The interpreter is still entirely intact at this point, and the
488f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * exit funcs may be relying on that.  In particular, if some thread
489f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * or exit func is still waiting to do an import, the import machinery
490f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * expects Py_IsInitialized() to return true.  So don't say the
491f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * interpreter is uninitialized until after the exit funcs have run.
492f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * Note that Threading.py uses an exit func to do a join on all the
493f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * threads created thru it, so this also protects pending imports in
494f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * the threads created via Threading.
495f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
496f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    call_py_exitfuncs();
497f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
498f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Get current thread state and interpreter pointer */
499f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    tstate = PyThreadState_GET();
500f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    interp = tstate->interp;
501f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
5020d5e52d3469a310001afe50689f77ddba6d554d1Antoine Pitrou    /* Remaining threads (e.g. daemon threads) will automatically exit
5030d5e52d3469a310001afe50689f77ddba6d554d1Antoine Pitrou       after taking the GIL (in PyEval_RestoreThread()). */
5040d5e52d3469a310001afe50689f77ddba6d554d1Antoine Pitrou    _Py_Finalizing = tstate;
5050d5e52d3469a310001afe50689f77ddba6d554d1Antoine Pitrou    initialized = 0;
5060d5e52d3469a310001afe50689f77ddba6d554d1Antoine Pitrou
5070d5e52d3469a310001afe50689f77ddba6d554d1Antoine Pitrou    /* Flush stdout+stderr */
5080d5e52d3469a310001afe50689f77ddba6d554d1Antoine Pitrou    flush_std_files();
5090d5e52d3469a310001afe50689f77ddba6d554d1Antoine Pitrou
510f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Disable signal handling */
511f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyOS_FiniInterrupts();
512f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
513f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Collect garbage.  This may call finalizers; it's nice to call these
514f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * before all modules are destroyed.
515f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX If a __del__ or weakref callback is triggered here, and tries to
516f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX import a module, bad things can happen, because Python no
517f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX longer believes it's initialized.
518f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX     Fatal Python error: Interpreter not initialized (version mismatch?)
519f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX is easy to provoke that way.  I've also seen, e.g.,
520f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX     Exception exceptions.ImportError: 'No module named sha'
521f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX         in <function callback at 0x008F5718> ignored
522f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX but I'm unclear on exactly how that one happens.  In any case,
523f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX I haven't seen a real-life report of either of these.
524f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
525f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyGC_Collect();
52649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef COUNT_ALLOCS
527f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* With COUNT_ALLOCS, it helps to run GC multiple times:
528f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       each collection might release some types from the type
529f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       list, so they become garbage. */
530f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    while (PyGC_Collect() > 0)
531f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* nothing */;
53249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
533696e03553b9e455bd6729cee5a8be43a2924f537Antoine Pitrou    /* We run this while most interpreter state is still alive, so that
534696e03553b9e455bd6729cee5a8be43a2924f537Antoine Pitrou       debug information can be printed out */
535696e03553b9e455bd6729cee5a8be43a2924f537Antoine Pitrou    _PyGC_Fini();
536e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum
537f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Destroy all modules */
538f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyImport_Cleanup();
539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
540f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Flush stdout+stderr (again, in case more was printed) */
541f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    flush_std_files();
542f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
543f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Collect final garbage.  This disposes of cycles created by
544aa6c1d240fc4dd883b4c5a1564182e8fa90de496Florent Xicluna     * class definitions, for example.
545f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX This is disabled because it caused too many problems.  If
546f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX a __del__ or weakref callback triggers here, Python code has
547f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX a hard time running, because even the sys module has been
548f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
549f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX One symptom is a sequence of information-free messages
550f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX coming from threads (if a __del__ or callback is invoked,
551f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX other threads can execute too, and any exception they encounter
552f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX triggers a comedy of errors as subsystem after subsystem
553f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX fails to find what it *expects* to find in sys to help report
554f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX the exception and consequent unexpected failures).  I've also
555f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX seen segfaults then, after adding print statements to the
556f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * XXX Python code getting called.
557f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
5581d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters#if 0
559f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyGC_Collect();
5601d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters#endif
561e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum
562f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
563f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _PyImport_Fini();
5641707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum
565fd417cc54bc71fb294c4f9889441929d3e8b3dccAntoine Pitrou    /* Cleanup typeobject.c's internal caches. */
566fd417cc54bc71fb294c4f9889441929d3e8b3dccAntoine Pitrou    _PyType_Fini();
567fd417cc54bc71fb294c4f9889441929d3e8b3dccAntoine Pitrou
568024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner    /* unload faulthandler module */
569024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner    _PyFaulthandler_Fini();
570024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner
571f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Debugging stuff */
5721707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum#ifdef COUNT_ALLOCS
573f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    dump_counts(stdout);
5741707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum#endif
5751707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum
576f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PRINT_TOTAL_REFS();
5771707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum
5789cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters#ifdef Py_TRACE_REFS
579f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Display all objects still alive -- this can invoke arbitrary
580f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * __repr__ overrides, so requires a mostly-intact interpreter.
581f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * Alas, a lot of stuff may still be alive now that will be cleaned
582f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * up later.
583f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
584f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_GETENV("PYTHONDUMPREFS"))
585f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _Py_PrintReferences(stderr);
5869cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters#endif /* Py_TRACE_REFS */
5879cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters
588fd417cc54bc71fb294c4f9889441929d3e8b3dccAntoine Pitrou    /* Clear interpreter state and all thread states. */
589f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyInterpreterState_Clear(interp);
590d922fa46ce0763e63c3d6a14bc89059b0eef33eaGuido van Rossum
591f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Now we decref the exception classes.  After this point nothing
592f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       can raise an exception.  That's okay, because each Fini() method
593f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       below has been checked to make sure no exceptions are ever
594f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       raised.
595f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    */
59612b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter
597f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _PyExc_Fini();
59812b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter
599f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Cleanup auto-thread-state */
6007d2ff884eeb636fcd30ebd2f9886c4b46e8545bcChristian Heimes#ifdef WITH_THREAD
601f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _PyGILState_Fini();
6027d2ff884eeb636fcd30ebd2f9886c4b46e8545bcChristian Heimes#endif /* WITH_THREAD */
6037d2ff884eeb636fcd30ebd2f9886c4b46e8545bcChristian Heimes
604f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Sundry finalizers */
605f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyMethod_Fini();
606f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyFrame_Fini();
607f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCFunction_Fini();
608f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyTuple_Fini();
609f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyList_Fini();
610f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySet_Fini();
611f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyBytes_Fini();
612f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyByteArray_Fini();
613f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyLong_Fini();
614f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyFloat_Fini();
615f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyDict_Fini();
616f34a0cdc6cbf6507508392e4588a9ca0ce8cb6b0Antoine Pitrou    PySlice_Fini();
617f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
618f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Cleanup Unicode implementation */
619f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _PyUnicode_Fini();
620f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
621fd417cc54bc71fb294c4f9889441929d3e8b3dccAntoine Pitrou    /* Delete current thread. After this, many C API calls become crashy. */
622fd417cc54bc71fb294c4f9889441929d3e8b3dccAntoine Pitrou    PyThreadState_Swap(NULL);
623fd417cc54bc71fb294c4f9889441929d3e8b3dccAntoine Pitrou    PyInterpreterState_Delete(interp);
624fd417cc54bc71fb294c4f9889441929d3e8b3dccAntoine Pitrou
625f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* reset file system default encoding */
626b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner    if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) {
627f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free((char*)Py_FileSystemDefaultEncoding);
628f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FileSystemDefaultEncoding = NULL;
629f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
630f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
631f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* XXX Still allocated:
632f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       - various static ad-hoc pointers to interned strings
633f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       - int and float free list blocks
634f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       - whatever various modules and libraries allocate
635f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    */
636f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
637f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
638cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum
639269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters#ifdef Py_TRACE_REFS
640f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Display addresses (& refcnts) of all objects still alive.
641f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * An address can be used to find the repr of the object, printed
642f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * above by _Py_PrintReferences.
643f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
644f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_GETENV("PYTHONDUMPREFS"))
645f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _Py_PrintReferenceAddresses(stderr);
646269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters#endif /* Py_TRACE_REFS */
6470e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters#ifdef PYMALLOC_DEBUG
648f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_GETENV("PYTHONMALLOCSTATS"))
64949526f48fc73d3ccdf09d466ed2d39a30e4df9b9David Malcolm        _PyObject_DebugMallocStats(stderr);
6500e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters#endif
6510e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters
652f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    call_ll_exitfuncs();
65325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum}
65425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
65525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum/* Create and initialize a new interpreter and thread, and return the
65625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   new thread.  This requires that Py_Initialize() has been called
65725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   first.
65825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
65925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   Unsuccessful initialization yields a NULL pointer.  Note that *no*
66025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   exception information is available even in this case -- the
66125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   exception information is held in the thread, and there is no
66225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   thread.
66325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
66425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   Locking: as above.
66525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
66625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum*/
66725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
66825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van RossumPyThreadState *
669f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_NewInterpreter(void)
67025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum{
671f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyInterpreterState *interp;
672f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyThreadState *tstate, *save_tstate;
673f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *bimod, *sysmod;
674f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
675f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!initialized)
676f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
677f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
678f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    interp = PyInterpreterState_New();
679f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (interp == NULL)
680f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
681f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
682f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    tstate = PyThreadState_New(interp);
683f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (tstate == NULL) {
684f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyInterpreterState_Delete(interp);
685f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
686f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
687f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
688f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    save_tstate = PyThreadState_Swap(tstate);
689f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
690f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* XXX The following is lax in error checking */
691f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
692f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    interp->modules = PyDict_New();
693f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
69449d3f2514b4edcabae3b08286016c98b584bb3a2Victor Stinner    bimod = _PyImport_FindBuiltin("builtins");
695f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (bimod != NULL) {
696f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        interp->builtins = PyModule_GetDict(bimod);
697f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (interp->builtins == NULL)
698f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto handle_error;
699f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(interp->builtins);
700f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
701f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
702f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* initialize builtin exceptions */
703fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon    _PyExc_Init(bimod);
704f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
70549d3f2514b4edcabae3b08286016c98b584bb3a2Victor Stinner    sysmod = _PyImport_FindBuiltin("sys");
706f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (bimod != NULL && sysmod != NULL) {
707f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *pstderr;
708fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
709f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        interp->sysdict = PyModule_GetDict(sysmod);
710f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (interp->sysdict == NULL)
711f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto handle_error;
712f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(interp->sysdict);
713f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySys_SetPath(Py_GetPath());
714f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyDict_SetItemString(interp->sysdict, "modules",
715f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                             interp->modules);
716f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Set up a preliminary stderr printer until we have enough
717f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           infrastructure for the io module in place. */
718f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        pstderr = PyFile_NewStdPrinter(fileno(stderr));
719f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (pstderr == NULL)
720f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError("Py_Initialize: can't set preliminary stderr");
721f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySys_SetObject("stderr", pstderr);
722f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySys_SetObject("__stderr__", pstderr);
723daf83acf003466777db394cb5e41d72ee6aea035Hirokazu Yamamoto        Py_DECREF(pstderr);
724f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
725f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyImportHooks_Init();
726793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinner
727fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon        import_init(interp, sysmod);
728fd0741555b733f66c0a35c698d0cac5e73010ae0Brett Cannon
729793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinner        if (initfsencoding(interp) < 0)
730793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinner            goto handle_error;
731793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinner
732f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (initstdio() < 0)
733f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
734f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            "Py_Initialize: can't initialize sys standard streams");
73585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        initmain(interp);
736f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!Py_NoSiteFlag)
737f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            initsite();
738f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
739f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
740f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyErr_Occurred())
741f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return tstate;
74225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
74389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutershandle_error:
744f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Oops, it didn't work.  Undo it all. */
74525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
746c40a350db0f16c678273ee715fe7c70c431360a1Victor Stinner    PyErr_PrintEx(0);
747f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyThreadState_Clear(tstate);
748f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyThreadState_Swap(save_tstate);
749f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyThreadState_Delete(tstate);
750f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyInterpreterState_Delete(interp);
75125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
752f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return NULL;
75325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum}
75425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
75525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum/* Delete an interpreter and its last thread.  This requires that the
75625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   given thread state is current, that the thread has no remaining
75725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   frames, and that it is its interpreter's only remaining thread.
75825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   It is a fatal error to violate these constraints.
75925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
76025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   (Py_Finalize() doesn't have these constraints -- it zaps
76125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   everything, regardless.)
76225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
76325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum   Locking: as above.
76425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
76525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum*/
76625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
76725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossumvoid
768f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_EndInterpreter(PyThreadState *tstate)
76925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum{
770f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyInterpreterState *interp = tstate->interp;
77125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
772f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (tstate != PyThreadState_GET())
773f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_EndInterpreter: thread is not current");
774f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (tstate->frame != NULL)
775f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_EndInterpreter: thread still has a frame");
776f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (tstate != interp->tstate_head || tstate->next != NULL)
777f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("Py_EndInterpreter: not the last thread");
77825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
779f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyImport_Cleanup();
780f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyInterpreterState_Clear(interp);
781f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyThreadState_Swap(NULL);
782f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyInterpreterState_Delete(interp);
783ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum}
784ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum
78501cca5e45185474bdb3c621c5dec4bfc0b323483Antoine Pitrou#ifdef MS_WINDOWS
786790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t *progname = L"python";
78701cca5e45185474bdb3c621c5dec4bfc0b323483Antoine Pitrou#else
78801cca5e45185474bdb3c621c5dec4bfc0b323483Antoine Pitroustatic wchar_t *progname = L"python3";
78901cca5e45185474bdb3c621c5dec4bfc0b323483Antoine Pitrou#endif
790ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum
791ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossumvoid
792790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_SetProgramName(wchar_t *pn)
793ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum{
794f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (pn && *pn)
795f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        progname = pn;
796ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum}
797ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum
798790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwiswchar_t *
799f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_GetProgramName(void)
800ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum{
801f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return progname;
802a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum}
803a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum
804790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t *default_home = NULL;
805790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t env_home[PATH_MAX+1];
806a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum
807a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossumvoid
808790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_SetPythonHome(wchar_t *home)
809a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum{
810f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    default_home = home;
811a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum}
812a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum
813790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwiswchar_t *
814f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_GetPythonHome(void)
815a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum{
816f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *home = default_home;
817f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (home == NULL && !Py_IgnoreEnvironmentFlag) {
818f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        char* chome = Py_GETENV("PYTHONHOME");
819f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (chome) {
8202f5bbc6a123dfb36ed1f89e9016ec356695bdd8aVictor Stinner            size_t size = Py_ARRAY_LENGTH(env_home);
8212f5bbc6a123dfb36ed1f89e9016ec356695bdd8aVictor Stinner            size_t r = mbstowcs(env_home, chome, size);
8222f5bbc6a123dfb36ed1f89e9016ec356695bdd8aVictor Stinner            if (r != (size_t)-1 && r < size)
823f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                home = env_home;
824f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
825790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis
826f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
827f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return home;
828a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum}
829a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum
8306135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum/* Create __main__ module */
8316135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum
8326135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossumstatic void
83385e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlaninitmain(PyInterpreterState *interp)
8346135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum{
835f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *m, *d;
836f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = PyImport_AddModule("__main__");
837f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m == NULL)
838f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_FatalError("can't create __main__ module");
839f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    d = PyModule_GetDict(m);
840f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyDict_GetItemString(d, "__builtins__") == NULL) {
841f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *bimod = PyImport_ImportModule("builtins");
84285e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        if (bimod == NULL) {
84385e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            Py_FatalError("Failed to retrieve builtins module");
84485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        }
84585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) {
84685e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            Py_FatalError("Failed to initialize __main__.__builtins__");
84785e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        }
848f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(bimod);
849f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
85085e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    /* Main is a little special - imp.is_builtin("__main__") will return
85185e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan     * False, but BuiltinImporter is still the most appropriate initial
85285e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan     * setting for its __loader__ attribute. A more suitable value will
85385e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan     * be set if __main__ gets further initialized later in the startup
85485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan     * process.
85585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan     */
85685e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    if (PyDict_GetItemString(d, "__loader__") == NULL) {
85785e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        PyObject *loader = PyObject_GetAttrString(interp->importlib,
85885e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan                                                  "BuiltinImporter");
85985e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        if (loader == NULL) {
86085e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            Py_FatalError("Failed to retrieve BuiltinImporter");
86185e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        }
86285e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
86385e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            Py_FatalError("Failed to initialize __main__.__loader__");
86485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        }
86585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        Py_DECREF(loader);
86685e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    }
8671984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
8681984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
869793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinnerstatic int
870793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinnerinitfsencoding(PyInterpreterState *interp)
871b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner{
872b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner    PyObject *codec;
873d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner
874d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner    if (Py_FileSystemDefaultEncoding == NULL)
875d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner    {
876d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner        Py_FileSystemDefaultEncoding = get_locale_encoding();
877d64e8a75e5138d5e5970f0c70995ae5cc377c421Victor Stinner        if (Py_FileSystemDefaultEncoding == NULL)
878e474309bb7f0ba6e6ae824c215c45f00db691889Victor Stinner            Py_FatalError("Py_Initialize: Unable to get the locale encoding");
879b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner
880e474309bb7f0ba6e6ae824c215c45f00db691889Victor Stinner        Py_HasFileSystemDefaultEncoding = 0;
881793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinner        interp->fscodec_initialized = 1;
882793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinner        return 0;
8837f84ab59523ab7f7d7d288551a459e24718b8c7dVictor Stinner    }
884b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner
885b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner    /* the encoding is mbcs, utf-8 or ascii */
886b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner    codec = _PyCodec_Lookup(Py_FileSystemDefaultEncoding);
887b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner    if (!codec) {
888b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner        /* Such error can only occurs in critical situations: no more
889b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner         * memory, import a module of the standard library failed,
890b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner         * etc. */
891793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinner        return -1;
892b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner    }
893793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinner    Py_DECREF(codec);
894793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinner    interp->fscodec_initialized = 1;
895793b531756a4752a167e29f53c4ff49ce2846c74Victor Stinner    return 0;
896b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner}
897b744ba1d14c5487576c95d0311e357b707600b47Victor Stinner
898dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum/* Import the site module (not into __main__ though) */
899dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum
900dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossumstatic void
901f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersinitsite(void)
902dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum{
903f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *m;
904f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = PyImport_ImportModule("site");
905f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m == NULL) {
906f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
907f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_Finalize();
908f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        exit(1);
909f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
910f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
911f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(m);
912f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
913dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum}
914dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum
9150560843b8fe8d4dd9e830f7b3ae7984154914516Antoine Pitroustatic PyObject*
9160560843b8fe8d4dd9e830f7b3ae7984154914516Antoine Pitroucreate_stdio(PyObject* io,
917f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int fd, int write_mode, char* name,
918f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char* encoding, char* errors)
919f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
920f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *buf = NULL, *stream = NULL, *text = NULL, *raw = NULL, *res;
921f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    const char* mode;
922c0f1a1afae3843986eb0bef54b165424361f2510Victor Stinner    const char* newline;
923f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *line_buffering;
924f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int buffering, isatty;
925bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(open);
926bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(isatty);
927bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(TextIOWrapper);
9281c67dd9b154d57baf58ed081767e199af1e84923Martin v. Löwis    _Py_IDENTIFIER(name);
9291c67dd9b154d57baf58ed081767e199af1e84923Martin v. Löwis    _Py_IDENTIFIER(mode);
930f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
931f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* stdin is always opened in buffered mode, first because it shouldn't
932f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       make a difference in common use cases, second because TextIOWrapper
933f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       depends on the presence of a read1() method which only exists on
934f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       buffered streams.
935f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    */
936f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_UnbufferedStdioFlag && write_mode)
937f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        buffering = 0;
938f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else
939f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        buffering = -1;
940f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (write_mode)
941f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        mode = "wb";
942f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else
943f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        mode = "rb";
944afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    buf = _PyObject_CallMethodId(io, &PyId_open, "isiOOOi",
945afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis                                 fd, mode, buffering,
946afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis                                 Py_None, Py_None, Py_None, 0);
947f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (buf == NULL)
948f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
949f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
950f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (buffering) {
951bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis        _Py_IDENTIFIER(raw);
9521ee1b6fe0dd7baca0da50e365929d03d42128705Martin v. Löwis        raw = _PyObject_GetAttrId(buf, &PyId_raw);
953f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (raw == NULL)
954f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto error;
955f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
956f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
957f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        raw = buf;
958f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(raw);
959f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
960f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
961f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    text = PyUnicode_FromString(name);
9621c67dd9b154d57baf58ed081767e199af1e84923Martin v. Löwis    if (text == NULL || _PyObject_SetAttrId(raw, &PyId_name, text) < 0)
963f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
964afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    res = _PyObject_CallMethodId(raw, &PyId_isatty, "");
965f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (res == NULL)
966f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
967f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    isatty = PyObject_IsTrue(res);
968f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(res);
969f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (isatty == -1)
970f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
971f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (isatty || Py_UnbufferedStdioFlag)
972f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        line_buffering = Py_True;
973f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else
974f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        line_buffering = Py_False;
975f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
976f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_CLEAR(raw);
977f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_CLEAR(text);
978f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
979c0f1a1afae3843986eb0bef54b165424361f2510Victor Stinner#ifdef MS_WINDOWS
9807b3f0fa68e320253e7dc6987c54206272ffb182aVictor Stinner    /* sys.stdin: enable universal newline mode, translate "\r\n" and "\r"
9817b3f0fa68e320253e7dc6987c54206272ffb182aVictor Stinner       newlines to "\n".
9827b3f0fa68e320253e7dc6987c54206272ffb182aVictor Stinner       sys.stdout and sys.stderr: translate "\n" to "\r\n". */
9837b3f0fa68e320253e7dc6987c54206272ffb182aVictor Stinner    newline = NULL;
9847b3f0fa68e320253e7dc6987c54206272ffb182aVictor Stinner#else
9857b3f0fa68e320253e7dc6987c54206272ffb182aVictor Stinner    /* sys.stdin: split lines at "\n".
9867b3f0fa68e320253e7dc6987c54206272ffb182aVictor Stinner       sys.stdout and sys.stderr: don't translate newlines (use "\n"). */
9877b3f0fa68e320253e7dc6987c54206272ffb182aVictor Stinner    newline = "\n";
988c0f1a1afae3843986eb0bef54b165424361f2510Victor Stinner#endif
989c0f1a1afae3843986eb0bef54b165424361f2510Victor Stinner
990afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    stream = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "OsssO",
991afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis                                    buf, encoding, errors,
992afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis                                    newline, line_buffering);
993f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_CLEAR(buf);
994f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (stream == NULL)
995f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
996f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
997f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (write_mode)
998f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        mode = "w";
999f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else
1000f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        mode = "r";
1001f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    text = PyUnicode_FromString(mode);
10021c67dd9b154d57baf58ed081767e199af1e84923Martin v. Löwis    if (!text || _PyObject_SetAttrId(stream, &PyId_mode, text) < 0)
1003f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
1004f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_CLEAR(text);
1005f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return stream;
10060560843b8fe8d4dd9e830f7b3ae7984154914516Antoine Pitrou
10070560843b8fe8d4dd9e830f7b3ae7984154914516Antoine Pitrouerror:
1008f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(buf);
1009f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(stream);
1010f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(text);
1011f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(raw);
1012f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return NULL;
10130560843b8fe8d4dd9e830f7b3ae7984154914516Antoine Pitrou}
10140560843b8fe8d4dd9e830f7b3ae7984154914516Antoine Pitrou
101511942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitroustatic int
101611942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrouis_valid_fd(int fd)
101711942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou{
101811942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou    int dummy_fd;
101911942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou    if (fd < 0 || !_PyVerify_fd(fd))
102011942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou        return 0;
102111942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou    dummy_fd = dup(fd);
102211942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou    if (dummy_fd < 0)
102311942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou        return 0;
102411942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou    close(dummy_fd);
102511942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou    return 1;
102611942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou}
102711942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou
10281a3284ed69d545e4ef59869998cb8c29233a45faGeorg Brandl/* Initialize sys.stdin, stdout, stderr and builtins.open */
1029ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossumstatic int
1030ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossuminitstdio(void)
1031ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum{
1032f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *iomod = NULL, *wrapper;
1033f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *bimod = NULL;
1034f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *m;
1035f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *std = NULL;
1036f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int status = 0, fd;
1037f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject * encoding_attr;
1038f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *encoding = NULL, *errors;
1039f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1040f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Hack to avoid a nasty recursion issue when Python is invoked
1041f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       in verbose mode: pre-import the Latin-1 and UTF-8 codecs */
1042f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((m = PyImport_ImportModule("encodings.utf_8")) == NULL) {
1043f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
1044f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1045f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(m);
1046f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1047f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!(m = PyImport_ImportModule("encodings.latin_1"))) {
1048f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
1049f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1050f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(m);
1051f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1052f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!(bimod = PyImport_ImportModule("builtins"))) {
1053f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
1054f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1055f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1056f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!(iomod = PyImport_ImportModule("io"))) {
1057f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
1058f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1059f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) {
1060f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
1061f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1062f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1063f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Set builtins.open */
1064f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) {
10655a96b5241f8ff0badd0f2a95305d551e80847f1cAntoine Pitrou        Py_DECREF(wrapper);
1066f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto error;
1067f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
10685a96b5241f8ff0badd0f2a95305d551e80847f1cAntoine Pitrou    Py_DECREF(wrapper);
1069f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1070f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    encoding = Py_GETENV("PYTHONIOENCODING");
1071f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    errors = NULL;
1072f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (encoding) {
1073f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        encoding = strdup(encoding);
1074f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        errors = strchr(encoding, ':');
1075f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (errors) {
1076f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            *errors = '\0';
1077f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            errors++;
1078f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1079f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1080f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1081f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Set sys.stdin */
1082f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fd = fileno(stdin);
1083f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Under some conditions stdin, stdout and stderr may not be connected
1084f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * and fileno() may point to an invalid file descriptor. For example
1085f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * GUI apps don't have valid standard streams by default.
1086f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
108711942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou    if (!is_valid_fd(fd)) {
1088f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        std = Py_None;
1089f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(std);
1090f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1091f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
1092f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        std = create_stdio(iomod, fd, 0, "<stdin>", encoding, errors);
1093f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (std == NULL)
1094f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto error;
1095f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } /* if (fd < 0) */
1096f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetObject("__stdin__", std);
1097f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetObject("stdin", std);
1098f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(std);
1099f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1100f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Set sys.stdout */
1101f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fd = fileno(stdout);
110211942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou    if (!is_valid_fd(fd)) {
1103f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        std = Py_None;
1104f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(std);
1105f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1106f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
1107f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        std = create_stdio(iomod, fd, 1, "<stdout>", encoding, errors);
1108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (std == NULL)
1109f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto error;
1110f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } /* if (fd < 0) */
1111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetObject("__stdout__", std);
1112f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetObject("stdout", std);
1113f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(std);
1114ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum
111598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum#if 1 /* Disable this if you have trouble debugging bootstrap stuff */
1116f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Set sys.stderr, replaces the preliminary stderr */
1117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fd = fileno(stderr);
111811942a58a190a235f69e8fb193d08a4fca2bcf3cAntoine Pitrou    if (!is_valid_fd(fd)) {
1119f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        std = Py_None;
1120f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(std);
1121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
1123f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        std = create_stdio(iomod, fd, 1, "<stderr>", encoding, "backslashreplace");
1124f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (std == NULL)
1125f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto error;
1126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } /* if (fd < 0) */
1127f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1128f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Same as hack above, pre-import stderr's codec to avoid recursion
1129f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       when import.c tries to write to stderr in verbose mode. */
1130f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    encoding_attr = PyObject_GetAttrString(std, "encoding");
1131f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (encoding_attr != NULL) {
1132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        const char * encoding;
1133f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        encoding = _PyUnicode_AsString(encoding_attr);
1134f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (encoding != NULL) {
11352fabface500d74457593b55ed06bc41ead88163eAntoine Pitrou            PyObject *codec_info = _PyCodec_Lookup(encoding);
11362fabface500d74457593b55ed06bc41ead88163eAntoine Pitrou            Py_XDECREF(codec_info);
1137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1138daf83acf003466777db394cb5e41d72ee6aea035Hirokazu Yamamoto        Py_DECREF(encoding_attr);
1139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Clear();  /* Not a fatal error if codec isn't available */
1141f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1142f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetObject("__stderr__", std);
1143f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetObject("stderr", std);
1144f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(std);
114598297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum#endif
1146ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum
1147f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (0) {
1148ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum  error:
1149f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        status = -1;
1150f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1151ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum
1152f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (encoding)
1153f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(encoding);
1154f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(bimod);
1155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(iomod);
1156f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return status;
1157ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum}
1158ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum
11591984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Parse input from a file and execute it */
11601984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
11611984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint
11624d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas WoutersPyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
1163f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     PyCompilerFlags *flags)
1164bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{
1165f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (filename == NULL)
1166f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        filename = "???";
1167f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_FdIsInteractive(fp, filename)) {
1168f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
1169f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (closeit)
1170f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fclose(fp);
1171f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return err;
1172f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1173f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else
1174f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
11751984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
11761984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
11771984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint
117895292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
1179bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{
1180f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *v;
1181f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int ret;
1182f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags local_flags;
1183f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1184f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags == NULL) {
1185f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flags = &local_flags;
1186f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        local_flags.cf_flags = 0;
1187f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1188f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = PySys_GetObject("ps1");
1189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == NULL) {
1190f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySys_SetObject("ps1", v = PyUnicode_FromString(">>> "));
1191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(v);
1192f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1193f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = PySys_GetObject("ps2");
1194f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == NULL) {
1195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySys_SetObject("ps2", v = PyUnicode_FromString("... "));
1196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(v);
1197f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    for (;;) {
1199f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        ret = PyRun_InteractiveOneFlags(fp, filename, flags);
1200f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PRINT_TOTAL_REFS();
1201f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (ret == E_EOF)
1202f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return 0;
1203f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /*
1204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (ret == E_NOMEM)
1205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return -1;
1206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        */
1207f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
12081984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
12091984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1210c24ea08644279224a7a8be419648261f9566c9b3Neil Schemenauer/* compute parser flags based on compiler flags */
1211f5b52246ed8a1191c3aa1da7d3c63bbe11aee020Benjamin Petersonstatic int PARSER_FLAGS(PyCompilerFlags *flags)
1212f5b52246ed8a1191c3aa1da7d3c63bbe11aee020Benjamin Peterson{
1213f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int parser_flags = 0;
1214f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!flags)
1215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
1216f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags->cf_flags & PyCF_DONT_IMPLY_DEDENT)
1217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        parser_flags |= PyPARSE_DONT_IMPLY_DEDENT;
1218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags->cf_flags & PyCF_IGNORE_COOKIE)
1219f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        parser_flags |= PyPARSE_IGNORE_COOKIE;
1220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags->cf_flags & CO_FUTURE_BARRY_AS_BDFL)
1221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        parser_flags |= PyPARSE_BARRY_AS_BDFL;
1222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return parser_flags;
1223f5b52246ed8a1191c3aa1da7d3c63bbe11aee020Benjamin Peterson}
1224c24ea08644279224a7a8be419648261f9566c9b3Neil Schemenauer
122589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters#if 0
122689f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters/* Keep an example of flags with future keyword support. */
122789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters#define PARSER_FLAGS(flags) \
1228f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
1229f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                  PyPARSE_DONT_IMPLY_DEDENT : 0) \
1230f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \
1231f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   PyPARSE_WITH_IS_KEYWORD : 0)) : 0)
123289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters#endif
123389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters
12349f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hyltonint
123595292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
12369f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton{
1237f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *m, *d, *v, *w, *oenc = NULL;
1238f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
1239f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena *arena;
1240f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *ps1 = "", *ps2 = "", *enc = NULL;
1241f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int errcode = 0;
1242bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(encoding);
1243f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1244f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (fp == stdin) {
1245fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson        /* Fetch encoding from sys.stdin if possible. */
1246f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        v = PySys_GetObject("stdin");
1247fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson        if (v && v != Py_None) {
1248fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson            oenc = _PyObject_GetAttrId(v, &PyId_encoding);
1249fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson            if (oenc)
1250fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson                enc = _PyUnicode_AsString(oenc);
1251fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson            if (!enc)
1252fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson                PyErr_Clear();
1253fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson        }
1254f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1255f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = PySys_GetObject("ps1");
1256f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v != NULL) {
1257f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        v = PyObject_Str(v);
1258f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (v == NULL)
1259f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
1260386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner        else if (PyUnicode_Check(v)) {
1261f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            ps1 = _PyUnicode_AsString(v);
1262386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner            if (ps1 == NULL) {
1263386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner                PyErr_Clear();
1264386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner                ps1 = "";
1265386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner            }
1266386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner        }
1267f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1268f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    w = PySys_GetObject("ps2");
1269f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (w != NULL) {
1270f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        w = PyObject_Str(w);
1271f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (w == NULL)
1272f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
1273386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner        else if (PyUnicode_Check(w)) {
1274f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            ps2 = _PyUnicode_AsString(w);
1275386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner            if (ps2 == NULL) {
1276386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner                PyErr_Clear();
1277386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner                ps2 = "";
1278386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner            }
1279386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner        }
1280f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1281f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    arena = PyArena_New();
1282f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (arena == NULL) {
1283f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(v);
1284f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(w);
1285f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(oenc);
1286f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1287f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1288f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod = PyParser_ASTFromFile(fp, filename, enc,
1289f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                               Py_single_input, ps1, ps2,
1290f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                               flags, &errcode, arena);
1291f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(v);
1292f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(w);
1293f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(oenc);
1294f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mod == NULL) {
1295f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyArena_Free(arena);
1296f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (errcode == E_EOF) {
1297f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
1298f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return E_EOF;
1299f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1300f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
1301f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1302f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1303f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = PyImport_AddModule("__main__");
1304f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m == NULL) {
1305f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyArena_Free(arena);
1306f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1307f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1308f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    d = PyModule_GetDict(m);
1309f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = run_mod(mod, filename, d, d, flags, arena);
1310f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena_Free(arena);
1311f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    flush_io();
1312f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == NULL) {
1313f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
1314f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1315f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1316f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(v);
1317f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
13181984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
13191984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1320be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis/* Check whether a file maybe a pyc file: Look at the extension,
1321be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis   the file type, and, if we may close it, at the first few bytes. */
1322be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis
1323be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwisstatic int
132495292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwismaybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
1325be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis{
1326f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
1327f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 1;
1328f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1329f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Only look into the file if we are allowed to close it, since
1330f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       it then should also be seekable. */
1331f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (closeit) {
1332f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Read only two bytes of the magic. If the file was opened in
1333f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           text mode, the bytes 3 and 4 of the magic (\r\n) might not
1334f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           be read as they are on disk. */
1335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
1336f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        unsigned char buf[2];
1337f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Mess:  In case of -x, the stream is NOT at its start now,
1338f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           and ungetc() was used to push back the first newline,
1339f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           which makes the current stream position formally undefined,
1340f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           and a x-platform nightmare.
1341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           Unfortunately, we have no direct way to know whether -x
1342f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           was specified.  So we use a terrible hack:  if the current
1343f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           stream position is not 0, we assume -x was specified, and
1344f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           give up.  Bug 132850 on SourceForge spells out the
1345f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           hopelessness of trying anything else (fseek and ftell
1346f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           don't work predictably x-platform for text-mode files).
1347f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        */
1348f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int ispyc = 0;
1349f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (ftell(fp) == 0) {
1350f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (fread(buf, 1, 2, fp) == 2 &&
1351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
1352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                ispyc = 1;
1353f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            rewind(fp);
1354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return ispyc;
1356f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1357f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
1358d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters}
1359be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis
13600df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossumint
1361ceda83c6a962bb34bc51cf3fc63e3ff5ff5d9f95Nick Coghlanstatic set_main_loader(PyObject *d, const char *filename, const char *loader_name)
136285e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan{
136385e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    PyInterpreterState *interp;
136485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    PyThreadState *tstate;
136590c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov    PyObject *filename_obj, *loader_type, *loader;
1366b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan    int result = 0;
136790c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov
136890c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov    filename_obj = PyUnicode_DecodeFSDefault(filename);
136990c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov    if (filename_obj == NULL)
137090c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov        return -1;
137185e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    /* Get current thread state and interpreter pointer */
137285e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    tstate = PyThreadState_GET();
137385e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    interp = tstate->interp;
13743f94cbf9eba7adef027cfc5d087b3660800df9d7Nick Coghlan    loader_type = PyObject_GetAttrString(interp->importlib, loader_name);
13753f94cbf9eba7adef027cfc5d087b3660800df9d7Nick Coghlan    if (loader_type == NULL) {
137690c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov        Py_DECREF(filename_obj);
13773f94cbf9eba7adef027cfc5d087b3660800df9d7Nick Coghlan        return -1;
13783f94cbf9eba7adef027cfc5d087b3660800df9d7Nick Coghlan    }
137990c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov    loader = PyObject_CallFunction(loader_type, "sN", "__main__", filename_obj);
1380b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan    Py_DECREF(loader_type);
1381b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan    if (loader == NULL) {
138285e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        return -1;
138385e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    }
1384b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan    if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
1385b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan        result = -1;
1386b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan    }
138785e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan    Py_DECREF(loader);
1388b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan    return result;
138985e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan}
139085e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan
139185e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlanint
139295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
1393f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        PyCompilerFlags *flags)
1394f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
1395f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *m, *d, *v;
1396f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    const char *ext;
13975c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack    int set_file_name = 0, ret = -1;
13980fcab4a3ed5e39769609b60d6179c4c801e45985Victor Stinner    size_t len;
1399f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1400f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = PyImport_AddModule("__main__");
1401f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m == NULL)
1402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
14035c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack    Py_INCREF(m);
1404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    d = PyModule_GetDict(m);
1405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyDict_GetItemString(d, "__file__") == NULL) {
1406f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *f;
14074c7c8c30235e42c47500b91549c2b6154b61f883Victor Stinner        f = PyUnicode_DecodeFSDefault(filename);
1408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (f == NULL)
14095c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack            goto done;
1410f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (PyDict_SetItemString(d, "__file__", f) < 0) {
1411f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(f);
14125c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack            goto done;
1413f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1414916048d7807b179cbf839346768516bfdaeadecfBarry Warsaw        if (PyDict_SetItemString(d, "__cached__", Py_None) < 0) {
1415916048d7807b179cbf839346768516bfdaeadecfBarry Warsaw            Py_DECREF(f);
14165c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack            goto done;
1417916048d7807b179cbf839346768516bfdaeadecfBarry Warsaw        }
1418f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        set_file_name = 1;
1419f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(f);
1420f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1421f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    len = strlen(filename);
1422f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ext = filename + len - (len > 4 ? 4 : 0);
1423f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (maybe_pyc_file(fp, filename, ext, closeit)) {
142404ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes        FILE *pyc_fp;
1425f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Try to run a pyc file. First, re-open in binary */
1426f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (closeit)
1427f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fclose(fp);
142804ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes        if ((pyc_fp = fopen(filename, "rb")) == NULL) {
1429f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fprintf(stderr, "python: Can't reopen .pyc file\n");
1430f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto done;
1431f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1432f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Turn on optimization if a .pyo file is given */
1433f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (strcmp(ext, ".pyo") == 0)
1434f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_OptimizeFlag = 1;
143585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan
143685e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        if (set_main_loader(d, filename, "SourcelessFileLoader") < 0) {
143785e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            fprintf(stderr, "python: failed to set __main__.__loader__\n");
143885e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            ret = -1;
143904ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes            fclose(pyc_fp);
144085e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            goto done;
144185e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        }
144204ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes        v = run_pyc_file(pyc_fp, filename, d, d, flags);
144304ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes        fclose(pyc_fp);
1444f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
144585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        /* When running from stdin, leave __main__.__loader__ alone */
144685e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        if (strcmp(filename, "<stdin>") != 0 &&
144785e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            set_main_loader(d, filename, "SourceFileLoader") < 0) {
144885e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            fprintf(stderr, "python: failed to set __main__.__loader__\n");
144985e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            ret = -1;
145085e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan            goto done;
145185e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan        }
1452f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
1453f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                              closeit, flags);
1454f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1455f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    flush_io();
1456f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == NULL) {
1457f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
1458f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto done;
1459f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1460f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(v);
1461f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ret = 0;
1462d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum  done:
1463f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (set_file_name && PyDict_DelItemString(d, "__file__"))
1464f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Clear();
14655c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack    Py_DECREF(m);
1466f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return ret;
14671984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
14681984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
14691984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint
147095292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
1471393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum{
1472f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *m, *d, *v;
1473f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = PyImport_AddModule("__main__");
1474f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m == NULL)
1475f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1476f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    d = PyModule_GetDict(m);
1477f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
1478f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == NULL) {
1479f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
1480f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
1481f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1482f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(v);
1483f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
14841984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
14851984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1486035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsawstatic int
148795292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwisparse_syntax_error(PyObject *err, PyObject **message, const char **filename,
1488f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   int *lineno, int *offset, const char **text)
1489f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
1490f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    long hold;
1491f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *v;
1492bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(msg);
1493bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(filename);
1494bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(lineno);
1495bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(offset);
1496bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(text);
1497f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
149880d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    *message = NULL;
1499f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
150080d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    /* new style errors.  `err' is an instance */
15010a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson    *message = _PyObject_GetAttrId(err, &PyId_msg);
150280d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (!*message)
1503f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finally;
1504f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
15050a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson    v = _PyObject_GetAttrId(err, &PyId_filename);
150680d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (!v)
1507f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finally;
150880d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (v == Py_None) {
150980d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson        Py_DECREF(v);
1510f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        *filename = NULL;
151180d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    }
151280d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    else {
151380d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson        *filename = _PyUnicode_AsString(v);
151480d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson        Py_DECREF(v);
151580d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson        if (!*filename)
151680d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson            goto finally;
151780d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    }
1518f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
15190a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson    v = _PyObject_GetAttrId(err, &PyId_lineno);
152080d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (!v)
1521f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finally;
1522f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    hold = PyLong_AsLong(v);
1523f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(v);
1524f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (hold < 0 && PyErr_Occurred())
1525f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finally;
1526f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *lineno = (int)hold;
1527f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
15280a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson    v = _PyObject_GetAttrId(err, &PyId_offset);
152980d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (!v)
1530f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finally;
1531f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == Py_None) {
1532f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        *offset = -1;
1533f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(v);
1534f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
1535f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        hold = PyLong_AsLong(v);
1536f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(v);
1537f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (hold < 0 && PyErr_Occurred())
1538f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto finally;
1539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        *offset = (int)hold;
1540f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1541f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
15420a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson    v = _PyObject_GetAttrId(err, &PyId_text);
154380d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (!v)
1544f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto finally;
154580d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    if (v == Py_None) {
154680d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson        Py_DECREF(v);
1547f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        *text = NULL;
154880d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    }
154980d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    else {
155080d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson        *text = _PyUnicode_AsString(v);
155180d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson        Py_DECREF(v);
155280d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson        if (!*text)
155380d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson            goto finally;
155480d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    }
1555f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 1;
1556035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
1557035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsawfinally:
155880d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson    Py_XDECREF(*message);
1559f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
1560035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw}
1561035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw
15621984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumvoid
1563f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyErr_Print(void)
15641984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
1565f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_PrintEx(1);
1566a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum}
1567a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum
15689f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hyltonstatic void
156995292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwisprint_error_text(PyObject *f, int offset, const char *text)
15709f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton{
1571f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *nl;
1572f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (offset >= 0) {
1573a95e977e41ca13ac2677c455e5270cf4018f5838Benjamin Peterson        if (offset > 0 && offset == strlen(text) && text[offset - 1] == '\n')
1574a95e977e41ca13ac2677c455e5270cf4018f5838Benjamin Peterson            offset--;
1575f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (;;) {
1576f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            nl = strchr(text, '\n');
1577f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (nl == NULL || nl-text >= offset)
1578f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                break;
1579f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            offset -= (int)(nl+1-text);
1580f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            text = nl+1;
1581f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1582f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        while (*text == ' ' || *text == '\t') {
1583f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            text++;
1584f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            offset--;
1585f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1586f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1587f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyFile_WriteString("    ", f);
1588f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyFile_WriteString(text, f);
1589f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (*text == '\0' || text[strlen(text)-1] != '\n')
1590f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyFile_WriteString("\n", f);
1591f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (offset == -1)
1592f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
1593f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyFile_WriteString("    ", f);
1594a95e977e41ca13ac2677c455e5270cf4018f5838Benjamin Peterson    while (--offset > 0)
1595f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyFile_WriteString(" ", f);
1596f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyFile_WriteString("^\n", f);
15979f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton}
15989f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton
159966e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossumstatic void
160066e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossumhandle_system_exit(void)
160126fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee{
1602f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *exception, *value, *tb;
1603f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int exitcode = 0;
1604f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1605f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_InspectFlag)
1606f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Don't exit if -i flag was given. This flag is set to 0
1607f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou         * when entering interactive mode for inspecting. */
1608f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
1609f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1610f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Fetch(&exception, &value, &tb);
1611f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fflush(stdout);
1612f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (value == NULL || value == Py_None)
1613f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto done;
1614f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyExceptionInstance_Check(value)) {
1615f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* The error code should be in the `code' attribute. */
1616bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis        _Py_IDENTIFIER(code);
16171ee1b6fe0dd7baca0da50e365929d03d42128705Martin v. Löwis        PyObject *code = _PyObject_GetAttrId(value, &PyId_code);
1618f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (code) {
1619f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(value);
1620f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            value = code;
1621f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (value == Py_None)
1622f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                goto done;
1623f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1624f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* If we failed to dig out the 'code' attribute,
1625f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           just let the else clause below print the error. */
1626f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1627f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyLong_Check(value))
1628f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        exitcode = (int)PyLong_AsLong(value);
1629f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
1630e9fb319e688d2d76ab4dbf8b3165ce9d1e24e8fcVictor Stinner        PyObject *sys_stderr = PySys_GetObject("stderr");
16317126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner        if (sys_stderr != NULL && sys_stderr != Py_None) {
16327126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner            PyFile_WriteObject(value, sys_stderr, Py_PRINT_RAW);
16337126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner        } else {
16347126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner            PyObject_Print(value, stderr, Py_PRINT_RAW);
16357126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner            fflush(stderr);
16367126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner        }
1637f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySys_WriteStderr("\n");
1638f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        exitcode = 1;
1639f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1640cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters done:
1641f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Restore and clear the exception info, in order to properly decref
1642f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * the exception, value, and traceback.      If we just exit instead,
1643f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * these leak, which confuses PYTHONDUMPREFS output, and may prevent
1644f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * some finalizers from running.
1645f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
1646f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Restore(exception, value, tb);
1647f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Clear();
1648f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_Exit(exitcode);
1649f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* NOTREACHED */
165026fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee}
165126fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee
165226fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yeevoid
1653f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyErr_PrintEx(int set_sys_last_vars)
1654a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum{
1655f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *exception, *v, *tb, *hook;
1656f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1657f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1658f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        handle_system_exit();
1659f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1660f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Fetch(&exception, &v, &tb);
1661f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (exception == NULL)
1662f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
1663f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_NormalizeException(&exception, &v, &tb);
1664f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (tb == NULL) {
1665f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        tb = Py_None;
1666f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(tb);
1667f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1668f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyException_SetTraceback(v, tb);
1669f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (exception == NULL)
1670f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
1671f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Now we know v != NULL too */
1672f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (set_sys_last_vars) {
1673f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySys_SetObject("last_type", exception);
1674f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySys_SetObject("last_value", v);
1675f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySys_SetObject("last_traceback", tb);
1676f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1677f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    hook = PySys_GetObject("excepthook");
1678f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (hook) {
1679f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *args = PyTuple_Pack(3, exception, v, tb);
1680f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *result = PyEval_CallObject(hook, args);
1681f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (result == NULL) {
1682f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyObject *exception2, *v2, *tb2;
1683f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1684f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                handle_system_exit();
1685f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1686f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Fetch(&exception2, &v2, &tb2);
1687f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_NormalizeException(&exception2, &v2, &tb2);
1688f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* It should not be possible for exception2 or v2
1689f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               to be NULL. However PyErr_Display() can't
1690f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               tolerate NULLs, so just be safe. */
1691f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (exception2 == NULL) {
1692f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                exception2 = Py_None;
1693f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_INCREF(exception2);
1694f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1695f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (v2 == NULL) {
1696f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                v2 = Py_None;
1697f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_INCREF(v2);
1698f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1699f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fflush(stdout);
1700f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_WriteStderr("Error in sys.excepthook:\n");
1701f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Display(exception2, v2, tb2);
1702f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_WriteStderr("\nOriginal exception was:\n");
1703f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Display(exception, v, tb);
1704f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(exception2);
1705f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(v2);
1706f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_XDECREF(tb2);
1707f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1708f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(result);
1709f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(args);
1710f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
1711f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PySys_WriteStderr("sys.excepthook is missing\n");
1712f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Display(exception, v, tb);
1713f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1714f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(exception);
1715f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(v);
1716f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(tb);
1717b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee}
1718b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee
1719e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonstatic void
1720e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonprint_exception(PyObject *f, PyObject *value)
1721b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee{
1722f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int err = 0;
1723f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *type, *tb;
17241c67dd9b154d57baf58ed081767e199af1e84923Martin v. Löwis    _Py_IDENTIFIER(print_file_and_line);
1725f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1726f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyExceptionInstance_Check(value)) {
1727f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyFile_WriteString("TypeError: print_exception(): Exception expected for value, ", f);
1728f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyFile_WriteString(Py_TYPE(value)->tp_name, f);
1729f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyFile_WriteString(" found\n", f);
1730f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
1731f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1732f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1733f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_INCREF(value);
1734f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fflush(stdout);
1735f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    type = (PyObject *) Py_TYPE(value);
1736f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    tb = PyException_GetTraceback(value);
1737f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (tb && tb != Py_None)
1738f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err = PyTraceBack_Print(tb, f);
1739f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (err == 0 &&
17401c67dd9b154d57baf58ed081767e199af1e84923Martin v. Löwis        _PyObject_HasAttrId(value, &PyId_print_file_and_line))
1741f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
1742f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *message;
1743f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        const char *filename, *text;
1744f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int lineno, offset;
1745f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!parse_syntax_error(value, &message, &filename,
1746f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                &lineno, &offset, &text))
1747f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
1748f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else {
1749f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            char buf[10];
1750f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyFile_WriteString("  File \"", f);
1751f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (filename == NULL)
1752f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                PyFile_WriteString("<string>", f);
1753f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            else
1754f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                PyFile_WriteString(filename, f);
1755f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyFile_WriteString("\", line ", f);
1756f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyOS_snprintf(buf, sizeof(buf), "%d", lineno);
1757f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyFile_WriteString(buf, f);
1758f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyFile_WriteString("\n", f);
1759f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (text != NULL)
1760f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                print_error_text(f, offset, text);
1761f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(value);
1762f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            value = message;
1763f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* Can't be bothered to check all those
1764f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               PyFile_WriteString() calls */
1765f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (PyErr_Occurred())
1766f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                err = -1;
1767f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1768f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1769f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (err) {
1770f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Don't do anything else */
1771f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1772f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
1773f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject* moduleName;
1774f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        char* className;
1775bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis        _Py_IDENTIFIER(__module__);
1776f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        assert(PyExceptionClass_Check(type));
1777f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        className = PyExceptionClass_Name(type);
1778f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (className != NULL) {
1779f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            char *dot = strrchr(className, '.');
1780f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (dot != NULL)
1781f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                className = dot+1;
1782f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1783f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
17841ee1b6fe0dd7baca0da50e365929d03d42128705Martin v. Löwis        moduleName = _PyObject_GetAttrId(type, &PyId___module__);
1785f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (moduleName == NULL || !PyUnicode_Check(moduleName))
1786f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        {
178713b21bd749aef0f6b18cec0e7e5d1d3e643f106aVictor Stinner            Py_XDECREF(moduleName);
1788f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            err = PyFile_WriteString("<unknown>", f);
1789f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1790f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else {
1791f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            char* modstr = _PyUnicode_AsString(moduleName);
1792f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (modstr && strcmp(modstr, "builtins"))
1793f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            {
1794f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                err = PyFile_WriteString(modstr, f);
1795f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                err += PyFile_WriteString(".", f);
1796f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1797f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(moduleName);
1798f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1799f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (err == 0) {
1800f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (className == NULL)
1801f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                      err = PyFile_WriteString("<unknown>", f);
1802f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            else
1803f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                      err = PyFile_WriteString(className, f);
1804f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1805f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1806f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (err == 0 && (value != Py_None)) {
1807f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *s = PyObject_Str(value);
1808f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* only print colon if the str() of the
1809f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           object is not the empty string
1810f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        */
1811f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (s == NULL)
1812f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            err = -1;
1813f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (!PyUnicode_Check(s) ||
1814e251d6d69d27c0a9e4621fd98711db8958920409Victor Stinner            PyUnicode_GetLength(s) != 0)
1815f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            err = PyFile_WriteString(": ", f);
1816f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (err == 0)
1817f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou          err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1818f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(s);
1819f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1820f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* try to write a newline in any case */
1821f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    err += PyFile_WriteString("\n", f);
1822f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(tb);
1823f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(value);
1824f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* If an error happened here, don't show it.
1825f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       XXX This is wrong, but too many callers rely on this behavior. */
1826f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (err != 0)
1827f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Clear();
18281984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
18291984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
1830e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonstatic const char *cause_message =
1831f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "\nThe above exception was the direct cause "
1832f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "of the following exception:\n\n";
1833e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson
1834e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonstatic const char *context_message =
1835f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "\nDuring handling of the above exception, "
1836f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "another exception occurred:\n\n";
1837e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson
1838e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonstatic void
1839e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonprint_exception_recursive(PyObject *f, PyObject *value, PyObject *seen)
1840e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson{
1841f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int err = 0, res;
1842f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *cause, *context;
1843f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1844f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (seen != NULL) {
1845f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Exception chaining */
1846f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (PySet_Add(seen, value) == -1)
1847f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
1848f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (PyExceptionInstance_Check(value)) {
1849f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            cause = PyException_GetCause(value);
1850f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            context = PyException_GetContext(value);
1851d5a1c44455d969968f453f029727bfc45e4ce0a9Benjamin Peterson            if (cause) {
1852f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                res = PySet_Contains(seen, cause);
1853f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (res == -1)
1854f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    PyErr_Clear();
1855f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (res == 0) {
1856f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    print_exception_recursive(
1857f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        f, cause, seen);
1858f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    err |= PyFile_WriteString(
1859f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        cause_message, f);
1860f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
1861f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1862d5a1c44455d969968f453f029727bfc45e4ce0a9Benjamin Peterson            else if (context &&
1863d5a1c44455d969968f453f029727bfc45e4ce0a9Benjamin Peterson                !((PyBaseExceptionObject *)value)->suppress_context) {
1864f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                res = PySet_Contains(seen, context);
1865f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (res == -1)
1866f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    PyErr_Clear();
1867f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (res == 0) {
1868f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    print_exception_recursive(
1869f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        f, context, seen);
1870f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    err |= PyFile_WriteString(
1871f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        context_message, f);
1872f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
1873f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
1874f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_XDECREF(context);
1875f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_XDECREF(cause);
1876f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
1877f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1878f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    print_exception(f, value);
1879f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (err != 0)
1880f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Clear();
1881e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson}
1882e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson
1883e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonvoid
1884e65282114e96efb9e7eee77c57244943b746f6feBenjamin PetersonPyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
1885e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson{
1886f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *seen;
1887f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *f = PySys_GetObject("stderr");
188824201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou    if (PyExceptionInstance_Check(value)
188924201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou        && tb != NULL && PyTraceBack_Check(tb)) {
189024201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou        /* Put the traceback on the exception, otherwise it won't get
189124201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou           displayed.  See issue #18776. */
189224201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou        PyObject *cur_tb = PyException_GetTraceback(value);
189324201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou        if (cur_tb == NULL)
189424201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou            PyException_SetTraceback(value, tb);
189524201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou        else
189624201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou            Py_DECREF(cur_tb);
189724201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou    }
1898f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (f == Py_None) {
1899f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* pass */
1900f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1901f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else if (f == NULL) {
1902f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyObject_Dump(value);
1903f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "lost sys.stderr\n");
1904f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1905f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
1906f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* We choose to ignore seen being possibly NULL, and report
1907f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           at least the main exception (it could be a MemoryError).
1908f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        */
1909f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        seen = PySet_New(NULL);
1910f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (seen == NULL)
1911f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
1912f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        print_exception_recursive(f, value, seen);
1913f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(seen);
1914f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1915e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson}
1916e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson
191782598051e6831fadad5f27a20f24f484a54691f3Guido van RossumPyObject *
19184d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas WoutersPyRun_StringFlags(const char *str, int start, PyObject *globals,
1919f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                  PyObject *locals, PyCompilerFlags *flags)
19201984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
1921f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *ret = NULL;
1922f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
1923f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena *arena = PyArena_New();
1924f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (arena == NULL)
1925f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
192698297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum
1927f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod = PyParser_ASTFromString(str, "<string>", start, flags, arena);
1928f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mod != NULL)
1929f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        ret = run_mod(mod, "<string>", globals, locals, flags, arena);
1930f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena_Free(arena);
1931f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return ret;
1932bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton}
1933bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton
1934bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy HyltonPyObject *
193595292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
1936f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                  PyObject *locals, int closeit, PyCompilerFlags *flags)
1937f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
1938f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *ret;
1939f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
1940f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena *arena = PyArena_New();
1941f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (arena == NULL)
1942f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
1943f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
1944f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod = PyParser_ASTFromFile(fp, filename, NULL, start, 0, 0,
1945f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                               flags, NULL, arena);
1946f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (closeit)
1947f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fclose(fp);
1948f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mod == NULL) {
1949f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyArena_Free(arena);
1950f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
1951f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1952f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ret = run_mod(mod, filename, globals, locals, flags, arena);
1953f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena_Free(arena);
1954f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return ret;
1955bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton}
1956bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton
19576c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossumstatic void
19586c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossumflush_io(void)
19596c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossum{
1960f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *f, *r;
1961f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *type, *value, *traceback;
1962bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(flush);
19639ed77358d618e4c65fbe5df67a87618be29fc391Amaury Forgeot d'Arc
1964f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Save the current exception */
1965f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Fetch(&type, &value, &traceback);
19669ed77358d618e4c65fbe5df67a87618be29fc391Amaury Forgeot d'Arc
1967f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    f = PySys_GetObject("stderr");
1968f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (f != NULL) {
1969afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis        r = _PyObject_CallMethodId(f, &PyId_flush, "");
1970f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (r)
1971f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(r);
1972f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
1973f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
1974f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1975f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    f = PySys_GetObject("stdout");
1976f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (f != NULL) {
1977afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis        r = _PyObject_CallMethodId(f, &PyId_flush, "");
1978f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (r)
1979f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(r);
1980f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
1981f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
1982f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
19839ed77358d618e4c65fbe5df67a87618be29fc391Amaury Forgeot d'Arc
1984f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Restore(type, value, traceback);
19856c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossum}
19866c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossum
198782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumstatic PyObject *
19883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonrun_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
1989f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou         PyCompilerFlags *flags, PyArena *arena)
19901984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
1991f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCodeObject *co;
1992f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *v;
1993f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    co = PyAST_Compile(mod, filename, flags, arena);
1994f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (co == NULL)
1995f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
19964d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis    v = PyEval_EvalCode((PyObject*)co, globals, locals);
1997f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(co);
1998f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return v;
19991984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
20001984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
200182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumstatic PyObject *
20024d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas Woutersrun_pyc_file(FILE *fp, const char *filename, PyObject *globals,
2003f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             PyObject *locals, PyCompilerFlags *flags)
2004f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
2005f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCodeObject *co;
2006f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *v;
2007f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    long magic;
2008f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    long PyImport_GetMagicNumber(void);
2009f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2010f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    magic = PyMarshal_ReadLongFromFile(fp);
2011f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (magic != PyImport_GetMagicNumber()) {
2012f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_SetString(PyExc_RuntimeError,
2013f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   "Bad magic number in .pyc file");
2014f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2015f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
20165136ac0ca21a05691978df8d0650f902c8ca3463Antoine Pitrou    /* Skip mtime and size */
20175136ac0ca21a05691978df8d0650f902c8ca3463Antoine Pitrou    (void) PyMarshal_ReadLongFromFile(fp);
2018f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    (void) PyMarshal_ReadLongFromFile(fp);
2019f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    v = PyMarshal_ReadLastObjectFromFile(fp);
2020f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v == NULL || !PyCode_Check(v)) {
2021f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(v);
2022f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_SetString(PyExc_RuntimeError,
2023f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   "Bad code object in .pyc file");
2024f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2025f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2026f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    co = (PyCodeObject *)v;
20274d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis    v = PyEval_EvalCode((PyObject*)co, globals, locals);
2028f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v && flags)
2029f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flags->cf_flags |= (co->co_flags & PyCF_MASK);
2030f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(co);
2031f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return v;
2032fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum}
2033fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum
203482598051e6831fadad5f27a20f24f484a54691f3Guido van RossumPyObject *
20358334fd9285a8e9f0864b0453ae738fe3f6893b21Georg BrandlPy_CompileStringExFlags(const char *str, const char *filename, int start,
20368334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl                        PyCompilerFlags *flags, int optimize)
2037f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
2038f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCodeObject *co;
2039f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
2040f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena *arena = PyArena_New();
2041f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (arena == NULL)
2042f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2043f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2044f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod = PyParser_ASTFromString(str, filename, start, flags, arena);
2045f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mod == NULL) {
2046f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyArena_Free(arena);
2047f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2048f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2049f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
2050f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *result = PyAST_mod2obj(mod);
2051f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyArena_Free(arena);
2052f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return result;
2053f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
20548334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl    co = PyAST_CompileEx(mod, filename, flags, optimize, arena);
2055f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena_Free(arena);
2056f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return (PyObject *)co;
20575b7221849e240c2a62ebbc48d58607417b42ef44Guido van Rossum}
20585b7221849e240c2a62ebbc48d58607417b42ef44Guido van Rossum
20594d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis/* For use in Py_LIMITED_API */
20604d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis#undef Py_CompileString
20614d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. LöwisPyObject *
20624d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. LöwisPyCompileString(const char *str, const char *filename, int start)
20634d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis{
20644d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis    return Py_CompileStringFlags(str, filename, start, NULL);
20654d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis}
20664d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis
20674b38da664c107bc08768235a66621429beef5444Jeremy Hyltonstruct symtable *
206895292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPy_SymtableString(const char *str, const char *filename, int start)
20694b38da664c107bc08768235a66621429beef5444Jeremy Hylton{
2070f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    struct symtable *st;
2071f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
2072f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags flags;
2073f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena *arena = PyArena_New();
2074f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (arena == NULL)
2075f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
20760e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters
2077f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    flags.cf_flags = 0;
2078f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod = PyParser_ASTFromString(str, filename, start, &flags, arena);
2079f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (mod == NULL) {
2080f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyArena_Free(arena);
2081f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
2082f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2083f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    st = PySymtable_Build(mod, filename, 0);
2084f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyArena_Free(arena);
2085f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return st;
20864b38da664c107bc08768235a66621429beef5444Jeremy Hylton}
20874b38da664c107bc08768235a66621429beef5444Jeremy Hylton
20883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Preferred access to parser is through AST. */
20893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonmod_ty
20904d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas WoutersPyParser_ASTFromString(const char *s, const char *filename, int start,
2091f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                       PyCompilerFlags *flags, PyArena *arena)
2092f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
2093f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
2094f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags localflags;
2095f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    perrdetail err;
2096f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int iflags = PARSER_FLAGS(flags);
2097f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2098f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    node *n = PyParser_ParseStringFlagsFilenameEx(s, filename,
2099f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                    &_PyParser_Grammar, start, &err,
2100f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                    &iflags);
2101f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags == NULL) {
2102f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        localflags.cf_flags = 0;
2103f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flags = &localflags;
2104f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2105f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (n) {
2106f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flags->cf_flags |= iflags & PyCF_MASK;
2107f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        mod = PyAST_FromNode(n, flags, filename, arena);
2108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyNode_Free(n);
2109f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2110f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
2111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err_input(&err);
21127f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner        mod = NULL;
2113f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
21147f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    err_free(&err);
21157f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    return mod;
21163e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
21173e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
21183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonmod_ty
211985bcc66bb492931b6ca3de21ca53ca53b754be33Martin v. LöwisPyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc,
2120f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     int start, char *ps1,
2121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     char *ps2, PyCompilerFlags *flags, int *errcode,
2122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     PyArena *arena)
2123f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{
2124f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mod_ty mod;
2125f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags localflags;
2126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    perrdetail err;
2127f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int iflags = PARSER_FLAGS(flags);
2128f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2129f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    node *n = PyParser_ParseFileFlagsEx(fp, filename, enc,
2130f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                      &_PyParser_Grammar,
2131f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                            start, ps1, ps2, &err, &iflags);
2132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (flags == NULL) {
2133f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        localflags.cf_flags = 0;
2134f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flags = &localflags;
2135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2136f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (n) {
2137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        flags->cf_flags |= iflags & PyCF_MASK;
2138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        mod = PyAST_FromNode(n, flags, filename, arena);
2139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyNode_Free(n);
2140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2141f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
2142f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err_input(&err);
2143f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (errcode)
2144f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            *errcode = err.error;
21457f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner        mod = NULL;
2146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
21477f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    err_free(&err);
21487f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    return mod;
21493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
21503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
2151a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Simplified interface to parsefile -- return node or set exception */
21521984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
2153a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumnode *
215495292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
21551984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
2156f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    perrdetail err;
2157f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    node *n = PyParser_ParseFileFlags(fp, filename, NULL,
2158f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                      &_PyParser_Grammar,
2159f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                      start, NULL, NULL, &err, flags);
2160f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (n == NULL)
2161f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err_input(&err);
21627f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    err_free(&err);
21634d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas Wouters
2164f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return n;
21651984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
21661984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
2167a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Simplified interface to parsestring -- return node or set exception */
21681984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
2169a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumnode *
217095292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFlags(const char *str, int start, int flags)
21711984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
2172f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    perrdetail err;
2173f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
2174f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                        start, &err, flags);
2175f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (n == NULL)
2176f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err_input(&err);
21777f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    err_free(&err);
2178f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return n;
2179a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum}
2180a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum
2181fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Petersnode *
218295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
2183f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                        int start, int flags)
21846b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller{
2185f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    perrdetail err;
2186f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    node *n = PyParser_ParseStringFlagsFilename(str, filename,
2187f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                            &_PyParser_Grammar, start, &err, flags);
2188f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (n == NULL)
2189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err_input(&err);
21907f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    err_free(&err);
2191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return n;
21926b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller}
21936b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller
21946b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Hellernode *
219595292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
21966b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller{
2197f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0);
21986b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller}
21996b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller
220066ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum/* May want to move a more generalized form of this to parsetok.c or
220166ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum   even parser modules. */
220266ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum
220366ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossumvoid
22047f2fee36401f7b987a368fe043637b3ae7116600Victor StinnerPyParser_ClearError(perrdetail *err)
22057f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner{
22067f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    err_free(err);
22077f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner}
22087f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner
22097f2fee36401f7b987a368fe043637b3ae7116600Victor Stinnervoid
221066ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van RossumPyParser_SetError(perrdetail *err)
221166ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum{
2212f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    err_input(err);
221366ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum}
221466ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum
22157f2fee36401f7b987a368fe043637b3ae7116600Victor Stinnerstatic void
22167f2fee36401f7b987a368fe043637b3ae7116600Victor Stinnererr_free(perrdetail *err)
22177f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner{
22187f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    Py_CLEAR(err->filename);
22197f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner}
22207f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner
2221a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Set the error appropriate to the given input error code (see errcode.h) */
2222a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum
2223a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumstatic void
2224f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterserr_input(perrdetail *err)
2225a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum{
2226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *v, *w, *errtype, *errtext;
2227f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *msg_obj = NULL;
2228f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *msg = NULL;
222965fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka    int offset = err->offset;
22304c7c8c30235e42c47500b91549c2b6154b61f883Victor Stinner
2231f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    errtype = PyExc_SyntaxError;
2232f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    switch (err->error) {
2233f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_ERROR:
2234f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
2235f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_SYNTAX:
2236f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        errtype = PyExc_IndentationError;
2237f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (err->expected == INDENT)
2238f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            msg = "expected an indented block";
2239f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (err->token == INDENT)
2240f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            msg = "unexpected indent";
2241f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (err->token == DEDENT)
2242f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            msg = "unexpected unindent";
2243f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else {
2244f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            errtype = PyExc_SyntaxError;
2245f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            msg = "invalid syntax";
2246f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
2247f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2248f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_TOKEN:
2249f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "invalid token";
2250f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2251f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_EOFS:
2252f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "EOF while scanning triple-quoted string literal";
2253f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2254f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_EOLS:
2255f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "EOL while scanning string literal";
2256f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2257f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_INTR:
2258f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!PyErr_Occurred())
2259f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_SetNone(PyExc_KeyboardInterrupt);
2260f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto cleanup;
2261f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_NOMEM:
2262f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_NoMemory();
2263f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        goto cleanup;
2264f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_EOF:
2265f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "unexpected EOF while parsing";
2266f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2267f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_TABSPACE:
2268f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        errtype = PyExc_TabError;
2269f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "inconsistent use of tabs and spaces in indentation";
2270f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2271f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_OVERFLOW:
2272f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "expression too long";
2273f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2274f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_DEDENT:
2275f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        errtype = PyExc_IndentationError;
2276f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "unindent does not match any outer indentation level";
2277f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2278f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_TOODEEP:
2279f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        errtype = PyExc_IndentationError;
2280f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "too many levels of indentation";
2281f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2282f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_DECODE: {
2283f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *type, *value, *tb;
2284f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Fetch(&type, &value, &tb);
2285f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "unknown decode error";
2286f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (value != NULL)
2287f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            msg_obj = PyObject_Str(value);
2288f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(type);
2289f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(value);
2290f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_XDECREF(tb);
2291f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2292f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2293f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_LINECONT:
2294f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "unexpected character after line continuation character";
2295f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2296f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2297f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case E_IDENTIFIER:
2298f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "invalid character in identifier";
2299f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2300fa21bf015d4e9cb0c010fde28db0c344174634d1Meador Inge    case E_BADSINGLE:
2301fa21bf015d4e9cb0c010fde28db0c344174634d1Meador Inge        msg = "multiple statements found while compiling a single statement";
2302fa21bf015d4e9cb0c010fde28db0c344174634d1Meador Inge        break;
2303f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    default:
2304f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "error=%d\n", err->error);
2305f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        msg = "unknown parsing error";
2306f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2307f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2308f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* err->text may not be UTF-8 in case of decoding errors.
2309f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       Explicitly convert to an object. */
2310f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!err->text) {
2311f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        errtext = Py_None;
2312f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(Py_None);
2313f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
231465fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka        errtext = PyUnicode_DecodeUTF8(err->text, err->offset,
2315f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                       "replace");
231665fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka        if (errtext != NULL) {
231765fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka            Py_ssize_t len = strlen(err->text);
231865fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka            offset = (int)PyUnicode_GET_LENGTH(errtext);
231965fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka            if (len != err->offset) {
232065fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka                Py_DECREF(errtext);
232165fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka                errtext = PyUnicode_DecodeUTF8(err->text, len,
232265fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka                                               "replace");
232365fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka            }
232465fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka        }
2325f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
23267f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner    v = Py_BuildValue("(OiiN)", err->filename,
232765fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka                      err->lineno, offset, errtext);
2328f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (v != NULL) {
2329f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (msg_obj)
2330f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            w = Py_BuildValue("(OO)", msg_obj, v);
2331f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
2332f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            w = Py_BuildValue("(sO)", msg, v);
2333f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else
2334f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        w = NULL;
2335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(v);
2336f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_SetObject(errtype, w);
2337f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(w);
23383dbca81c9b7903e8d808089a6a76dc97807b3df3Georg Brandlcleanup:
2339f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(msg_obj);
2340f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (err->text != NULL) {
2341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject_FREE(err->text);
2342f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        err->text = NULL;
2343f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
23441984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
23451984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
23461984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Print fatal error message and abort */
23471984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
23481984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumvoid
23497c321a80f93a572a5f4a94d5d2897f70b8315a2cTim PetersPy_FatalError(const char *msg)
23501984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{
2351024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner    const int fd = fileno(stderr);
2352024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner    PyThreadState *tstate;
2353024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner
2354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fprintf(stderr, "Fatal Python error: %s\n", msg);
2355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fflush(stderr); /* it helps in Windows debug build */
2356f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyErr_Occurred()) {
235755a5c78e4dc4393ef0c57602775db2d3d704be36Victor Stinner        PyErr_PrintEx(0);
2358f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2359024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner    else {
2360024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner        tstate = _Py_atomic_load_relaxed(&_PyThreadState_Current);
2361024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner        if (tstate != NULL) {
2362024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner            fputc('\n', stderr);
2363024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner            fflush(stderr);
23647bba62fd68e3a2c410c37348cf679edea04c7718Victor Stinner            _Py_DumpTracebackThreads(fd, tstate->interp, tstate);
2365024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner        }
2366d727e23243ab5479b03aab1f924ca7ec0bccbcb6Victor Stinner        _PyFaulthandler_Fini();
2367024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner    }
2368024e37adccd9f0d879b014da28b02d04f0866f8cVictor Stinner
23696238d2b024f061159b2613387ff700695c10deefMartin v. Löwis#ifdef MS_WINDOWS
2370f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
2371f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        size_t len = strlen(msg);
2372f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        WCHAR* buffer;
2373f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        size_t i;
2374f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
2375f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Convert the message to wchar_t. This uses a simple one-to-one
2376f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        conversion, assuming that the this error message actually uses ASCII
2377f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        only. If this ceases to be true, we will have to convert. */
2378f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        buffer = alloca( (len+1) * (sizeof *buffer));
2379f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for( i=0; i<=len; ++i)
2380f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            buffer[i] = msg[i];
2381f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        OutputDebugStringW(L"Fatal Python error: ");
2382f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        OutputDebugStringW(buffer);
2383f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        OutputDebugStringW(L"\n");
2384f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
23850ba353608fb6315e2dfaab6d767aa92c05628b71Guido van Rossum#ifdef _DEBUG
2386f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    DebugBreak();
2387a44823b7764281d398215564f2070257d08d0855Guido van Rossum#endif
23886238d2b024f061159b2613387ff700695c10deefMartin v. Löwis#endif /* MS_WINDOWS */
2389f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    abort();
23901984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
23911984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
23921984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Clean up and exit */
23931984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
2394a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum#ifdef WITH_THREAD
239549b560698b0bba848c4f8325803a26a4477fb12dGuido van Rossum#include "pythread.h"
2396f9f2e82fcade2d44a69bbdac1ba59bdf591743f4Guido van Rossum#endif
2397f9f2e82fcade2d44a69bbdac1ba59bdf591743f4Guido van Rossum
2398670e6921349dd408b6958a0c5d3b1486725f9bebCollin Winterstatic void (*pyexitfunc)(void) = NULL;
2399670e6921349dd408b6958a0c5d3b1486725f9bebCollin Winter/* For the atexit module. */
2400670e6921349dd408b6958a0c5d3b1486725f9bebCollin Wintervoid _Py_PyAtExit(void (*func)(void))
2401670e6921349dd408b6958a0c5d3b1486725f9bebCollin Winter{
2402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    pyexitfunc = func;
2403670e6921349dd408b6958a0c5d3b1486725f9bebCollin Winter}
2404670e6921349dd408b6958a0c5d3b1486725f9bebCollin Winter
2405670e6921349dd408b6958a0c5d3b1486725f9bebCollin Winterstatic void
2406670e6921349dd408b6958a0c5d3b1486725f9bebCollin Wintercall_py_exitfuncs(void)
2407670e6921349dd408b6958a0c5d3b1486725f9bebCollin Winter{
2408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (pyexitfunc == NULL)
2409f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
2410670e6921349dd408b6958a0c5d3b1486725f9bebCollin Winter
2411f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    (*pyexitfunc)();
2412f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyErr_Clear();
2413670e6921349dd408b6958a0c5d3b1486725f9bebCollin Winter}
2414670e6921349dd408b6958a0c5d3b1486725f9bebCollin Winter
2415011bd62c8ca1888e04e579a4dac3dcc103e9a74bAntoine Pitrou/* Wait until threading._shutdown completes, provided
2416011bd62c8ca1888e04e579a4dac3dcc103e9a74bAntoine Pitrou   the threading module was imported in the first place.
2417011bd62c8ca1888e04e579a4dac3dcc103e9a74bAntoine Pitrou   The shutdown routine will wait until all non-daemon
2418011bd62c8ca1888e04e579a4dac3dcc103e9a74bAntoine Pitrou   "threading" threads have completed. */
2419011bd62c8ca1888e04e579a4dac3dcc103e9a74bAntoine Pitroustatic void
2420011bd62c8ca1888e04e579a4dac3dcc103e9a74bAntoine Pitrouwait_for_thread_shutdown(void)
2421011bd62c8ca1888e04e579a4dac3dcc103e9a74bAntoine Pitrou{
2422011bd62c8ca1888e04e579a4dac3dcc103e9a74bAntoine Pitrou#ifdef WITH_THREAD
2423bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis    _Py_IDENTIFIER(_shutdown);
2424f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *result;
2425f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyThreadState *tstate = PyThreadState_GET();
2426f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
2427f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                                  "threading");
2428f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (threading == NULL) {
2429f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* threading not imported */
2430f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Clear();
2431f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return;
2432f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2433afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis    result = _PyObject_CallMethodId(threading, &PyId__shutdown, "");
2434f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL) {
2435f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_WriteUnraisable(threading);
2436f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2437f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
2438f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(result);
2439f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2440f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(threading);
2441011bd62c8ca1888e04e579a4dac3dcc103e9a74bAntoine Pitrou#endif
2442011bd62c8ca1888e04e579a4dac3dcc103e9a74bAntoine Pitrou}
2443011bd62c8ca1888e04e579a4dac3dcc103e9a74bAntoine Pitrou
24442dcfc9618dbf1cf467436c4a0ccbb2d7df2ba25fGuido van Rossum#define NEXITFUNCS 32
2445f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersstatic void (*exitfuncs[NEXITFUNCS])(void);
24461662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossumstatic int nexitfuncs = 0;
24471662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum
2448f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersint Py_AtExit(void (*func)(void))
24491662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum{
2450f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (nexitfuncs >= NEXITFUNCS)
2451f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
2452f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    exitfuncs[nexitfuncs++] = func;
2453f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
24541662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum}
24551662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum
2456cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossumstatic void
2457f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterscall_ll_exitfuncs(void)
2458cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum{
2459f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    while (nexitfuncs > 0)
2460f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (*exitfuncs[--nexitfuncs])();
246125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum
2462f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fflush(stdout);
2463f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fflush(stderr);
2464a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum}
2465a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum
2466a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossumvoid
2467f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_Exit(int sts)
2468a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum{
2469f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_Finalize();
24701984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
2471f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    exit(sts);
24721984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum}
24731984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum
2474f1dc56632881fe4e5beed047580bf927679f3669Guido van Rossumstatic void
2475f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersinitsigs(void)
2476a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum{
2477a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum#ifdef SIGPIPE
2478f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyOS_setsig(SIGPIPE, SIG_IGN);
2479a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum#endif
248070d893a6aaf335383d2efcf7c40194e4f1a7e474Guido van Rossum#ifdef SIGXFZ
2481f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyOS_setsig(SIGXFZ, SIG_IGN);
248270d893a6aaf335383d2efcf7c40194e4f1a7e474Guido van Rossum#endif
24831b0bf9b7616a5d8b624ccb1670c7b71fa0850209Jeremy Hylton#ifdef SIGXFSZ
2484f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyOS_setsig(SIGXFSZ, SIG_IGN);
24851b0bf9b7616a5d8b624ccb1670c7b71fa0850209Jeremy Hylton#endif
2486f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyOS_InitInterrupts(); /* May imply initsignal() */
2487a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum}
2488a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum
24897433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum
2490fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
2491fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith *
2492fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * All of the code in this function must only use async-signal-safe functions,
2493fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * listed at `man 7 signal` or
2494fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
2495fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith */
2496fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smithvoid
2497fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith_Py_RestoreSignals(void)
2498fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith{
2499fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith#ifdef SIGPIPE
2500f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyOS_setsig(SIGPIPE, SIG_DFL);
2501fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith#endif
2502fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith#ifdef SIGXFZ
2503f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyOS_setsig(SIGXFZ, SIG_DFL);
2504fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith#endif
2505fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith#ifdef SIGXFSZ
2506f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyOS_setsig(SIGXFSZ, SIG_DFL);
2507fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith#endif
2508fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith}
2509fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
2510fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith
25117433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum/*
25127433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum * The file descriptor fd is considered ``interactive'' if either
25137433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum *   a) isatty(fd) is TRUE, or
25147433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum *   b) the -i flag was given, and the filename associated with
25157433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum *      the descriptor is NULL or "<stdin>" or "???".
25167433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum */
25177433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossumint
251895292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPy_FdIsInteractive(FILE *fp, const char *filename)
25197433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum{
2520f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (isatty((int)fileno(fp)))
2521f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 1;
2522f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_InteractiveFlag)
2523f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
2524f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return (filename == NULL) ||
2525f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           (strcmp(filename, "<stdin>") == 0) ||
2526f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           (strcmp(filename, "???") == 0);
25277433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum}
25282f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
25292f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
2530d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters#if defined(USE_STACKCHECK)
25312f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#if defined(WIN32) && defined(_MSC_VER)
25322f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
25332f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh/* Stack checking for Microsoft C */
25342f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
25352f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#include <malloc.h>
25362f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#include <excpt.h>
25372f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
2538e8de31cbd094bf9e909e1cb12a19c6c3ca854dd7Fred Drake/*
2539e8de31cbd094bf9e909e1cb12a19c6c3ca854dd7Fred Drake * Return non-zero when we run out of memory on the stack; zero otherwise.
2540e8de31cbd094bf9e909e1cb12a19c6c3ca854dd7Fred Drake */
25412f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundhint
2542399739f79f1d6cef6bc8a8ec63f9a81255464f15Fred DrakePyOS_CheckStack(void)
25432f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh{
2544f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    __try {
2545f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* alloca throws a stack overflow exception if there's
2546f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           not enough space left on the stack */
2547f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        alloca(PYOS_STACK_MARGIN * sizeof(void*));
2548f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
2549f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } __except (GetExceptionCode() == STATUS_STACK_OVERFLOW ?
2550f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    EXCEPTION_EXECUTE_HANDLER :
2551f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            EXCEPTION_CONTINUE_SEARCH) {
2552f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        int errcode = _resetstkoflw();
2553f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (errcode == 0)
2554f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        {
2555f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError("Could not reset the stack!");
2556f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
2557f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2558f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 1;
25592f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh}
25602f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
25612f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#endif /* WIN32 && _MSC_VER */
25622f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
25632f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh/* Alternate implementations can be added here... */
25642f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh
25652f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#endif /* USE_STACKCHECK */
25666f25618be5d8756284dc99c47953268e398175d0Guido van Rossum
25676f25618be5d8756284dc99c47953268e398175d0Guido van Rossum
25686f25618be5d8756284dc99c47953268e398175d0Guido van Rossum/* Wrappers around sigaction() or signal(). */
25696f25618be5d8756284dc99c47953268e398175d0Guido van Rossum
25706f25618be5d8756284dc99c47953268e398175d0Guido van RossumPyOS_sighandler_t
25716f25618be5d8756284dc99c47953268e398175d0Guido van RossumPyOS_getsig(int sig)
25726f25618be5d8756284dc99c47953268e398175d0Guido van Rossum{
25736f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#ifdef HAVE_SIGACTION
2574f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    struct sigaction context;
2575f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (sigaction(sig, NULL, &context) == -1)
2576f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return SIG_ERR;
2577f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return context.sa_handler;
25786f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#else
2579f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyOS_sighandler_t handler;
2580b45b315855f5523d2aa5c3ad685c2c9530d42229Martin v. Löwis/* Special signal handling for the secure CRT in Visual Studio 2005 */
2581b45b315855f5523d2aa5c3ad685c2c9530d42229Martin v. Löwis#if defined(_MSC_VER) && _MSC_VER >= 1400
2582f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    switch (sig) {
2583f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Only these signals are valid */
2584f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case SIGINT:
2585f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case SIGILL:
2586f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case SIGFPE:
2587f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case SIGSEGV:
2588f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case SIGTERM:
2589f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case SIGBREAK:
2590f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    case SIGABRT:
2591f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        break;
2592f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Don't call signal() with other values or it will assert */
2593f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    default:
2594f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return SIG_ERR;
2595f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2596b45b315855f5523d2aa5c3ad685c2c9530d42229Martin v. Löwis#endif /* _MSC_VER && _MSC_VER >= 1400 */
2597f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    handler = signal(sig, SIG_IGN);
2598f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (handler != SIG_ERR)
2599f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        signal(sig, handler);
2600f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return handler;
26016f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#endif
26026f25618be5d8756284dc99c47953268e398175d0Guido van Rossum}
26036f25618be5d8756284dc99c47953268e398175d0Guido van Rossum
2604fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith/*
2605fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * All of the code in this function must only use async-signal-safe functions,
2606fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * listed at `man 7 signal` or
2607fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
2608fb94c5f1e5bb9ccd28bcd311f388db7bea35c865Gregory P. Smith */
26096f25618be5d8756284dc99c47953268e398175d0Guido van RossumPyOS_sighandler_t
26106f25618be5d8756284dc99c47953268e398175d0Guido van RossumPyOS_setsig(int sig, PyOS_sighandler_t handler)
26116f25618be5d8756284dc99c47953268e398175d0Guido van Rossum{
26126f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#ifdef HAVE_SIGACTION
2613f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Some code in Modules/signalmodule.c depends on sigaction() being
2614f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * used here if HAVE_SIGACTION is defined.  Fix that if this code
2615f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * changes to invalidate that assumption.
2616f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
2617f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    struct sigaction context, ocontext;
2618f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    context.sa_handler = handler;
2619f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    sigemptyset(&context.sa_mask);
2620f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    context.sa_flags = 0;
2621f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (sigaction(sig, &context, &ocontext) == -1)
2622f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return SIG_ERR;
2623f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return ocontext.sa_handler;
26246f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#else
2625f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyOS_sighandler_t oldhandler;
2626f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    oldhandler = signal(sig, handler);
26279ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter#ifdef HAVE_SIGINTERRUPT
2628f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    siginterrupt(sig, 1);
26299ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter#endif
2630f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return oldhandler;
26316f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#endif
26326f25618be5d8756284dc99c47953268e398175d0Guido van Rossum}
26333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
26343e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Deprecated C API functions still provided for binary compatiblity */
26353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
26363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#undef PyParser_SimpleParseFile
263749fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(node *)
26383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
26393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2640f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
26413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
26423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton
264349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyParser_SimpleParseString
264449fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(node *)
26453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_SimpleParseString(const char *str, int start)
26463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{
2647f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyParser_SimpleParseStringFlags(str, start, 0);
26483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton}
264949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
265049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_AnyFile
265149fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
265249fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_AnyFile(FILE *fp, const char *name)
265349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2654f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_AnyFileExFlags(fp, name, 0, NULL);
265549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
265649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
265749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_AnyFileEx
265849fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
265949fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
266049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2661f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
266249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
266349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
266449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_AnyFileFlags
266549fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
266649fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
266749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2668f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_AnyFileExFlags(fp, name, 0, flags);
266949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
267049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
267149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_File
267249fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *)
267349fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
267449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2675f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
267649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
267749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
267849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_FileEx
267949fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *)
268049fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
268149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2682f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
268349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
268449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
268549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_FileFlags
268649fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *)
268749fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
2688f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                PyCompilerFlags *flags)
268949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2690f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_FileExFlags(fp, p, s, g, l, 0, flags);
269149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
269249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
269349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_SimpleFile
269449fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
269549fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_SimpleFile(FILE *f, const char *p)
269649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2697f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_SimpleFileExFlags(f, p, 0, NULL);
269849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
269949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
270049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_SimpleFileEx
270149fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
270249fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_SimpleFileEx(FILE *f, const char *p, int c)
270349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2704f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_SimpleFileExFlags(f, p, c, NULL);
270549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
270649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
270749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
270849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_String
270949fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *)
271049fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_String(const char *str, int s, PyObject *g, PyObject *l)
271149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2712f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_StringFlags(str, s, g, l, NULL);
271349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
271449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
271549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_SimpleString
271649fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
271749fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_SimpleString(const char *s)
271849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2719f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_SimpleStringFlags(s, NULL);
272049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
272149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
272249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef Py_CompileString
272349fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *)
272449fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPy_CompileString(const char *str, const char *p, int s)
272549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
27268334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl    return Py_CompileStringExFlags(str, p, s, NULL, -1);
27278334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl}
27288334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl
27298334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl#undef Py_CompileStringFlags
27308334fd9285a8e9f0864b0453ae738fe3f6893b21Georg BrandlPyAPI_FUNC(PyObject *)
27318334fd9285a8e9f0864b0453ae738fe3f6893b21Georg BrandlPy_CompileStringFlags(const char *str, const char *p, int s,
27328334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl                      PyCompilerFlags *flags)
27338334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl{
27348334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl    return Py_CompileStringExFlags(str, p, s, flags, -1);
273549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
273649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
273749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_InteractiveOne
273849fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
273949fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_InteractiveOne(FILE *f, const char *p)
274049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2741f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_InteractiveOneFlags(f, p, NULL);
274249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
274349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
274449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_InteractiveLoop
274549fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int)
274649fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_InteractiveLoop(FILE *f, const char *p)
274749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{
2748f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyRun_InteractiveLoopFlags(f, p, NULL);
274949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
275049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
275149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
275249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
275349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
2754