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