14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* System module */ 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmVarious bits of information used by the interpreter are collected in 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmodule 'sys'. 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFunction member: 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- exit(sts): raise SystemExit 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmData members: 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- stdin, stdout, stderr: standard file objects 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- modules: the table of modules (dictionary) 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- path: module search path (list of strings) 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- argv: script arguments (list of strings) 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm- ps1, ps2: optional primary and secondary prompts (strings) 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/ 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h" 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "structseq.h" 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "code.h" 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "frameobject.h" 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "eval.h" 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "osdefs.h" 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define WIN32_LEAN_AND_MEAN 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "windows.h" 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* MS_WINDOWS */ 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_COREDLL 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern void *PyWin_DLLhModule; 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* A string loaded from the DLL at startup: */ 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern const char *PyWin_DLLVersionString; 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <unixlib.h> 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <windows.h> 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LANGINFO_H 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <locale.h> 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <langinfo.h> 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_GetObject(char *name) 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate = PyThreadState_GET(); 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *sd = tstate->interp->sysdict; 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sd == NULL) 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyDict_GetItemString(sd, name); 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFILE * 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_GetFile(char *name, FILE *def) 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FILE *fp = NULL; 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v = PySys_GetObject(name); 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v != NULL && PyFile_Check(v)) 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fp = PyFile_AsFile(v); 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (fp == NULL) 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fp = def; 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return fp; 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_SetObject(char *name, PyObject *v) 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate = PyThreadState_GET(); 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *sd = tstate->interp->sysdict; 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) { 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_GetItemString(sd, name) == NULL) 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyDict_DelItemString(sd, name); 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyDict_SetItemString(sd, name, v); 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_displayhook(PyObject *self, PyObject *o) 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *outf; 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInterpreterState *interp = PyThreadState_GET()->interp; 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *modules = interp->modules; 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *builtins = PyDict_GetItemString(modules, "__builtin__"); 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (builtins == NULL) { 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_RuntimeError, "lost __builtin__"); 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Print value except if None */ 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* After printing, also assign to '_' */ 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Before, set '_' to None to avoid recursion */ 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (o == Py_None) { 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyObject_SetAttrString(builtins, "_", Py_None) != 0) 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_FlushLine() != 0) 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm outf = PySys_GetObject("stdout"); 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (outf == NULL) { 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyFile_WriteObject(o, outf, 0) != 0) 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_SoftSpace(outf, 1); 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_FlushLine() != 0) 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyObject_SetAttrString(builtins, "_", o) != 0) 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(displayhook_doc, 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"displayhook(object) -> None\n" 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n" 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Print an object to sys.stdout and also save it in __builtin__._\n" 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_excepthook(PyObject* self, PyObject* args) 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *exc, *value, *tb; 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb)) 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Display(exc, value, tb); 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(excepthook_doc, 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"excepthook(exctype, value, traceback) -> None\n" 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n" 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"Handle an exception by displaying it with a traceback on sys.stderr.\n" 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_exc_info(PyObject *self, PyObject *noargs) 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate; 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate = PyThreadState_GET(); 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_BuildValue( 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "(OOO)", 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate->exc_type != NULL ? tstate->exc_type : Py_None, 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate->exc_value != NULL ? tstate->exc_value : Py_None, 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate->exc_traceback != NULL ? 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate->exc_traceback : Py_None); 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(exc_info_doc, 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"exc_info() -> (type, value, traceback)\n\ 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn information about the most recent exception caught by an except\n\ 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclause in the current stack frame or in an older stack frame." 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_exc_clear(PyObject *self, PyObject *noargs) 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate; 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tmp_type, *tmp_value, *tmp_tb; 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_WarnPy3k("sys.exc_clear() not supported in 3.x; " 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "use except clauses", 1) < 0) 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate = PyThreadState_GET(); 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmp_type = tstate->exc_type; 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmp_value = tstate->exc_value; 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tmp_tb = tstate->exc_traceback; 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate->exc_type = NULL; 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate->exc_value = NULL; 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate->exc_traceback = NULL; 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(tmp_type); 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(tmp_value); 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(tmp_tb); 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* For b/w compatibility */ 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_SetObject("exc_type", Py_None); 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_SetObject("exc_value", Py_None); 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_SetObject("exc_traceback", Py_None); 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(exc_clear_doc, 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"exc_clear() -> None\n\ 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmClear global information on the current exception. Subsequent calls to\n\ 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexc_info() will return (None,None,None) until another exception is raised\n\ 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmin the current thread or the execution stack returns to a frame where\n\ 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmanother exception is being handled." 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_exit(PyObject *self, PyObject *args) 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *exit_code = 0; 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code)) 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Raise SystemExit so callers may catch it or clean up. */ 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetObject(PyExc_SystemExit, exit_code); 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(exit_doc, 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"exit([status])\n\ 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmExit the interpreter by raising SystemExit(status).\n\ 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf the status is omitted or None, it defaults to zero (i.e., success).\n\ 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf the status is numeric, it will be used as the system exit status.\n\ 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf it is another kind of object, it will be printed and the system\n\ 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexit status will be one (i.e., failure)." 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getdefaultencoding(PyObject *self) 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_FromString(PyUnicode_GetDefaultEncoding()); 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getdefaultencoding_doc, 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getdefaultencoding() -> string\n\ 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the current default string encoding used by the Unicode \n\ 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimplementation." 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_setdefaultencoding(PyObject *self, PyObject *args) 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *encoding; 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding)) 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyUnicode_SetDefaultEncoding(encoding)) 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setdefaultencoding_doc, 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setdefaultencoding(encoding)\n\ 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet the current default string encoding used by the Unicode implementation." 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getfilesystemencoding(PyObject *self) 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_FileSystemDefaultEncoding) 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyString_FromString(Py_FileSystemDefaultEncoding); 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getfilesystemencoding_doc, 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getfilesystemencoding() -> string\n\ 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the encoding used to convert Unicode filenames in\n\ 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmoperating system filenames." 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Cached interned string objects used for calling the profile and 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * trace functions. Initialized by trace_init(). 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtrace_init(void) 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char *whatnames[7] = {"call", "exception", "line", "return", 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "c_call", "c_exception", "c_return"}; 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *name; 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < 7; ++i) { 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (whatstrings[i] == NULL) { 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm name = PyString_InternFromString(whatnames[i]); 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (name == NULL) 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm whatstrings[i] = name; 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcall_trampoline(PyThreadState *tstate, PyObject* callback, 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFrameObject *frame, int what, PyObject *arg) 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *args = PyTuple_New(3); 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *whatstr; 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result; 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args == NULL) 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(frame); 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm whatstr = whatstrings[what]; 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(whatstr); 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (arg == NULL) 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arg = Py_None; 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(arg); 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(args, 0, (PyObject *)frame); 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(args, 1, whatstr); 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_SET_ITEM(args, 2, arg); 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* call the Python-level function */ 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFrame_FastToLocals(frame); 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyEval_CallObject(callback, args); 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFrame_LocalsToFast(frame, 1); 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == NULL) 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTraceBack_Here(frame); 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* cleanup */ 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(args); 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmprofile_trampoline(PyObject *self, PyFrameObject *frame, 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int what, PyObject *arg) 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate = frame->f_tstate; 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result; 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (arg == NULL) 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arg = Py_None; 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = call_trampoline(tstate, self, frame, what, arg); 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == NULL) { 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyEval_SetProfile(NULL, NULL); 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtrace_trampoline(PyObject *self, PyFrameObject *frame, 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int what, PyObject *arg) 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate = frame->f_tstate; 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *callback; 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result; 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (what == PyTrace_CALL) 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm callback = self; 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm callback = frame->f_trace; 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (callback == NULL) 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = call_trampoline(tstate, callback, frame, what, arg); 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == NULL) { 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyEval_SetTrace(NULL, NULL); 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(frame->f_trace); 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm frame->f_trace = NULL; 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result != Py_None) { 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *temp = frame->f_trace; 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm frame->f_trace = NULL; 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(temp); 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm frame->f_trace = result; 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_settrace(PyObject *self, PyObject *args) 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (trace_init() == -1) 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args == Py_None) 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyEval_SetTrace(NULL, NULL); 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyEval_SetTrace(trace_trampoline, args); 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(settrace_doc, 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"settrace(function)\n\ 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet the global debug tracing function. It will be called on each\n\ 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfunction call. See the debugger chapter in the library manual." 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_gettrace(PyObject *self, PyObject *args) 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate = PyThreadState_GET(); 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *temp = tstate->c_traceobj; 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (temp == NULL) 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm temp = Py_None; 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(temp); 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return temp; 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(gettrace_doc, 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"gettrace()\n\ 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the global debug tracing function set with sys.settrace.\n\ 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSee the debugger chapter in the library manual." 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_setprofile(PyObject *self, PyObject *args) 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (trace_init() == -1) 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (args == Py_None) 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyEval_SetProfile(NULL, NULL); 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyEval_SetProfile(profile_trampoline, args); 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setprofile_doc, 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setprofile(function)\n\ 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet the profiling function. It will be called on each function call\n\ 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmand return. See the profiler chapter in the library manual." 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getprofile(PyObject *self, PyObject *args) 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate = PyThreadState_GET(); 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *temp = tstate->c_profileobj; 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (temp == NULL) 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm temp = Py_None; 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(temp); 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return temp; 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getprofile_doc, 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getprofile()\n\ 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the profiling function set with sys.setprofile.\n\ 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSee the profiler chapter in the library manual." 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_setcheckinterval(PyObject *self, PyObject *args) 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval)) 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setcheckinterval_doc, 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setcheckinterval(n)\n\ 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmTell the Python interpreter to check for asynchronous events every\n\ 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmn instructions. This also affects how often thread switches occur." 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getcheckinterval(PyObject *self, PyObject *args) 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromLong(_Py_CheckInterval); 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getcheckinterval_doc, 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getcheckinterval() -> current check interval; see setcheckinterval()." 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_TSC 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_settscdump(PyObject *self, PyObject *args) 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int bool; 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate = PyThreadState_Get(); 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "i:settscdump", &bool)) 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (bool) 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate->interp->tscdump = 1; 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate->interp->tscdump = 0; 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(settscdump_doc, 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"settscdump(bool)\n\ 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf true, tell the Python interpreter to dump VM measurements to\n\ 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstderr. If false, turn off dump. The measurements are based on the\n\ 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmprocessor's time-stamp counter." 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* TSC */ 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_setrecursionlimit(PyObject *self, PyObject *args) 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int new_limit; 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit)) 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (new_limit <= 0) { 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "recursion limit must be positive"); 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_SetRecursionLimit(new_limit); 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setrecursionlimit_doc, 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setrecursionlimit(n)\n\ 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet the maximum depth of the Python interpreter stack to n. This\n\ 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlimit prevents infinite recursion from causing an overflow of the C\n\ 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstack and crashing Python. The highest possible limit is platform-\n\ 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdependent." 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getrecursionlimit(PyObject *self) 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromLong(Py_GetRecursionLimit()); 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getrecursionlimit_doc, 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getrecursionlimit()\n\ 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the current value of the recursion limit, the maximum depth\n\ 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmof the Python interpreter stack. This limit prevents infinite\n\ 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrecursion from causing an overflow of the C stack and crashing Python." 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getwindowsversion_doc, 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getwindowsversion()\n\ 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn information about the running version of Windows as a named tuple.\n\ 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe members are named: major, minor, build, platform, service_pack,\n\ 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmservice_pack_major, service_pack_minor, suite_mask, and product_type. For\n\ 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbackward compatibility, only the first 5 items are available by indexing.\n\ 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmAll elements are numbers, except service_pack which is a string. Platform\n\ 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmay be 0 for win32s, 1 for Windows 9x/ME, 2 for Windows NT/2000/XP/Vista/7,\n\ 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm3 for Windows CE. Product_type may be 1 for a workstation, 2 for a domain\n\ 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcontroller, 3 for a server." 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject WindowsVersionType = {0, 0, 0, 0, 0, 0}; 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStructSequence_Field windows_version_fields[] = { 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"major", "Major version number"}, 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"minor", "Minor version number"}, 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"build", "Build number"}, 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"platform", "Operating system platform"}, 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"service_pack", "Latest Service Pack installed on the system"}, 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"service_pack_major", "Service Pack major version number"}, 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"service_pack_minor", "Service Pack minor version number"}, 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"suite_mask", "Bit mask identifying available product suites"}, 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"product_type", "System product type"}, 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {0} 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStructSequence_Desc windows_version_desc = { 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "sys.getwindowsversion", /* name */ 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm getwindowsversion_doc, /* doc */ 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm windows_version_fields, /* fields */ 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5 /* For backward compatibility, 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm only the first 5 items are accessible 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm via indexing, the rest are name only */ 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getwindowsversion(PyObject *self) 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *version; 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int pos = 0; 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm OSVERSIONINFOEX ver; 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ver.dwOSVersionInfoSize = sizeof(ver); 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!GetVersionEx((OSVERSIONINFO*) &ver)) 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyErr_SetFromWindowsErr(0); 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm version = PyStructSequence_New(&WindowsVersionType); 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (version == NULL) 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwMajorVersion)); 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwMinorVersion)); 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwBuildNumber)); 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwPlatformId)); 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_SET_ITEM(version, pos++, PyString_FromString(ver.szCSDVersion)); 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wServicePackMajor)); 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wServicePackMinor)); 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wSuiteMask)); 6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wProductType)); 6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return version; 6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* MS_WINDOWS */ 6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_DLOPEN 6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_setdlopenflags(PyObject *self, PyObject *args) 6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int new_val; 6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate = PyThreadState_GET(); 6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val)) 6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!tstate) 6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate->interp->dlopenflags = new_val; 6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(setdlopenflags_doc, 6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"setdlopenflags(n) -> None\n\ 6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSet the flags used by the interpreter for dlopen calls, such as when the\n\ 6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminterpreter loads extension modules. Among other things, this will enable\n\ 6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma lazy resolving of symbols when importing a module, if called as\n\ 6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys.setdlopenflags(0). To share symbols across extension modules, call as\n\ 6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys.setdlopenflags(ctypes.RTLD_GLOBAL). Symbolic names for the flag modules\n\ 6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcan be either found in the ctypes module, or in the DLFCN module. If DLFCN\n\ 6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmis not available, it can be generated from /usr/include/dlfcn.h using the\n\ 6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmh2py script."); 6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getdlopenflags(PyObject *self, PyObject *args) 6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate = PyThreadState_GET(); 6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!tstate) 6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromLong(tstate->interp->dlopenflags); 6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getdlopenflags_doc, 6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getdlopenflags() -> int\n\ 6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the current value of the flags that are used for dlopen calls.\n\ 6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe flag constants are defined in the ctypes and DLFCN modules."); 6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_DLOPEN */ 6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_MALLOPT 6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Link with -lmalloc (or -lmpc) on an SGI */ 6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <malloc.h> 6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_mdebug(PyObject *self, PyObject *args) 6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int flag; 6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "i:mdebug", &flag)) 6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mallopt(M_DEBUG, flag); 6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(Py_None); 6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_None; 6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* USE_MALLOPT */ 6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) 6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *res = NULL; 6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static PyObject *str__sizeof__ = NULL, *gc_head_size = NULL; 6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char *kwlist[] = {"object", "default", 0}; 6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *o, *dflt = NULL; 6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", 6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kwlist, &o, &dflt)) 6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Initialize static variable for GC head size */ 6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (gc_head_size == NULL) { 6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm gc_head_size = PyInt_FromSsize_t(sizeof(PyGC_Head)); 6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (gc_head_size == NULL) 6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Make sure the type is initialized. float gets initialized late */ 7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyType_Ready(Py_TYPE(o)) < 0) 7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Instance of old-style class */ 7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyInstance_Check(o)) 7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = PyInt_FromSsize_t(PyInstance_Type.tp_basicsize); 7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* all other objects */ 7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *method = _PyObject_LookupSpecial(o, "__sizeof__", 7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &str__sizeof__); 7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (method == NULL) { 7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyErr_Occurred()) 7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Format(PyExc_TypeError, 7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Type %.100s doesn't define __sizeof__", 7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_TYPE(o)->tp_name); 7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = PyObject_CallFunctionObjArgs(method, NULL); 7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(method); 7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Has a default value been given? */ 7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((res == NULL) && (dflt != NULL) && 7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_ExceptionMatches(PyExc_TypeError)) 7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { 7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(dflt); 7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return dflt; 7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (res == NULL) 7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* add gc_head size */ 7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyObject_IS_GC(o)) { 7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *tmp = res; 7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = PyNumber_Add(tmp, gc_head_size); 7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(tmp); 7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return res; 7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getsizeof_doc, 7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getsizeof(object, default) -> int\n\ 7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the size of object in bytes."); 7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getrefcount(PyObject *self, PyObject *arg) 7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromSsize_t(arg->ob_refcnt); 7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_REF_DEBUG 7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_gettotalrefcount(PyObject *self) 7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyInt_FromSsize_t(_Py_GetRefTotal()); 7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* Py_REF_DEBUG */ 7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getrefcount_doc, 7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"getrefcount(object) -> integer\n\ 7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn the reference count of object. The count returned is generally\n\ 7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmone higher than you might expect, because it includes the (temporary)\n\ 7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmreference as an argument to getrefcount()." 7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS 7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getcounts(PyObject *self) 7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm extern PyObject *get_counts(void); 7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return get_counts(); 7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(getframe_doc, 7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"_getframe([depth]) -> frameobject\n\ 7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a frame object from the call stack. If optional integer depth is\n\ 7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgiven, return the frame object that many calls below the top of the stack.\n\ 7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIf that is deeper than the call stack, ValueError is raised. The default\n\ 7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor depth is zero, returning the frame at the top of the call stack.\n\ 7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThis function should be used for internal and specialized\n\ 7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpurposes only." 7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_getframe(PyObject *self, PyObject *args) 7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFrameObject *f = PyThreadState_GET()->frame; 7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int depth = -1; 7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "|i:_getframe", &depth)) 8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (depth > 0 && f != NULL) { 8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f = f->f_back; 8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm --depth; 8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (f == NULL) { 8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_ValueError, 8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "call stack is not deep enough"); 8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(f); 8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject*)f; 8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(current_frames_doc, 8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"_current_frames() -> dictionary\n\ 8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a dictionary mapping each current thread T's thread id to T's\n\ 8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcurrent stack frame.\n\ 8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThis function should be used for specialized purposes only." 8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_current_frames(PyObject *self, PyObject *noargs) 8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return _PyThread_CurrentFrames(); 8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(call_tracing_doc, 8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"call_tracing(func, args) -> object\n\ 8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmCall func(*args), while tracing is enabled. The tracing state is\n\ 8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsaved, and restored afterwards. This is intended to be called from\n\ 8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma debugger from a checkpoint, to recursively debug some other code." 8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_call_tracing(PyObject *self, PyObject *args) 8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *func, *funcargs; 8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyArg_ParseTuple(args, "OO!:call_tracing", &func, &PyTuple_Type, &funcargs)) 8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return _PyEval_CallTracing(func, funcargs); 8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(callstats_doc, 8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"callstats() -> tuple of integers\n\ 8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReturn a tuple of function call statistics, if CALL_PROFILE was defined\n\ 8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhen Python was built. Otherwise, return None.\n\ 8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmWhen enabled, this function returns detailed, implementation-specific\n\ 8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdetails about the number of function calls executed. The return value is\n\ 8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma 11-tuple where the entries in the tuple are counts of:\n\ 8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm0. all function calls\n\ 8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm1. calls to PyFunction_Type objects\n\ 8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm2. PyFunction calls that do not create an argument tuple\n\ 8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm3. PyFunction calls that do not create an argument tuple\n\ 8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm and bypass PyEval_EvalCodeEx()\n\ 8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm4. PyMethod calls\n\ 8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm5. PyMethod calls on bound methods\n\ 8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm6. PyType calls\n\ 8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm7. PyCFunction calls\n\ 8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm8. generator calls\n\ 8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm9. All other calls\n\ 8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm10. Number of stack pops performed by call_function()" 8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm); 8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __cplusplus 8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern "C" { 8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_TRACE_REFS 8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Defined in objects.c because it uses static globals if that file */ 8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern PyObject *_Py_GetObjects(PyObject *, PyObject *); 8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef DYNAMIC_EXECUTION_PROFILE 8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Defined in ceval.c because it uses static globals if that file */ 8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern PyObject *_Py_GetDXProfile(PyObject *, PyObject *); 8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __cplusplus 8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsys_clear_type_cache(PyObject* self, PyObject* args) 8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyType_ClearCache(); 8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_RETURN_NONE; 8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(sys_clear_type_cache__doc__, 8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"_clear_type_cache() -> None\n\ 8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmClear the internal type lookup cache."); 8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyMethodDef sys_methods[] = { 9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Might as well keep this in alphabetic order */ 9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS, 9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm callstats_doc}, 9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"_clear_type_cache", sys_clear_type_cache, METH_NOARGS, 9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys_clear_type_cache__doc__}, 9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"_current_frames", sys_current_frames, METH_NOARGS, 9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm current_frames_doc}, 9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"displayhook", sys_displayhook, METH_O, displayhook_doc}, 9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"exc_info", sys_exc_info, METH_NOARGS, exc_info_doc}, 9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"exc_clear", sys_exc_clear, METH_NOARGS, exc_clear_doc}, 9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"excepthook", sys_excepthook, METH_VARARGS, excepthook_doc}, 9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"exit", sys_exit, METH_VARARGS, exit_doc}, 9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding, 9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm METH_NOARGS, getdefaultencoding_doc}, 9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_DLOPEN 9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS, 9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm getdlopenflags_doc}, 9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS 9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS}, 9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef DYNAMIC_EXECUTION_PROFILE 9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getdxp", _Py_GetDXProfile, METH_VARARGS}, 9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding, 9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm METH_NOARGS, getfilesystemencoding_doc}, 9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_TRACE_REFS 9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getobjects", _Py_GetObjects, METH_VARARGS}, 9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_REF_DEBUG 9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS}, 9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getrefcount", (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc}, 9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS, 9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm getrecursionlimit_doc}, 9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getsizeof", (PyCFunction)sys_getsizeof, 9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm METH_VARARGS | METH_KEYWORDS, getsizeof_doc}, 9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"_getframe", sys_getframe, METH_VARARGS, getframe_doc}, 9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS 9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS, 9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm getwindowsversion_doc}, 9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* MS_WINDOWS */ 9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef USE_MALLOPT 9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"mdebug", sys_mdebug, METH_VARARGS}, 9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS, 9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm setdefaultencoding_doc}, 9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"setcheckinterval", sys_setcheckinterval, METH_VARARGS, 9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm setcheckinterval_doc}, 9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getcheckinterval", sys_getcheckinterval, METH_NOARGS, 9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm getcheckinterval_doc}, 9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_DLOPEN 9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"setdlopenflags", sys_setdlopenflags, METH_VARARGS, 9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm setdlopenflags_doc}, 9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"setprofile", sys_setprofile, METH_O, setprofile_doc}, 9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"getprofile", sys_getprofile, METH_NOARGS, getprofile_doc}, 9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS, 9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm setrecursionlimit_doc}, 9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_TSC 9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc}, 9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"settrace", sys_settrace, METH_O, settrace_doc}, 9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc}, 9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc}, 9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {NULL, NULL} /* sentinel */ 9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlist_builtin_module_names(void) 9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *list = PyList_New(0); 9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (list == NULL) 9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; PyImport_Inittab[i].name != NULL; i++) { 9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *name = PyString_FromString( 9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyImport_Inittab[i].name); 9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (name == NULL) 9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyList_Append(list, name); 9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(name); 9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyList_Sort(list) != 0) { 9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(list); 9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm list = NULL; 9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (list) { 9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v = PyList_AsTuple(list); 9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(list); 9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm list = v; 9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return list; 10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *warnoptions = NULL; 10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_ResetWarnOptions(void) 10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (warnoptions == NULL || !PyList_Check(warnoptions)) 10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL); 10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_AddWarnOption(char *s) 10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *str; 10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (warnoptions == NULL || !PyList_Check(warnoptions)) { 10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(warnoptions); 10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm warnoptions = PyList_New(0); 10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (warnoptions == NULL) 10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm str = PyString_FromString(s); 10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (str != NULL) { 10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyList_Append(warnoptions, str); 10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(str); 10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_HasWarnOptions(void) 10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (warnoptions != NULL && (PyList_Size(warnoptions) > 0)) ? 1 : 0; 10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* XXX This doc string is too long to be a single string literal in VC++ 5.0. 10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Two literals concatenated works just fine. If you have a K&R compiler 10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm or other abomination that however *does* understand longer strings, 10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm get rid of the !!! comment in the middle and the quotes that surround it. */ 10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_VAR(sys_doc) = 10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STR( 10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"This module provides access to some objects used or maintained by the\n\ 10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminterpreter and to functions that interact strongly with the interpreter.\n\ 10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmDynamic objects:\n\ 10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmargv -- command line arguments; argv[0] is the script pathname if known\n\ 10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpath -- module search path; path[0] is the script directory, else ''\n\ 10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmodules -- dictionary of loaded modules\n\ 10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdisplayhook -- called to show results in an interactive session\n\ 10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcepthook -- called to handle any uncaught exception other than SystemExit\n\ 10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm To customize printing in an interactive session or to install a custom\n\ 10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm top-level exception handler, assign other functions to replace these.\n\ 10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexitfunc -- if sys.exitfunc exists, this routine is called when Python exits\n\ 10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Assigning to sys.exitfunc is deprecated; use the atexit module instead.\n\ 10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstdin -- standard input file object; used by raw_input() and input()\n\ 10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstdout -- standard output file object; used by the print statement\n\ 10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstderr -- standard error object; used for error messages\n\ 10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm By assigning other file objects (or objects that behave like files)\n\ 10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm to these, it is possible to redirect all of the interpreter's I/O.\n\ 10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlast_type -- type of last uncaught exception\n\ 10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlast_value -- value of last uncaught exception\n\ 10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlast_traceback -- traceback of last uncaught exception\n\ 10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm These three are only available in an interactive session after a\n\ 10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm traceback has been printed.\n\ 10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexc_type -- type of exception currently being handled\n\ 10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexc_value -- value of exception currently being handled\n\ 10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexc_traceback -- traceback of exception currently being handled\n\ 10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The function exc_info() should be used instead of these three,\n\ 10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm because it is thread-safe.\n\ 10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm" 10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm) 10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* concatenating string here */ 10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STR( 10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"\n\ 10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmStatic objects:\n\ 10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfloat_info -- a dict with information about the float inplementation.\n\ 10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmlong_info -- a struct sequence with information about the long implementation.\n\ 10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmaxint -- the largest supported integer (the smallest is -maxint-1)\n\ 10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmaxsize -- the largest supported length of containers.\n\ 10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmaxunicode -- the largest supported character\n\ 10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbuiltin_module_names -- tuple of module names built into this interpreter\n\ 10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmversion -- the version of this interpreter as a string\n\ 10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmversion_info -- version information as a named tuple\n\ 10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhexversion -- version information encoded as a single integer\n\ 10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcopyright -- copyright notice pertaining to this interpreter\n\ 10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmplatform -- platform identifier\n\ 10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexecutable -- pathname of this Python interpreter\n\ 10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmprefix -- prefix used to find the Python library\n\ 10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexec_prefix -- prefix used to find the machine-specific Python library\n\ 10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfloat_repr_style -- string indicating the style of repr() output for floats\n\ 10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm" 11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm) 11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS 11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* concatenating string here */ 11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STR( 11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"dllhandle -- [Windows only] integer handle of the Python DLL\n\ 11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwinver -- [Windows only] version number of the Python DLL\n\ 11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm" 11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm) 11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* MS_WINDOWS */ 11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STR( 11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"__stdin__ -- the original stdin; don't touch!\n\ 11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__stdout__ -- the original stdout; don't touch!\n\ 11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__stderr__ -- the original stderr; don't touch!\n\ 11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__displayhook__ -- the original displayhook; don't touch!\n\ 11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__excepthook__ -- the original excepthook; don't touch!\n\ 11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFunctions:\n\ 11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdisplayhook() -- print an object to the screen, and save it in __builtin__._\n\ 11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcepthook() -- print an exception and its traceback to sys.stderr\n\ 11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexc_info() -- return thread-safe information about the current exception\n\ 11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexc_clear() -- clear the exception state for the current thread\n\ 11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexit() -- exit the interpreter by raising SystemExit\n\ 11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetdlopenflags() -- returns flags to be used for dlopen() calls\n\ 11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetprofile() -- get the global profiling function\n\ 11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetrefcount() -- return the reference count for an object (plus one :-)\n\ 11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetrecursionlimit() -- return the max recursion depth for the interpreter\n\ 11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgetsizeof() -- return the size of an object in bytes\n\ 11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmgettrace() -- get the global debug tracing function\n\ 11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetcheckinterval() -- control how often the interpreter checks for events\n\ 11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetdlopenflags() -- set the flags to be used for dlopen() calls\n\ 11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetprofile() -- set the global profiling function\n\ 11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsetrecursionlimit() -- set the max recursion depth for the interpreter\n\ 11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsettrace() -- set the global debug tracing function\n\ 11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm" 11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm) 11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* end of sys_doc */ ; 11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_check_and_flush (FILE *stream) 11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int prev_fail = ferror (stream); 11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return fflush (stream) || prev_fail ? EOF : 0; 11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Subversion branch and revision management */ 11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int svn_initialized; 11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char patchlevel_revision[50]; /* Just the number */ 11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char branch[50]; 11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char shortbranch[50]; 11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic const char *svn_revision; 11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsvnversion_init(void) 11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (svn_initialized) 11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm svn_initialized = 1; 11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *patchlevel_revision = '\0'; 11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strcpy(branch, ""); 11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strcpy(shortbranch, "unknown"); 11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm svn_revision = ""; 11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Return svnversion output if available. 11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Else return Revision of patchlevel.h if on branch. 11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Else return empty string */ 11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconst char* 11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_SubversionRevision() 11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm svnversion_init(); 11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return svn_revision; 11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmconst char* 11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_SubversionShortBranch() 11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm svnversion_init(); 11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return shortbranch; 11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(flags__doc__, 11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"sys.flags\n\ 11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFlags provided through command line arguments or environment vars."); 11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject FlagsType = {0, 0, 0, 0, 0, 0}; 11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStructSequence_Field flags_fields[] = { 11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"debug", "-d"}, 11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"py3k_warning", "-3"}, 11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"division_warning", "-Q"}, 11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"division_new", "-Qnew"}, 11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"inspect", "-i"}, 11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"interactive", "-i"}, 11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"optimize", "-O or -OO"}, 11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"dont_write_bytecode", "-B"}, 11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"no_user_site", "-s"}, 12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"no_site", "-S"}, 12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"ignore_environment", "-E"}, 12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"tabcheck", "-t or -tt"}, 12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"verbose", "-v"}, 12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS 12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"riscos_wimp", "???"}, 12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* {"unbuffered", "-u"}, */ 12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"unicode", "-U"}, 12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* {"skip_first", "-x"}, */ 12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"bytes_warning", "-b"}, 12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {0} 12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStructSequence_Desc flags_desc = { 12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "sys.flags", /* name */ 12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags__doc__, /* doc */ 12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags_fields, /* fields */ 12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS 12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16 12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15 12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject* 12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmake_flags(void) 12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int pos = 0; 12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *seq; 12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm seq = PyStructSequence_New(&FlagsType); 12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (seq == NULL) 12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SetFlag(flag) \ 12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_SET_ITEM(seq, pos++, PyInt_FromLong(flag)) 12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_DebugFlag); 12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_Py3kWarningFlag); 12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_DivisionWarningFlag); 12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(_Py_QnewFlag); 12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_InspectFlag); 12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_InteractiveFlag); 12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_OptimizeFlag); 12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_DontWriteBytecodeFlag); 12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_NoUserSiteDirectory); 12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_NoSiteFlag); 12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_IgnoreEnvironmentFlag); 12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_TabcheckFlag); 12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_VerboseFlag); 12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS 12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_RISCOSWimpFlag); 12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* SetFlag(saw_unbuffered_flag); */ 12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_UnicodeFlag); 12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* SetFlag(skipfirstline); */ 12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetFlag(Py_BytesWarningFlag); 12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef SetFlag 12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) { 12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return seq; 12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyDoc_STRVAR(version_info__doc__, 12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"sys.version_info\n\ 12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm\n\ 12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmVersion information as a named tuple."); 12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyTypeObject VersionInfoType = {0, 0, 0, 0, 0, 0}; 12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStructSequence_Field version_info_fields[] = { 12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"major", "Major release number"}, 12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"minor", "Minor release number"}, 12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"micro", "Patch release number"}, 12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"releaselevel", "'alpha', 'beta', 'candidate', or 'release'"}, 12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {"serial", "Serial release number"}, 12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm {0} 12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyStructSequence_Desc version_info_desc = { 12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "sys.version_info", /* name */ 12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm version_info__doc__, /* doc */ 12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm version_info_fields, /* fields */ 12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5 12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}; 12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmake_version_info(void) 12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *version_info; 12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int pos = 0; 12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm version_info = PyStructSequence_New(&VersionInfoType); 12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (version_info == NULL) { 12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* 13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * These release level checks are mutually exclusive and cover 13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the field, so don't get too fancy with the pre-processor! 13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA 13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = "alpha"; 13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA 13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = "beta"; 13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA 13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = "candidate"; 13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL 13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = "final"; 13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SetIntItem(flag) \ 13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_SET_ITEM(version_info, pos++, PyInt_FromLong(flag)) 13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SetStrItem(flag) \ 13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_SET_ITEM(version_info, pos++, PyString_FromString(flag)) 13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetIntItem(PY_MAJOR_VERSION); 13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetIntItem(PY_MINOR_VERSION); 13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetIntItem(PY_MICRO_VERSION); 13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetStrItem(s); 13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SetIntItem(PY_RELEASE_SERIAL); 13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef SetIntItem 13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef SetStrItem 13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) { 13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_CLEAR(version_info); 13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return version_info; 13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm_PySys_Init(void) 13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *m, *v, *sysdict; 13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *sysin, *sysout, *syserr; 13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *s; 13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m = Py_InitModule3("sys", sys_methods, sys_doc); 13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (m == NULL) 13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sysdict = PyModule_GetDict(m); 13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define SET_SYS_FROM_STRING(key, value) \ 13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = value; \ 13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v != NULL) \ 13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(sysdict, key, v); \ 13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(v) 13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Check that stdin is not a directory 13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Using shell redirection, you can redirect stdin to a directory, 13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm crashing the Python interpreter. Catch this common mistake here 13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm and output a useful error message. Note that under MS Windows, 13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the shell already prevents that. */ 13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(MS_WINDOWS) 13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { 13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm struct stat sb; 13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (fstat(fileno(stdin), &sb) == 0 && 13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm S_ISDIR(sb.st_mode)) { 13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* There's nothing more we can do. */ 13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Py_FatalError() will core dump, so just exit. */ 13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n"); 13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exit(EXIT_FAILURE); 13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Closing the standard FILE* if sys.std* goes aways causes problems 13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * for embedded Python usages. Closing them when somebody explicitly 13724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * invokes .close() might be possible, but the FAQ promises they get 13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * never closed. However, we still need to get write errors when 13744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * writing fails (e.g. because stdout is redirected), so we flush the 13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * streams and check for errors before the file objects are deleted. 13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * On OS X, fflush()ing stdin causes an error, so we exempt stdin 13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * from that procedure. 13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL); 13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sysout = PyFile_FromFile(stdout, "<stdout>", "w", _check_and_flush); 13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm syserr = PyFile_FromFile(stderr, "<stderr>", "w", _check_and_flush); 13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) 13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(sysdict, "stdin", sysin); 13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(sysdict, "stdout", sysout); 13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(sysdict, "stderr", syserr); 13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Make backup copies for cleanup */ 13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(sysdict, "__stdin__", sysin); 13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(sysdict, "__stdout__", sysout); 13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(sysdict, "__stderr__", syserr); 13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(sysdict, "__displayhook__", 13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_GetItemString(sysdict, "displayhook")); 13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(sysdict, "__excepthook__", 13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_GetItemString(sysdict, "excepthook")); 13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(sysin); 13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(sysout); 13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(syserr); 13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("version", 14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromString(Py_GetVersion())); 14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("hexversion", 14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInt_FromLong(PY_VERSION_HEX)); 14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm svnversion_init(); 14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("subversion", 14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_BuildValue("(ssz)", "CPython", branch, 14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm svn_revision)); 14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("_mercurial", 14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_BuildValue("(szz)", "CPython", _Py_hgidentifier(), 14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _Py_hgversion())); 14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("dont_write_bytecode", 14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyBool_FromLong(Py_DontWriteBytecodeFlag)); 14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("api_version", 14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInt_FromLong(PYTHON_API_VERSION)); 14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("copyright", 14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromString(Py_GetCopyright())); 14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("platform", 14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromString(Py_GetPlatform())); 14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("executable", 14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromString(Py_GetProgramFullPath())); 14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("prefix", 14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromString(Py_GetPrefix())); 14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("exec_prefix", 14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromString(Py_GetExecPrefix())); 14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("maxsize", 14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInt_FromSsize_t(PY_SSIZE_T_MAX)); 14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("maxint", 14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInt_FromLong(PyInt_GetMax())); 14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("py3kwarning", 14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyBool_FromLong(Py_Py3kWarningFlag)); 14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("float_info", 14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFloat_GetInfo()); 14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("long_info", 14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyLong_GetInfo()); 14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("maxunicode", 14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInt_FromLong(PyUnicode_GetMax())); 14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("builtin_module_names", 14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm list_builtin_module_names()); 14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { 14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Assumes that longs are at least 2 bytes long. 14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Should be safe! */ 14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned long number = 1; 14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *value; 14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm s = (char *) &number; 14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s[0] == 0) 14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value = "big"; 14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value = "little"; 14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("byteorder", 14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromString(value)); 14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_COREDLL 14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("dllhandle", 14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyLong_FromVoidPtr(PyWin_DLLhModule)); 14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("winver", 14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromString(PyWin_DLLVersionString)); 14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (warnoptions == NULL) { 14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm warnoptions = PyList_New(0); 14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(warnoptions); 14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (warnoptions != NULL) { 14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(sysdict, "warnoptions", warnoptions); 14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* version_info */ 14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (VersionInfoType.tp_name == 0) 14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_InitType(&VersionInfoType, &version_info_desc); 14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("version_info", make_version_info()); 14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* prevent user from creating new instances */ 14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm VersionInfoType.tp_init = NULL; 14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm VersionInfoType.tp_new = NULL; 14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* flags */ 14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (FlagsType.tp_name == 0) 14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_InitType(&FlagsType, &flags_desc); 14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("flags", make_flags()); 14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* prevent user from creating new instances */ 14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FlagsType.tp_init = NULL; 14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm FlagsType.tp_new = NULL; 14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(MS_WINDOWS) 14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* getwindowsversion */ 14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (WindowsVersionType.tp_name == 0) 14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyStructSequence_InitType(&WindowsVersionType, &windows_version_desc); 14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* prevent user from creating new instances */ 14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm WindowsVersionType.tp_init = NULL; 14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm WindowsVersionType.tp_new = NULL; 14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */ 14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PY_NO_SHORT_FLOAT_REPR 14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("float_repr_style", 15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromString("short")); 15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SET_SYS_FROM_STRING("float_repr_style", 15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_FromString("legacy")); 15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef SET_SYS_FROM_STRING 15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) 15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return m; 15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmakepathobject(char *path, int delim) 15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i, n; 15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *p; 15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v, *w; 15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = 1; 15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = path; 15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while ((p = strchr(p, delim)) != NULL) { 15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n++; 15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p++; 15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyList_New(n); 15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; ; i++) { 15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = strchr(path, delim); 15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p == NULL) 15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = strchr(path, '\0'); /* End of string */ 15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm w = PyString_FromStringAndSize(path, (Py_ssize_t) (p - path)); 15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (w == NULL) { 15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 15364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyList_SetItem(v, i, w); 15384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*p == '\0') 15394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 15404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm path = p+1; 15414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 15434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 15444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 15464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_SetPath(char *path) 15474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 15484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 15494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((v = makepathobject(path, DELIM)) == NULL) 15504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("can't create sys.path"); 15514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PySys_SetObject("path", v) != 0) 15524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("can't assign sys.path"); 15534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 15544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 15554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 15574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmakeargvobject(int argc, char **argv) 15584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 15594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *av; 15604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (argc <= 0 || argv == NULL) { 15614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Ensure at least one (empty) argument is seen */ 15624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm static char *empty_argv[1] = {""}; 15634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argv = empty_argv; 15644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argc = 1; 15654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm av = PyList_New(argc); 15674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (av != NULL) { 15684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int i; 15694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i = 0; i < argc; i++) { 15704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __VMS 15714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 15724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* argv[0] is the script pathname if known */ 15744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (i == 0) { 15754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char* fn = decc$translate_vms(argv[0]); 15764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((fn == (char *)0) || fn == (char *)-1) 15774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_FromString(argv[0]); 15784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 15794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_FromString( 15804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm decc$translate_vms(argv[0])); 15814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else 15824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyString_FromString(argv[i]); 15834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 15844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v = PyString_FromString(argv[i]); 15854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 15864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) { 15874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(av); 15884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm av = NULL; 15894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 15904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyList_SetItem(av, i, v); 15924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return av; 15954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 15964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 15984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_SetArgvEx(int argc, char **argv, int updatepath) 15994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 16004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(HAVE_REALPATH) 16014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char fullpath[MAXPATHLEN]; 16024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(MS_WINDOWS) && !defined(MS_WINCE) 16034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char fullpath[MAX_PATH]; 16044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 16054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *av = makeargvobject(argc, argv); 16064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *path = PySys_GetObject("path"); 16074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (av == NULL) 16084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("no mem for sys.argv"); 16094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PySys_SetObject("argv", av) != 0) 16104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("can't assign sys.argv"); 16114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (updatepath && path != NULL) { 16124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *argv0 = argv[0]; 16134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *p = NULL; 16144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_ssize_t n = 0; 16154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *a; 16164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_READLINK 16174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char link[MAXPATHLEN+1]; 16184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char argv0copy[2*MAXPATHLEN+1]; 16194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int nr = 0; 16204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) 16214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nr = readlink(argv0, link, MAXPATHLEN); 16224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nr > 0) { 16234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* It's a symlink */ 16244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm link[nr] = '\0'; 16254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (link[0] == SEP) 16264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argv0 = link; /* Link to absolute path */ 16274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (strchr(link, SEP) == NULL) 16284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ; /* Link without path */ 16294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 16304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Must join(dirname(argv0), link) */ 16314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *q = strrchr(argv0, SEP); 16324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (q == NULL) 16334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argv0 = link; /* argv0 without path */ 16344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 16354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Must make a copy */ 16364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strcpy(argv0copy, argv0); 16374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm q = strrchr(argv0copy, SEP); 16384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm strcpy(q+1, link); 16394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argv0 = argv0copy; 16404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_READLINK */ 16444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if SEP == '\\' /* Special case for MS filename syntax */ 16454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) { 16464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *q; 16474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(MS_WINDOWS) && !defined(MS_WINCE) 16484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* This code here replaces the first element in argv with the full 16494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm path that it represents. Under CE, there are no relative paths so 16504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the argument must be the full path anyway. */ 16514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *ptemp; 16524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (GetFullPathName(argv0, 16534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sizeof(fullpath), 16544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fullpath, 16554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &ptemp)) { 16564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argv0 = fullpath; 16574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 16594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = strrchr(argv0, SEP); 16604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Test for alternate separator */ 16614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm q = strrchr(p ? p : argv0, '/'); 16624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (q != NULL) 16634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = q; 16644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p != NULL) { 16654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = p + 1 - argv0; 16664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n > 1 && p[-1] != ':') 16674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n--; /* Drop trailing separator */ 16684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* All other filename syntaxes */ 16714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) { 16724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(HAVE_REALPATH) 16734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (realpath(argv0, fullpath)) { 16744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm argv0 = fullpath; 16754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 16774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = strrchr(argv0, SEP); 16784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (p != NULL) { 16804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef RISCOS 16814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = p + 1 - argv0; 16824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* don't include trailing separator */ 16834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n = p - argv0; 16844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* RISCOS */ 16854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if SEP == '/' /* Special case for Unix filename syntax */ 16864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n > 1) 16874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm n--; /* Drop trailing separator */ 16884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* Unix */ 16894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* All others */ 16914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a = PyString_FromStringAndSize(argv0, n); 16924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (a == NULL) 16934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("no mem for sys.path insertion"); 16944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyList_Insert(path, 0, a) < 0) 16954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("sys.path.insert(0) failed"); 16964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(a); 16974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(av); 16994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 17024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_SetArgv(int argc, char **argv) 17034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_SetArgvEx(argc, argv, 1); 17054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* APIs to write to sys.stdout or sys.stderr using a printf-like interface. 17094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Adapted from code submitted by Just van Rossum. 17104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_WriteStdout(format, ...) 17124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_WriteStderr(format, ...) 17134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The first function writes to sys.stdout; the second to sys.stderr. When 17154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm there is a problem, they write to the real (C level) stdout or stderr; 17164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm no exceptions are raised. 17174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Both take a printf-style format string as their first argument followed 17194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm by a variable length argument list determined by the format string. 17204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *** WARNING *** 17224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The format should limit the total size of the formatted output string to 17244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1000 bytes. In particular, this means that no unrestricted "%s" formats 17254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm should occur; these should be limited using "%.<N>s where <N> is a 17264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm decimal number calculated so that <N> plus the maximum size of other 17274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm formatted text does not exceed 1000 bytes. Also watch out for "%f", 17284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm which can print hundreds of digits for very large numbers. 17294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 17314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 17334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmywrite(char *name, FILE *fp, const char *format, va_list va) 17344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *file; 17364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *error_type, *error_value, *error_traceback; 17374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Fetch(&error_type, &error_value, &error_traceback); 17394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm file = PySys_GetObject(name); 17404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (file == NULL || PyFile_AsFile(file) == fp) 17414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm vfprintf(fp, format, va); 17424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 17434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char buffer[1001]; 17444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const int written = PyOS_vsnprintf(buffer, sizeof(buffer), 17454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm format, va); 17464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyFile_WriteString(buffer, file) != 0) { 17474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 17484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fputs(buffer, fp); 17494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (written < 0 || (size_t)written >= sizeof(buffer)) { 17514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *truncated = "... truncated"; 17524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyFile_WriteString(truncated, file) != 0) { 17534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 17544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fputs(truncated, fp); 17554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Restore(error_type, error_value, error_traceback); 17594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 17624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_WriteStdout(const char *format, ...) 17634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_list va; 17654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_start(va, format); 17674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mywrite("stdout", stdout, format, va); 17684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_end(va); 17694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 17724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPySys_WriteStderr(const char *format, ...) 17734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_list va; 17754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_start(va, format); 17774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mywrite("stderr", stderr, format, va); 17784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm va_end(va); 17794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1780