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