1c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 2c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* System module */ 3c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 4c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* 5c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielVarious bits of information used by the interpreter are collected in 6c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmodule 'sys'. 7c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFunction member: 8c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel- exit(sts): raise SystemExit 9c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielData members: 10c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel- stdin, stdout, stderr: standard file objects 11c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel- modules: the table of modules (dictionary) 12c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel- path: module search path (list of strings) 13c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel- argv: script arguments (list of strings) 14c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel- ps1, ps2: optional primary and secondary prompts (strings) 15c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/ 16c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 17c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "Python.h" 18c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "structseq.h" 19c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "code.h" 20c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "frameobject.h" 21c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "eval.h" 22c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 23c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "osdefs.h" 24c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 25c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef MS_WINDOWS 26c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define WIN32_LEAN_AND_MEAN 27c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "windows.h" 28c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* MS_WINDOWS */ 29c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 30c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef MS_COREDLL 31c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern void *PyWin_DLLhModule; 32c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* A string loaded from the DLL at startup: */ 33c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern const char *PyWin_DLLVersionString; 34c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 35c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 36c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __VMS 37c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <unixlib.h> 38c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 39c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 40c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef MS_WINDOWS 41c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <windows.h> 42c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 43c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 44c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_LANGINFO_H 45c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <locale.h> 46c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <langinfo.h> 47c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 48c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 49c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject * 50c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPySys_GetObject(char *name) 51c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 52c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyThreadState *tstate = PyThreadState_GET(); 53c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *sd = tstate->interp->sysdict; 54c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (sd == NULL) 55c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 56c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyDict_GetItemString(sd, name); 57c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 58c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 59c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFILE * 60c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPySys_GetFile(char *name, FILE *def) 61c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 62c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel FILE *fp = NULL; 63c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v = PySys_GetObject(name); 64c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v != NULL && PyFile_Check(v)) 65c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel fp = PyFile_AsFile(v); 66c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (fp == NULL) 67c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel fp = def; 68c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return fp; 69c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 70c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 71c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint 72c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPySys_SetObject(char *name, PyObject *v) 73c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 74c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyThreadState *tstate = PyThreadState_GET(); 75c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *sd = tstate->interp->sysdict; 76c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v == NULL) { 77c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyDict_GetItemString(sd, name) == NULL) 78c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return 0; 79c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 80c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyDict_DelItemString(sd, name); 81c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 82c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 83c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyDict_SetItemString(sd, name, v); 84c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 85c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 86c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 87c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_displayhook(PyObject *self, PyObject *o) 88c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 89c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *outf; 90c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyInterpreterState *interp = PyThreadState_GET()->interp; 91c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *modules = interp->modules; 92c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *builtins = PyDict_GetItemString(modules, "__builtin__"); 93c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 94c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (builtins == NULL) { 95c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_RuntimeError, "lost __builtin__"); 96c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 97c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 98c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 99c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Print value except if None */ 100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* After printing, also assign to '_' */ 101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Before, set '_' to None to avoid recursion */ 102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (o == Py_None) { 103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyObject_SetAttrString(builtins, "_", Py_None) != 0) 107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (Py_FlushLine() != 0) 109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel outf = PySys_GetObject("stdout"); 111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (outf == NULL) { 112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); 113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyFile_WriteObject(o, outf, 0) != 0) 116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyFile_SoftSpace(outf, 1); 118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (Py_FlushLine() != 0) 119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyObject_SetAttrString(builtins, "_", o) != 0) 121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(displayhook_doc, 127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"displayhook(object) -> None\n" 128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"\n" 129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"Print an object to sys.stdout and also save it in __builtin__._\n" 130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_excepthook(PyObject* self, PyObject* args) 134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *exc, *value, *tb; 136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb)) 137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Display(exc, value, tb); 139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(excepthook_doc, 144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"excepthook(exctype, value, traceback) -> None\n" 145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"\n" 146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"Handle an exception by displaying it with a traceback on sys.stderr.\n" 147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_exc_info(PyObject *self, PyObject *noargs) 151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyThreadState *tstate; 153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tstate = PyThreadState_GET(); 154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_BuildValue( 155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "(OOO)", 156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tstate->exc_type != NULL ? tstate->exc_type : Py_None, 157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tstate->exc_value != NULL ? tstate->exc_value : Py_None, 158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tstate->exc_traceback != NULL ? 159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tstate->exc_traceback : Py_None); 160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(exc_info_doc, 163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"exc_info() -> (type, value, traceback)\n\ 164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn information about the most recent exception caught by an except\n\ 166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielclause in the current stack frame or in an older stack frame." 167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_exc_clear(PyObject *self, PyObject *noargs) 171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyThreadState *tstate; 173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *tmp_type, *tmp_value, *tmp_tb; 174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_WarnPy3k("sys.exc_clear() not supported in 3.x; " 176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "use except clauses", 1) < 0) 177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tstate = PyThreadState_GET(); 180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tmp_type = tstate->exc_type; 181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tmp_value = tstate->exc_value; 182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tmp_tb = tstate->exc_traceback; 183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tstate->exc_type = NULL; 184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tstate->exc_value = NULL; 185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tstate->exc_traceback = NULL; 186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(tmp_type); 187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(tmp_value); 188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(tmp_tb); 189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* For b/w compatibility */ 190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PySys_SetObject("exc_type", Py_None); 191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PySys_SetObject("exc_value", Py_None); 192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PySys_SetObject("exc_traceback", Py_None); 193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(exc_clear_doc, 198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"exc_clear() -> None\n\ 199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielClear global information on the current exception. Subsequent calls to\n\ 201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexc_info() will return (None,None,None) until another exception is raised\n\ 202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielin the current thread or the execution stack returns to a frame where\n\ 203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielanother exception is being handled." 204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_exit(PyObject *self, PyObject *args) 208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *exit_code = 0; 210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code)) 211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Raise SystemExit so callers may catch it or clean up. */ 213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetObject(PyExc_SystemExit, exit_code); 214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(exit_doc, 218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"exit([status])\n\ 219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielExit the interpreter by raising SystemExit(status).\n\ 221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf the status is omitted or None, it defaults to zero (i.e., success).\n\ 222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf the status is an integer, it will be used as the system exit status.\n\ 223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf it is another kind of object, it will be printed and the system\n\ 224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexit status will be one (i.e., failure)." 225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_getdefaultencoding(PyObject *self) 231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyString_FromString(PyUnicode_GetDefaultEncoding()); 233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(getdefaultencoding_doc, 236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"getdefaultencoding() -> string\n\ 237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the current default string encoding used by the Unicode \n\ 239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielimplementation." 240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_setdefaultencoding(PyObject *self, PyObject *args) 244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *encoding; 246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding)) 247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyUnicode_SetDefaultEncoding(encoding)) 249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(setdefaultencoding_doc, 255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"setdefaultencoding(encoding)\n\ 256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSet the current default string encoding used by the Unicode implementation." 258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_getfilesystemencoding(PyObject *self) 262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (Py_FileSystemDefaultEncoding) 264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyString_FromString(Py_FileSystemDefaultEncoding); 265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(getfilesystemencoding_doc, 270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"getfilesystemencoding() -> string\n\ 271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the encoding used to convert Unicode filenames in\n\ 273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieloperating system filenames." 274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* 279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Cached interned string objects used for calling the profile and 280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * trace functions. Initialized by trace_init(). 281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; 283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int 285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltrace_init(void) 286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static char *whatnames[7] = {"call", "exception", "line", "return", 288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "c_call", "c_exception", "c_return"}; 289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *name; 290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int i; 291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; i < 7; ++i) { 292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (whatstrings[i] == NULL) { 293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel name = PyString_InternFromString(whatnames[i]); 294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (name == NULL) 295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return -1; 296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel whatstrings[i] = name; 297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return 0; 300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcall_trampoline(PyThreadState *tstate, PyObject* callback, 305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyFrameObject *frame, int what, PyObject *arg) 306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *args = PyTuple_New(3); 308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *whatstr; 309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *result; 310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (args == NULL) 312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(frame); 314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel whatstr = whatstrings[what]; 315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(whatstr); 316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (arg == NULL) 317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel arg = Py_None; 318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(arg); 319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyTuple_SET_ITEM(args, 0, (PyObject *)frame); 320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyTuple_SET_ITEM(args, 1, whatstr); 321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyTuple_SET_ITEM(args, 2, arg); 322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* call the Python-level function */ 324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyFrame_FastToLocals(frame); 325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = PyEval_CallObject(callback, args); 326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyFrame_LocalsToFast(frame, 1); 327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (result == NULL) 328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyTraceBack_Here(frame); 329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* cleanup */ 331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(args); 332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return result; 333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int 336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielprofile_trampoline(PyObject *self, PyFrameObject *frame, 337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int what, PyObject *arg) 338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyThreadState *tstate = frame->f_tstate; 340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *result; 341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (arg == NULL) 343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel arg = Py_None; 344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = call_trampoline(tstate, self, frame, what, arg); 345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (result == NULL) { 346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyEval_SetProfile(NULL, NULL); 347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return -1; 348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return 0; 351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int 354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltrace_trampoline(PyObject *self, PyFrameObject *frame, 355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int what, PyObject *arg) 356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyThreadState *tstate = frame->f_tstate; 358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *callback; 359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *result; 360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (what == PyTrace_CALL) 362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel callback = self; 363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel callback = frame->f_trace; 365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (callback == NULL) 366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return 0; 367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel result = call_trampoline(tstate, callback, frame, what, arg); 368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (result == NULL) { 369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyEval_SetTrace(NULL, NULL); 370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_CLEAR(frame->f_trace); 371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return -1; 372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (result != Py_None) { 374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *temp = frame->f_trace; 375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel frame->f_trace = NULL; 376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(temp); 377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel frame->f_trace = result; 378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(result); 381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return 0; 383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_settrace(PyObject *self, PyObject *args) 387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (trace_init() == -1) 389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (args == Py_None) 391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyEval_SetTrace(NULL, NULL); 392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyEval_SetTrace(trace_trampoline, args); 394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(settrace_doc, 399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"settrace(function)\n\ 400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSet the global debug tracing function. It will be called on each\n\ 402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfunction call. See the debugger chapter in the library manual." 403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_gettrace(PyObject *self, PyObject *args) 407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyThreadState *tstate = PyThreadState_GET(); 409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *temp = tstate->c_traceobj; 410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (temp == NULL) 412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel temp = Py_None; 413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(temp); 414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return temp; 415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(gettrace_doc, 418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"gettrace()\n\ 419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the global debug tracing function set with sys.settrace.\n\ 421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSee the debugger chapter in the library manual." 422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_setprofile(PyObject *self, PyObject *args) 426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (trace_init() == -1) 428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (args == Py_None) 430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyEval_SetProfile(NULL, NULL); 431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyEval_SetProfile(profile_trampoline, args); 433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(setprofile_doc, 438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"setprofile(function)\n\ 439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSet the profiling function. It will be called on each function call\n\ 441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieland return. See the profiler chapter in the library manual." 442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_getprofile(PyObject *self, PyObject *args) 446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyThreadState *tstate = PyThreadState_GET(); 448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *temp = tstate->c_profileobj; 449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (temp == NULL) 451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel temp = Py_None; 452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(temp); 453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return temp; 454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(getprofile_doc, 457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"getprofile()\n\ 458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the profiling function set with sys.setprofile.\n\ 460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSee the profiler chapter in the library manual." 461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_setcheckinterval(PyObject *self, PyObject *args) 465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval)) 467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel _Py_Ticker = _Py_CheckInterval; 469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(setcheckinterval_doc, 474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"setcheckinterval(n)\n\ 475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielTell the Python interpreter to check for asynchronous events every\n\ 477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieln instructions. This also affects how often thread switches occur." 478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_getcheckinterval(PyObject *self, PyObject *args) 482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromLong(_Py_CheckInterval); 484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(getcheckinterval_doc, 487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"getcheckinterval() -> current check interval; see setcheckinterval()." 488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_TSC 491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_settscdump(PyObject *self, PyObject *args) 493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int bool; 495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyThreadState *tstate = PyThreadState_Get(); 496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "i:settscdump", &bool)) 498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (bool) 500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tstate->interp->tscdump = 1; 501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tstate->interp->tscdump = 0; 503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(settscdump_doc, 509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"settscdump(bool)\n\ 510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf true, tell the Python interpreter to dump VM measurements to\n\ 512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstderr. If false, turn off dump. The measurements are based on the\n\ 513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielprocessor's time-stamp counter." 514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* TSC */ 516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_setrecursionlimit(PyObject *self, PyObject *args) 519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int new_limit; 521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit)) 522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (new_limit <= 0) { 524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_ValueError, 525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "recursion limit must be positive"); 526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_SetRecursionLimit(new_limit); 529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(setrecursionlimit_doc, 534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"setrecursionlimit(n)\n\ 535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSet the maximum depth of the Python interpreter stack to n. This\n\ 537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniellimit prevents infinite recursion from causing an overflow of the C\n\ 538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstack and crashing Python. The highest possible limit is platform-\n\ 539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieldependent." 540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_getrecursionlimit(PyObject *self) 544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromLong(Py_GetRecursionLimit()); 546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(getrecursionlimit_doc, 549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"getrecursionlimit()\n\ 550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the current value of the recursion limit, the maximum depth\n\ 552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielof the Python interpreter stack. This limit prevents infinite\n\ 553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielrecursion from causing an overflow of the C stack and crashing Python." 554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef MS_WINDOWS 557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(getwindowsversion_doc, 558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"getwindowsversion()\n\ 559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn information about the running version of Windows as a named tuple.\n\ 561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe members are named: major, minor, build, platform, service_pack,\n\ 562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielservice_pack_major, service_pack_minor, suite_mask, and product_type. For\n\ 563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbackward compatibility, only the first 5 items are available by indexing.\n\ 564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielAll elements are numbers, except service_pack which is a string. Platform\n\ 565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmay be 0 for win32s, 1 for Windows 9x/ME, 2 for Windows NT/2000/XP/Vista/7,\n\ 566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel3 for Windows CE. Product_type may be 1 for a workstation, 2 for a domain\n\ 567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcontroller, 3 for a server." 568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyTypeObject WindowsVersionType = {0, 0, 0, 0, 0, 0}; 571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyStructSequence_Field windows_version_fields[] = { 573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"major", "Major version number"}, 574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"minor", "Minor version number"}, 575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"build", "Build number"}, 576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"platform", "Operating system platform"}, 577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"service_pack", "Latest Service Pack installed on the system"}, 578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"service_pack_major", "Service Pack major version number"}, 579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"service_pack_minor", "Service Pack minor version number"}, 580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"suite_mask", "Bit mask identifying available product suites"}, 581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"product_type", "System product type"}, 582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {0} 583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}; 584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyStructSequence_Desc windows_version_desc = { 586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "sys.getwindowsversion", /* name */ 587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel getwindowsversion_doc, /* doc */ 588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel windows_version_fields, /* fields */ 589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 5 /* For backward compatibility, 590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel only the first 5 items are accessible 591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel via indexing, the rest are name only */ 592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}; 593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_getwindowsversion(PyObject *self) 596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *version; 598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int pos = 0; 599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel OSVERSIONINFOEX ver; 600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ver.dwOSVersionInfoSize = sizeof(ver); 601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!GetVersionEx((OSVERSIONINFO*) &ver)) 602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyErr_SetFromWindowsErr(0); 603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel version = PyStructSequence_New(&WindowsVersionType); 605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (version == NULL) 606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwMajorVersion)); 609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwMinorVersion)); 610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwBuildNumber)); 611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwPlatformId)); 612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_SET_ITEM(version, pos++, PyString_FromString(ver.szCSDVersion)); 613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wServicePackMajor)); 614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wServicePackMinor)); 615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wSuiteMask)); 616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wProductType)); 617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) { 619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(version); 620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return version; 623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* MS_WINDOWS */ 626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_DLOPEN 628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_setdlopenflags(PyObject *self, PyObject *args) 630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int new_val; 632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyThreadState *tstate = PyThreadState_GET(); 633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val)) 634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!tstate) 636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel tstate->interp->dlopenflags = new_val; 638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(setdlopenflags_doc, 643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"setdlopenflags(n) -> None\n\ 644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSet the flags used by the interpreter for dlopen calls, such as when the\n\ 646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielinterpreter loads extension modules. Among other things, this will enable\n\ 647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniela lazy resolving of symbols when importing a module, if called as\n\ 648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys.setdlopenflags(0). To share symbols across extension modules, call as\n\ 649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys.setdlopenflags(ctypes.RTLD_GLOBAL). Symbolic names for the flag modules\n\ 650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcan be either found in the ctypes module, or in the DLFCN module. If DLFCN\n\ 651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielis not available, it can be generated from /usr/include/dlfcn.h using the\n\ 652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielh2py script."); 653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_getdlopenflags(PyObject *self, PyObject *args) 656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyThreadState *tstate = PyThreadState_GET(); 658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!tstate) 659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromLong(tstate->interp->dlopenflags); 661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(getdlopenflags_doc, 664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"getdlopenflags() -> int\n\ 665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the current value of the flags that are used for dlopen calls.\n\ 667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe flag constants are defined in the ctypes and DLFCN modules."); 668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* HAVE_DLOPEN */ 670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef USE_MALLOPT 672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Link with -lmalloc (or -lmpc) on an SGI */ 673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <malloc.h> 674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_mdebug(PyObject *self, PyObject *args) 677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int flag; 679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "i:mdebug", &flag)) 680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel mallopt(M_DEBUG, flag); 682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(Py_None); 683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return Py_None; 684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* USE_MALLOPT */ 686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsize_t 688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel_PySys_GetSizeOf(PyObject *o) 689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static PyObject *str__sizeof__ = NULL; 691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *res = NULL; 692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t size; 693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Make sure the type is initialized. float gets initialized late */ 695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyType_Ready(Py_TYPE(o)) < 0) 696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return (size_t)-1; 697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Instance of old-style class */ 699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyInstance_Check(o)) 700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel size = PyInstance_Type.tp_basicsize; 701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* all other objects */ 702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *method = _PyObject_LookupSpecial(o, "__sizeof__", 704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel &str__sizeof__); 705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (method == NULL) { 706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyErr_Occurred()) 707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Format(PyExc_TypeError, 708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "Type %.100s doesn't define __sizeof__", 709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_TYPE(o)->tp_name); 710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel res = PyObject_CallFunctionObjArgs(method, NULL); 713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(method); 714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (res == NULL) 717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return (size_t)-1; 718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel size = (size_t)PyInt_AsSsize_t(res); 720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(res); 721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (size == -1 && PyErr_Occurred()) 722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return (size_t)-1; 723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (size < 0) { 726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_ValueError, "__sizeof__() should return >= 0"); 727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return (size_t)-1; 728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* add gc_head size */ 731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyObject_IS_GC(o)) 732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return ((size_t)size) + sizeof(PyGC_Head); 733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return (size_t)size; 734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) 738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static char *kwlist[] = {"object", "default", 0}; 740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel size_t size; 741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *o, *dflt = NULL; 742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", 744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel kwlist, &o, &dflt)) 745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel size = _PySys_GetSizeOf(o); 748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (size == (size_t)-1 && PyErr_Occurred()) { 750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Has a default value been given */ 751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (dflt != NULL && PyErr_ExceptionMatches(PyExc_TypeError)) { 752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Clear(); 753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(dflt); 754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return dflt; 755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromSize_t(size); 761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(getsizeof_doc, 764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"getsizeof(object, default) -> int\n\ 765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the size of object in bytes."); 767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_getrefcount(PyObject *self, PyObject *arg) 770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromSsize_t(arg->ob_refcnt); 772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_REF_DEBUG 775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_gettotalrefcount(PyObject *self) 777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return PyInt_FromSsize_t(_Py_GetRefTotal()); 779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* Py_REF_DEBUG */ 781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(getrefcount_doc, 783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"getrefcount(object) -> integer\n\ 784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the reference count of object. The count returned is generally\n\ 786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielone higher than you might expect, because it includes the (temporary)\n\ 787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielreference as an argument to getrefcount()." 788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef COUNT_ALLOCS 791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_getcounts(PyObject *self) 793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel extern PyObject *get_counts(void); 795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return get_counts(); 797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(getframe_doc, 801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"_getframe([depth]) -> frameobject\n\ 802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a frame object from the call stack. If optional integer depth is\n\ 804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielgiven, return the frame object that many calls below the top of the stack.\n\ 805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf that is deeper than the call stack, ValueError is raised. The default\n\ 806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfor depth is zero, returning the frame at the top of the call stack.\n\ 807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThis function should be used for internal and specialized\n\ 809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielpurposes only." 810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_getframe(PyObject *self, PyObject *args) 814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyFrameObject *f = PyThreadState_GET()->frame; 816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int depth = -1; 817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "|i:_getframe", &depth)) 819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel while (depth > 0 && f != NULL) { 822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel f = f->f_back; 823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel --depth; 824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (f == NULL) { 826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_SetString(PyExc_ValueError, 827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "call stack is not deep enough"); 828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(f); 831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return (PyObject*)f; 832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(current_frames_doc, 835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"_current_frames() -> dictionary\n\ 836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a dictionary mapping each current thread T's thread id to T's\n\ 838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcurrent stack frame.\n\ 839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThis function should be used for specialized purposes only." 841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_current_frames(PyObject *self, PyObject *noargs) 845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return _PyThread_CurrentFrames(); 847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(call_tracing_doc, 850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"call_tracing(func, args) -> object\n\ 851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielCall func(*args), while tracing is enabled. The tracing state is\n\ 853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsaved, and restored afterwards. This is intended to be called from\n\ 854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniela debugger from a checkpoint, to recursively debug some other code." 855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_call_tracing(PyObject *self, PyObject *args) 859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *func, *funcargs; 861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (!PyArg_ParseTuple(args, "OO!:call_tracing", &func, &PyTuple_Type, &funcargs)) 862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return _PyEval_CallTracing(func, funcargs); 864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(callstats_doc, 867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"callstats() -> tuple of integers\n\ 868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a tuple of function call statistics, if CALL_PROFILE was defined\n\ 870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielwhen Python was built. Otherwise, return None.\n\ 871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWhen enabled, this function returns detailed, implementation-specific\n\ 873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieldetails about the number of function calls executed. The return value is\n\ 874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniela 11-tuple where the entries in the tuple are counts of:\n\ 875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel0. all function calls\n\ 876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel1. calls to PyFunction_Type objects\n\ 877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel2. PyFunction calls that do not create an argument tuple\n\ 878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel3. PyFunction calls that do not create an argument tuple\n\ 879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel and bypass PyEval_EvalCodeEx()\n\ 880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel4. PyMethod calls\n\ 881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel5. PyMethod calls on bound methods\n\ 882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel6. PyType calls\n\ 883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel7. PyCFunction calls\n\ 884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel8. generator calls\n\ 885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel9. All other calls\n\ 886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel10. Number of stack pops performed by call_function()" 887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel); 888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __cplusplus 890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern "C" { 891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_TRACE_REFS 894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Defined in objects.c because it uses static globals if that file */ 895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern PyObject *_Py_GetObjects(PyObject *, PyObject *); 896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef DYNAMIC_EXECUTION_PROFILE 899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Defined in ceval.c because it uses static globals if that file */ 900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern PyObject *_Py_GetDXProfile(PyObject *, PyObject *); 901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __cplusplus 904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsys_clear_type_cache(PyObject* self, PyObject* args) 909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyType_ClearCache(); 911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_RETURN_NONE; 912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(sys_clear_type_cache__doc__, 915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"_clear_type_cache() -> None\n\ 916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielClear the internal type lookup cache."); 917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyMethodDef sys_methods[] = { 920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Might as well keep this in alphabetic order */ 921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS, 922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel callstats_doc}, 923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"_clear_type_cache", sys_clear_type_cache, METH_NOARGS, 924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel sys_clear_type_cache__doc__}, 925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"_current_frames", sys_current_frames, METH_NOARGS, 926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel current_frames_doc}, 927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"displayhook", sys_displayhook, METH_O, displayhook_doc}, 928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"exc_info", sys_exc_info, METH_NOARGS, exc_info_doc}, 929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"exc_clear", sys_exc_clear, METH_NOARGS, exc_clear_doc}, 930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"excepthook", sys_excepthook, METH_VARARGS, excepthook_doc}, 931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"exit", sys_exit, METH_VARARGS, exit_doc}, 932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding, 934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel METH_NOARGS, getdefaultencoding_doc}, 935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_DLOPEN 937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS, 938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel getdlopenflags_doc}, 939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef COUNT_ALLOCS 941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS}, 942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef DYNAMIC_EXECUTION_PROFILE 944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getdxp", _Py_GetDXProfile, METH_VARARGS}, 945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding, 948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel METH_NOARGS, getfilesystemencoding_doc}, 949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_TRACE_REFS 951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getobjects", _Py_GetObjects, METH_VARARGS}, 952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_REF_DEBUG 954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS}, 955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getrefcount", (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc}, 957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS, 958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel getrecursionlimit_doc}, 959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getsizeof", (PyCFunction)sys_getsizeof, 960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel METH_VARARGS | METH_KEYWORDS, getsizeof_doc}, 961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"_getframe", sys_getframe, METH_VARARGS, getframe_doc}, 962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef MS_WINDOWS 963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS, 964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel getwindowsversion_doc}, 965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* MS_WINDOWS */ 966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef USE_MALLOPT 967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"mdebug", sys_mdebug, METH_VARARGS}, 968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS, 971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel setdefaultencoding_doc}, 972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"setcheckinterval", sys_setcheckinterval, METH_VARARGS, 974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel setcheckinterval_doc}, 975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getcheckinterval", sys_getcheckinterval, METH_NOARGS, 976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel getcheckinterval_doc}, 977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_DLOPEN 978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"setdlopenflags", sys_setdlopenflags, METH_VARARGS, 979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel setdlopenflags_doc}, 980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"setprofile", sys_setprofile, METH_O, setprofile_doc}, 982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"getprofile", sys_getprofile, METH_NOARGS, getprofile_doc}, 983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS, 984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel setrecursionlimit_doc}, 985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_TSC 986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc}, 987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"settrace", sys_settrace, METH_O, settrace_doc}, 989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc}, 990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc}, 991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {NULL, NULL} /* sentinel */ 992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}; 993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniellist_builtin_module_names(void) 996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *list = PyList_New(0); 998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int i; 999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (list == NULL) 1000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; PyImport_Inittab[i].name != NULL; i++) { 1002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *name = PyString_FromString( 1003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyImport_Inittab[i].name); 1004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (name == NULL) 1005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel break; 1006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyList_Append(list, name); 1007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(name); 1008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyList_Sort(list) != 0) { 1010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(list); 1011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel list = NULL; 1012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (list) { 1014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v = PyList_AsTuple(list); 1015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(list); 1016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel list = v; 1017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return list; 1019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *warnoptions = NULL; 1022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid 1024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPySys_ResetWarnOptions(void) 1025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (warnoptions == NULL || !PyList_Check(warnoptions)) 1027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return; 1028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL); 1029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid 1032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPySys_AddWarnOption(char *s) 1033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *str; 1035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (warnoptions == NULL || !PyList_Check(warnoptions)) { 1037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(warnoptions); 1038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel warnoptions = PyList_New(0); 1039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (warnoptions == NULL) 1040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return; 1041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel str = PyString_FromString(s); 1043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (str != NULL) { 1044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyList_Append(warnoptions, str); 1045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(str); 1046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint 1050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPySys_HasWarnOptions(void) 1051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return (warnoptions != NULL && (PyList_Size(warnoptions) > 0)) ? 1 : 0; 1053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* XXX This doc string is too long to be a single string literal in VC++ 5.0. 1056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Two literals concatenated works just fine. If you have a K&R compiler 1057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel or other abomination that however *does* understand longer strings, 1058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel get rid of the !!! comment in the middle and the quotes that surround it. */ 1059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_VAR(sys_doc) = 1060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STR( 1061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"This module provides access to some objects used or maintained by the\n\ 1062c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielinterpreter and to functions that interact strongly with the interpreter.\n\ 1063c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1064c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielDynamic objects:\n\ 1065c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1066c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielargv -- command line arguments; argv[0] is the script pathname if known\n\ 1067c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielpath -- module search path; path[0] is the script directory, else ''\n\ 1068c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmodules -- dictionary of loaded modules\n\ 1069c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1070c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieldisplayhook -- called to show results in an interactive session\n\ 1071c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexcepthook -- called to handle any uncaught exception other than SystemExit\n\ 1072c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel To customize printing in an interactive session or to install a custom\n\ 1073c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel top-level exception handler, assign other functions to replace these.\n\ 1074c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1075c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexitfunc -- if sys.exitfunc exists, this routine is called when Python exits\n\ 1076c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Assigning to sys.exitfunc is deprecated; use the atexit module instead.\n\ 1077c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1078c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstdin -- standard input file object; used by raw_input() and input()\n\ 1079c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstdout -- standard output file object; used by the print statement\n\ 1080c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstderr -- standard error object; used for error messages\n\ 1081c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel By assigning other file objects (or objects that behave like files)\n\ 1082c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel to these, it is possible to redirect all of the interpreter's I/O.\n\ 1083c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1084c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniellast_type -- type of last uncaught exception\n\ 1085c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniellast_value -- value of last uncaught exception\n\ 1086c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniellast_traceback -- traceback of last uncaught exception\n\ 1087c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel These three are only available in an interactive session after a\n\ 1088c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel traceback has been printed.\n\ 1089c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1090c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexc_type -- type of exception currently being handled\n\ 1091c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexc_value -- value of exception currently being handled\n\ 1092c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexc_traceback -- traceback of exception currently being handled\n\ 1093c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel The function exc_info() should be used instead of these three,\n\ 1094c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel because it is thread-safe.\n\ 1095c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel" 1096c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel) 1097c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* concatenating string here */ 1098c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STR( 1099c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"\n\ 1100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielStatic objects:\n\ 1101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfloat_info -- a dict with information about the float inplementation.\n\ 1103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniellong_info -- a struct sequence with information about the long implementation.\n\ 1104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmaxint -- the largest supported integer (the smallest is -maxint-1)\n\ 1105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmaxsize -- the largest supported length of containers.\n\ 1106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmaxunicode -- the largest supported character\n\ 1107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_module_names -- tuple of module names built into this interpreter\n\ 1108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielversion -- the version of this interpreter as a string\n\ 1109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielversion_info -- version information as a named tuple\n\ 1110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielhexversion -- version information encoded as a single integer\n\ 1111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcopyright -- copyright notice pertaining to this interpreter\n\ 1112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielplatform -- platform identifier\n\ 1113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexecutable -- absolute path of the executable binary of the Python interpreter\n\ 1114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielprefix -- prefix used to find the Python library\n\ 1115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexec_prefix -- prefix used to find the machine-specific Python library\n\ 1116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfloat_repr_style -- string indicating the style of repr() output for floats\n\ 1117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel" 1118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel) 1119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef MS_WINDOWS 1120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* concatenating string here */ 1121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STR( 1122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"dllhandle -- [Windows only] integer handle of the Python DLL\n\ 1123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielwinver -- [Windows only] version number of the Python DLL\n\ 1124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel" 1125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel) 1126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* MS_WINDOWS */ 1127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STR( 1128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"__stdin__ -- the original stdin; don't touch!\n\ 1129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel__stdout__ -- the original stdout; don't touch!\n\ 1130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel__stderr__ -- the original stderr; don't touch!\n\ 1131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel__displayhook__ -- the original displayhook; don't touch!\n\ 1132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel__excepthook__ -- the original excepthook; don't touch!\n\ 1133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFunctions:\n\ 1135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieldisplayhook() -- print an object to the screen, and save it in __builtin__._\n\ 1137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexcepthook() -- print an exception and its traceback to sys.stderr\n\ 1138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexc_info() -- return thread-safe information about the current exception\n\ 1139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexc_clear() -- clear the exception state for the current thread\n\ 1140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexit() -- exit the interpreter by raising SystemExit\n\ 1141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielgetdlopenflags() -- returns flags to be used for dlopen() calls\n\ 1142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielgetprofile() -- get the global profiling function\n\ 1143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielgetrefcount() -- return the reference count for an object (plus one :-)\n\ 1144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielgetrecursionlimit() -- return the max recursion depth for the interpreter\n\ 1145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielgetsizeof() -- return the size of an object in bytes\n\ 1146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielgettrace() -- get the global debug tracing function\n\ 1147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsetcheckinterval() -- control how often the interpreter checks for events\n\ 1148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsetdlopenflags() -- set the flags to be used for dlopen() calls\n\ 1149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsetprofile() -- set the global profiling function\n\ 1150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsetrecursionlimit() -- set the max recursion depth for the interpreter\n\ 1151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsettrace() -- set the global debug tracing function\n\ 1152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel" 1153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel) 1154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* end of sys_doc */ ; 1155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int 1157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel_check_and_flush (FILE *stream) 1158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int prev_fail = ferror (stream); 1160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return fflush (stream) || prev_fail ? EOF : 0; 1161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Subversion branch and revision management */ 1164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int svn_initialized; 1165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic char patchlevel_revision[50]; /* Just the number */ 1166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic char branch[50]; 1167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic char shortbranch[50]; 1168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic const char *svn_revision; 1169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void 1171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsvnversion_init(void) 1172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (svn_initialized) 1174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return; 1175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel svn_initialized = 1; 1176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel *patchlevel_revision = '\0'; 1177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel strcpy(branch, ""); 1178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel strcpy(shortbranch, "unknown"); 1179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel svn_revision = ""; 1180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return; 1181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Return svnversion output if available. 1184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Else return Revision of patchlevel.h if on branch. 1185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Else return empty string */ 1186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielconst char* 1187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPy_SubversionRevision() 1188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel svnversion_init(); 1190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return svn_revision; 1191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielconst char* 1194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPy_SubversionShortBranch() 1195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel svnversion_init(); 1197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return shortbranch; 1198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(flags__doc__, 1202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"sys.flags\n\ 1203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFlags provided through command line arguments or environment vars."); 1205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyTypeObject FlagsType = {0, 0, 0, 0, 0, 0}; 1207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyStructSequence_Field flags_fields[] = { 1209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"debug", "-d"}, 1210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"py3k_warning", "-3"}, 1211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"division_warning", "-Q"}, 1212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"division_new", "-Qnew"}, 1213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"inspect", "-i"}, 1214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"interactive", "-i"}, 1215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"optimize", "-O or -OO"}, 1216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"dont_write_bytecode", "-B"}, 1217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"no_user_site", "-s"}, 1218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"no_site", "-S"}, 1219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"ignore_environment", "-E"}, 1220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"tabcheck", "-t or -tt"}, 1221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"verbose", "-v"}, 1222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef RISCOS 1223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"riscos_wimp", "???"}, 1224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* {"unbuffered", "-u"}, */ 1226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"unicode", "-U"}, 1227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* {"skip_first", "-x"}, */ 1228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"bytes_warning", "-b"}, 1229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"hash_randomization", "-R"}, 1230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {0} 1231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}; 1232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyStructSequence_Desc flags_desc = { 1234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "sys.flags", /* name */ 1235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel flags__doc__, /* doc */ 1236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel flags_fields, /* fields */ 1237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef RISCOS 1238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 17 1239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 1240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 16 1241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}; 1243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject* 1245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmake_flags(void) 1246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int pos = 0; 1248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *seq; 1249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel seq = PyStructSequence_New(&FlagsType); 1251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (seq == NULL) 1252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SetFlag(flag) \ 1255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_SET_ITEM(seq, pos++, PyInt_FromLong(flag)) 1256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_DebugFlag); 1258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_Py3kWarningFlag); 1259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_DivisionWarningFlag); 1260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(_Py_QnewFlag); 1261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_InspectFlag); 1262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_InteractiveFlag); 1263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_OptimizeFlag); 1264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_DontWriteBytecodeFlag); 1265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_NoUserSiteDirectory); 1266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_NoSiteFlag); 1267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_IgnoreEnvironmentFlag); 1268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_TabcheckFlag); 1269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_VerboseFlag); 1270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef RISCOS 1271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_RISCOSWimpFlag); 1272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* SetFlag(saw_unbuffered_flag); */ 1274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_UnicodeFlag); 1275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* SetFlag(skipfirstline); */ 1276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_BytesWarningFlag); 1277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetFlag(Py_HashRandomizationFlag); 1278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef SetFlag 1279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) { 1281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(seq); 1282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return seq; 1285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(version_info__doc__, 1288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"sys.version_info\n\ 1289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\ 1290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielVersion information as a named tuple."); 1291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyTypeObject VersionInfoType = {0, 0, 0, 0, 0, 0}; 1293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyStructSequence_Field version_info_fields[] = { 1295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"major", "Major release number"}, 1296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"minor", "Minor release number"}, 1297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"micro", "Patch release number"}, 1298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"releaselevel", "'alpha', 'beta', 'candidate', or 'release'"}, 1299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {"serial", "Serial release number"}, 1300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel {0} 1301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}; 1302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyStructSequence_Desc version_info_desc = { 1304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel "sys.version_info", /* name */ 1305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel version_info__doc__, /* doc */ 1306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel version_info_fields, /* fields */ 1307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 5 1308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}; 1309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmake_version_info(void) 1312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *version_info; 1314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *s; 1315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int pos = 0; 1316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel version_info = PyStructSequence_New(&VersionInfoType); 1318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (version_info == NULL) { 1319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* 1323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * These release level checks are mutually exclusive and cover 1324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * the field, so don't get too fancy with the pre-processor! 1325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 1326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA 1327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel s = "alpha"; 1328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA 1329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel s = "beta"; 1330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA 1331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel s = "candidate"; 1332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL 1333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel s = "final"; 1334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SetIntItem(flag) \ 1337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_SET_ITEM(version_info, pos++, PyInt_FromLong(flag)) 1338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SetStrItem(flag) \ 1339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_SET_ITEM(version_info, pos++, PyString_FromString(flag)) 1340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetIntItem(PY_MAJOR_VERSION); 1342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetIntItem(PY_MINOR_VERSION); 1343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetIntItem(PY_MICRO_VERSION); 1344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetStrItem(s); 1345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SetIntItem(PY_RELEASE_SERIAL); 1346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef SetIntItem 1347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef SetStrItem 1348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) { 1350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_CLEAR(version_info); 1351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return version_info; 1354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject * 1357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel_PySys_Init(void) 1358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *m, *v, *sysdict; 1360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *sysin, *sysout, *syserr; 1361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *s; 1362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel m = Py_InitModule3("sys", sys_methods, sys_doc); 1364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (m == NULL) 1365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel sysdict = PyModule_GetDict(m); 1367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SET_SYS_FROM_STRING(key, value) \ 1368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel v = value; \ 1369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v != NULL) \ 1370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyDict_SetItemString(sysdict, key, v); \ 1371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(v) 1372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Check that stdin is not a directory 1374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Using shell redirection, you can redirect stdin to a directory, 1375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel crashing the Python interpreter. Catch this common mistake here 1376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel and output a useful error message. Note that under MS Windows, 1377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel the shell already prevents that. */ 1378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if !defined(MS_WINDOWS) 1379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel { 1380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel struct stat sb; 1381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (fstat(fileno(stdin), &sb) == 0 && 1382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel S_ISDIR(sb.st_mode)) { 1383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* There's nothing more we can do. */ 1384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Py_FatalError() will core dump, so just exit. */ 1385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n"); 1386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel exit(EXIT_FAILURE); 1387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Closing the standard FILE* if sys.std* goes aways causes problems 1392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * for embedded Python usages. Closing them when somebody explicitly 1393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * invokes .close() might be possible, but the FAQ promises they get 1394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * never closed. However, we still need to get write errors when 1395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * writing fails (e.g. because stdout is redirected), so we flush the 1396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * streams and check for errors before the file objects are deleted. 1397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * On OS X, fflush()ing stdin causes an error, so we exempt stdin 1398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * from that procedure. 1399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 1400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL); 1401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel sysout = PyFile_FromFile(stdout, "<stdout>", "w", _check_and_flush); 1402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel syserr = PyFile_FromFile(stderr, "<stderr>", "w", _check_and_flush); 1403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) 1404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyDict_SetItemString(sysdict, "stdin", sysin); 1407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyDict_SetItemString(sysdict, "stdout", sysout); 1408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyDict_SetItemString(sysdict, "stderr", syserr); 1409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Make backup copies for cleanup */ 1410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyDict_SetItemString(sysdict, "__stdin__", sysin); 1411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyDict_SetItemString(sysdict, "__stdout__", sysout); 1412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyDict_SetItemString(sysdict, "__stderr__", syserr); 1413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyDict_SetItemString(sysdict, "__displayhook__", 1414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyDict_GetItemString(sysdict, "displayhook")); 1415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyDict_SetItemString(sysdict, "__excepthook__", 1416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyDict_GetItemString(sysdict, "excepthook")); 1417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(sysin); 1418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(sysout); 1419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_XDECREF(syserr); 1420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("version", 1422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_FromString(Py_GetVersion())); 1423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("hexversion", 1424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyInt_FromLong(PY_VERSION_HEX)); 1425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel svnversion_init(); 1426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("subversion", 1427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_BuildValue("(ssz)", "CPython", branch, 1428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel svn_revision)); 1429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("_mercurial", 1430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_BuildValue("(szz)", "CPython", _Py_hgidentifier(), 1431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel _Py_hgversion())); 1432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("dont_write_bytecode", 1433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyBool_FromLong(Py_DontWriteBytecodeFlag)); 1434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("api_version", 1435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyInt_FromLong(PYTHON_API_VERSION)); 1436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("copyright", 1437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_FromString(Py_GetCopyright())); 1438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("platform", 1439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_FromString(Py_GetPlatform())); 1440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("executable", 1441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_FromString(Py_GetProgramFullPath())); 1442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("prefix", 1443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_FromString(Py_GetPrefix())); 1444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("exec_prefix", 1445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_FromString(Py_GetExecPrefix())); 1446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("maxsize", 1447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyInt_FromSsize_t(PY_SSIZE_T_MAX)); 1448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("maxint", 1449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyInt_FromLong(PyInt_GetMax())); 1450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("py3kwarning", 1451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyBool_FromLong(Py_Py3kWarningFlag)); 1452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("float_info", 1453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyFloat_GetInfo()); 1454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("long_info", 1455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyLong_GetInfo()); 1456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE 1457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("maxunicode", 1458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyInt_FromLong(PyUnicode_GetMax())); 1459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("builtin_module_names", 1461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel list_builtin_module_names()); 1462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel { 1463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Assumes that longs are at least 2 bytes long. 1464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Should be safe! */ 1465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel unsigned long number = 1; 1466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *value; 1467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel s = (char *) &number; 1469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (s[0] == 0) 1470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel value = "big"; 1471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 1472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel value = "little"; 1473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("byteorder", 1474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_FromString(value)); 1475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef MS_COREDLL 1477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("dllhandle", 1478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyLong_FromVoidPtr(PyWin_DLLhModule)); 1479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("winver", 1480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_FromString(PyWin_DLLVersionString)); 1481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (warnoptions == NULL) { 1483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel warnoptions = PyList_New(0); 1484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_INCREF(warnoptions); 1487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (warnoptions != NULL) { 1489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyDict_SetItemString(sysdict, "warnoptions", warnoptions); 1490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* version_info */ 1493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (VersionInfoType.tp_name == 0) 1494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_InitType(&VersionInfoType, &version_info_desc); 1495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("version_info", make_version_info()); 1496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* prevent user from creating new instances */ 1497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel VersionInfoType.tp_init = NULL; 1498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel VersionInfoType.tp_new = NULL; 1499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* flags */ 1501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (FlagsType.tp_name == 0) 1502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_InitType(&FlagsType, &flags_desc); 1503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("flags", make_flags()); 1504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* prevent user from creating new instances */ 1505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel FlagsType.tp_init = NULL; 1506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel FlagsType.tp_new = NULL; 1507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(MS_WINDOWS) 1510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* getwindowsversion */ 1511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (WindowsVersionType.tp_name == 0) 1512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyStructSequence_InitType(&WindowsVersionType, &windows_version_desc); 1513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* prevent user from creating new instances */ 1514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel WindowsVersionType.tp_init = NULL; 1515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel WindowsVersionType.tp_new = NULL; 1516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */ 1519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef PY_NO_SHORT_FLOAT_REPR 1520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("float_repr_style", 1521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_FromString("short")); 1522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 1523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SET_SYS_FROM_STRING("float_repr_style", 1524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyString_FromString("legacy")); 1525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef SET_SYS_FROM_STRING 1528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyErr_Occurred()) 1529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return m; 1531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmakepathobject(char *path, int delim) 1535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int i, n; 1537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *p; 1538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v, *w; 1539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n = 1; 1541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel p = path; 1542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel while ((p = strchr(p, delim)) != NULL) { 1543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n++; 1544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel p++; 1545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel v = PyList_New(n); 1547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v == NULL) 1548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; ; i++) { 1550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel p = strchr(path, delim); 1551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (p == NULL) 1552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel p = strchr(path, '\0'); /* End of string */ 1553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel w = PyString_FromStringAndSize(path, (Py_ssize_t) (p - path)); 1554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (w == NULL) { 1555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(v); 1556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return NULL; 1557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyList_SetItem(v, i, w); 1559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (*p == '\0') 1560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel break; 1561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel path = p+1; 1562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return v; 1564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid 1567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPySys_SetPath(char *path) 1568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v; 1570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((v = makepathobject(path, DELIM)) == NULL) 1571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_FatalError("can't create sys.path"); 1572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PySys_SetObject("path", v) != 0) 1573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_FatalError("can't assign sys.path"); 1574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(v); 1575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * 1578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmakeargvobject(int argc, char **argv) 1579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *av; 1581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (argc <= 0 || argv == NULL) { 1582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Ensure at least one (empty) argument is seen */ 1583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel static char *empty_argv[1] = {""}; 1584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel argv = empty_argv; 1585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel argc = 1; 1586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel av = PyList_New(argc); 1588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (av != NULL) { 1589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int i; 1590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i = 0; i < argc; i++) { 1591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __VMS 1592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v; 1593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* argv[0] is the script pathname if known */ 1595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (i == 0) { 1596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char* fn = decc$translate_vms(argv[0]); 1597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((fn == (char *)0) || fn == (char *)-1) 1598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel v = PyString_FromString(argv[0]); 1599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else 1600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel v = PyString_FromString( 1601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel decc$translate_vms(argv[0])); 1602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } else 1603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel v = PyString_FromString(argv[i]); 1604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 1605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *v = PyString_FromString(argv[i]); 1606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (v == NULL) { 1608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(av); 1609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel av = NULL; 1610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel break; 1611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyList_SetItem(av, i, v); 1613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel return av; 1616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid 1619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPySys_SetArgvEx(int argc, char **argv, int updatepath) 1620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(HAVE_REALPATH) 1622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char fullpath[MAXPATHLEN]; 1623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif defined(MS_WINDOWS) && !defined(MS_WINCE) 1624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char fullpath[MAX_PATH]; 1625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *av = makeargvobject(argc, argv); 1627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *path = PySys_GetObject("path"); 1628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (av == NULL) 1629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_FatalError("no mem for sys.argv"); 1630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PySys_SetObject("argv", av) != 0) 1631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_FatalError("can't assign sys.argv"); 1632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (updatepath && path != NULL) { 1633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *argv0 = argv[0]; 1634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *p = NULL; 1635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_ssize_t n = 0; 1636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *a; 1637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_READLINK 1638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char link[MAXPATHLEN+1]; 1639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char argv0copy[2*MAXPATHLEN+1]; 1640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel int nr = 0; 1641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) 1642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel nr = readlink(argv0, link, MAXPATHLEN); 1643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (nr > 0) { 1644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* It's a symlink */ 1645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel link[nr] = '\0'; 1646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (link[0] == SEP) 1647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel argv0 = link; /* Link to absolute path */ 1648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (strchr(link, SEP) == NULL) 1649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ; /* Link without path */ 1650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Must join(dirname(argv0), link) */ 1652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *q = strrchr(argv0, SEP); 1653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (q == NULL) 1654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel argv0 = link; /* argv0 without path */ 1655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Must make a copy */ 1657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel strcpy(argv0copy, argv0); 1658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel q = strrchr(argv0copy, SEP); 1659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel strcpy(q+1, link); 1660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel argv0 = argv0copy; 1661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* HAVE_READLINK */ 1665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if SEP == '\\' /* Special case for MS filename syntax */ 1666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) { 1667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *q; 1668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(MS_WINDOWS) && !defined(MS_WINCE) 1669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* This code here replaces the first element in argv with the full 1670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel path that it represents. Under CE, there are no relative paths so 1671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel the argument must be the full path anyway. */ 1672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *ptemp; 1673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (GetFullPathName(argv0, 1674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel sizeof(fullpath), 1675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel fullpath, 1676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel &ptemp)) { 1677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel argv0 = fullpath; 1678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel p = strrchr(argv0, SEP); 1681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Test for alternate separator */ 1682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel q = strrchr(p ? p : argv0, '/'); 1683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (q != NULL) 1684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel p = q; 1685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (p != NULL) { 1686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n = p + 1 - argv0; 1687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (n > 1 && p[-1] != ':') 1688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n--; /* Drop trailing separator */ 1689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else /* All other filename syntaxes */ 1692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) { 1693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(HAVE_REALPATH) 1694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (realpath(argv0, fullpath)) { 1695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel argv0 = fullpath; 1696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 1698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel p = strrchr(argv0, SEP); 1699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (p != NULL) { 1701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef RISCOS 1702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n = p + 1 - argv0; 1703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else /* don't include trailing separator */ 1704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n = p - argv0; 1705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* RISCOS */ 1706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if SEP == '/' /* Special case for Unix filename syntax */ 1707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (n > 1) 1708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel n--; /* Drop trailing separator */ 1709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* Unix */ 1710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* All others */ 1712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel a = PyString_FromStringAndSize(argv0, n); 1713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (a == NULL) 1714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_FatalError("no mem for sys.path insertion"); 1715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyList_Insert(path, 0, a) < 0) 1716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_FatalError("sys.path.insert(0) failed"); 1717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(a); 1718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Py_DECREF(av); 1720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid 1723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPySys_SetArgv(int argc, char **argv) 1724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PySys_SetArgvEx(argc, argv, 1); 1726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* APIs to write to sys.stdout or sys.stderr using a printf-like interface. 1730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Adapted from code submitted by Just van Rossum. 1731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PySys_WriteStdout(format, ...) 1733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PySys_WriteStderr(format, ...) 1734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel The first function writes to sys.stdout; the second to sys.stderr. When 1736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel there is a problem, they write to the real (C level) stdout or stderr; 1737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel no exceptions are raised. 1738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Both take a printf-style format string as their first argument followed 1740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel by a variable length argument list determined by the format string. 1741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel *** WARNING *** 1743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel The format should limit the total size of the formatted output string to 1745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1000 bytes. In particular, this means that no unrestricted "%s" formats 1746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel should occur; these should be limited using "%.<N>s where <N> is a 1747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel decimal number calculated so that <N> plus the maximum size of other 1748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel formatted text does not exceed 1000 bytes. Also watch out for "%f", 1749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel which can print hundreds of digits for very large numbers. 1750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 1752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void 1754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmywrite(char *name, FILE *fp, const char *format, va_list va) 1755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *file; 1757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyObject *error_type, *error_value, *error_traceback; 1758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Fetch(&error_type, &error_value, &error_traceback); 1760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel file = PySys_GetObject(name); 1761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (file == NULL || PyFile_AsFile(file) == fp) 1762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel vfprintf(fp, format, va); 1763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else { 1764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char buffer[1001]; 1765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel const int written = PyOS_vsnprintf(buffer, sizeof(buffer), 1766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel format, va); 1767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyFile_WriteString(buffer, file) != 0) { 1768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Clear(); 1769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel fputs(buffer, fp); 1770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (written < 0 || (size_t)written >= sizeof(buffer)) { 1772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel const char *truncated = "... truncated"; 1773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (PyFile_WriteString(truncated, file) != 0) { 1774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Clear(); 1775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel fputs(truncated, fp); 1776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } 1779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyErr_Restore(error_type, error_value, error_traceback); 1780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid 1783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPySys_WriteStdout(const char *format, ...) 1784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel va_list va; 1786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel va_start(va, format); 1788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel mywrite("stdout", stdout, format, va); 1789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel va_end(va); 1790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid 1793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPySys_WriteStderr(const char *format, ...) 1794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{ 1795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel va_list va; 1796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 1797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel va_start(va, format); 1798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel mywrite("stderr", stderr, format, va); 1799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel va_end(va); 1800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 1801