1f70e43a073b36c6f6e9894c01025243a77a452d4Guido van Rossum
285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum/* System module */
385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum
485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum/*
585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van RossumVarious bits of information used by the interpreter are collected in
685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossummodule 'sys'.
73f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van RossumFunction member:
8cc8914fb2207dfc269aaef046a07366ff3cfc9f1Guido van Rossum- exit(sts): raise SystemExit
985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van RossumData members:
1085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum- stdin, stdout, stderr: standard file objects
1185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum- modules: the table of modules (dictionary)
123f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum- path: module search path (list of strings)
133f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum- argv: script arguments (list of strings)
143f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum- ps1, ps2: optional primary and secondary prompts (strings)
1585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum*/
1685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum
1765bf9f265e4052c3eee95cd73f8de66bc92e53bfGuido van Rossum#include "Python.h"
18f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes#include "structseq.h"
193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "code.h"
20b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsaw#include "frameobject.h"
21a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van Rossum#include "eval.h"
2285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum
23e2437a191d1498f12cbb6906dfbe4e79c38271adGuido van Rossum#include "osdefs.h"
243f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum
258696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond#ifdef MS_WINDOWS
268696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond#define WIN32_LEAN_AND_MEAN
278696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond#include "windows.h"
288696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond#endif /* MS_WINDOWS */
298696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond
309b38a145e2ee72dc3ff3300a3c13e358fee1495dGuido van Rossum#ifdef MS_COREDLL
31c606fe186f4b2e1d962651ae3ea34325c65b83dcGuido van Rossumextern void *PyWin_DLLhModule;
326c1e5f2033ff9b1cfe6bda1da4ac6e3c88a47240Guido van Rossum/* A string loaded from the DLL at startup: */
336c1e5f2033ff9b1cfe6bda1da4ac6e3c88a47240Guido van Rossumextern const char *PyWin_DLLVersionString;
34c606fe186f4b2e1d962651ae3ea34325c65b83dcGuido van Rossum#endif
35c606fe186f4b2e1d962651ae3ea34325c65b83dcGuido van Rossum
36c16f3bd8a391a68427a95e15a3c1894198ff0377Martin v. Löwis#ifdef __VMS
37c16f3bd8a391a68427a95e15a3c1894198ff0377Martin v. Löwis#include <unixlib.h>
38c16f3bd8a391a68427a95e15a3c1894198ff0377Martin v. Löwis#endif
39c16f3bd8a391a68427a95e15a3c1894198ff0377Martin v. Löwis
405467d4c0e31e9db305a4899a44d7978f83e96649Martin v. Löwis#ifdef MS_WINDOWS
415467d4c0e31e9db305a4899a44d7978f83e96649Martin v. Löwis#include <windows.h>
425467d4c0e31e9db305a4899a44d7978f83e96649Martin v. Löwis#endif
435467d4c0e31e9db305a4899a44d7978f83e96649Martin v. Löwis
445467d4c0e31e9db305a4899a44d7978f83e96649Martin v. Löwis#ifdef HAVE_LANGINFO_H
455467d4c0e31e9db305a4899a44d7978f83e96649Martin v. Löwis#include <locale.h>
465467d4c0e31e9db305a4899a44d7978f83e96649Martin v. Löwis#include <langinfo.h>
475467d4c0e31e9db305a4899a44d7978f83e96649Martin v. Löwis#endif
485467d4c0e31e9db305a4899a44d7978f83e96649Martin v. Löwis
4965bf9f265e4052c3eee95cd73f8de66bc92e53bfGuido van RossumPyObject *
50f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPySys_GetObject(char *name)
5185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum{
52c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyThreadState *tstate = PyThreadState_GET();
53c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *sd = tstate->interp->sysdict;
54c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (sd == NULL)
55c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
56c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyDict_GetItemString(sd, name);
5785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum}
5885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum
5985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van RossumFILE *
60f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPySys_GetFile(char *name, FILE *def)
6185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum{
62c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    FILE *fp = NULL;
63c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *v = PySys_GetObject(name);
64c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (v != NULL && PyFile_Check(v))
65c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        fp = PyFile_AsFile(v);
66c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (fp == NULL)
67c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        fp = def;
68c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return fp;
6985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum}
7085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum
7185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumint
72f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPySys_SetObject(char *name, PyObject *v)
7385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum{
74c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyThreadState *tstate = PyThreadState_GET();
75c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *sd = tstate->interp->sysdict;
76c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (v == NULL) {
77c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (PyDict_GetItemString(sd, name) == NULL)
78c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return 0;
79c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
80c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return PyDict_DelItemString(sd, name);
81c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
82c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
83c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyDict_SetItemString(sd, name, v);
8485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum}
8585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum
8665bf9f265e4052c3eee95cd73f8de66bc92e53bfGuido van Rossumstatic PyObject *
87e3eb1f2b2320bceb10a763ec8691200b85ec287aMartin v. Löwissys_displayhook(PyObject *self, PyObject *o)
88f68f2fec7df1224a031c3feed8a0ef6028cfcdddMoshe Zadka{
89c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *outf;
90c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyInterpreterState *interp = PyThreadState_GET()->interp;
91c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *modules = interp->modules;
92c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *builtins = PyDict_GetItemString(modules, "__builtin__");
93c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
94c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (builtins == NULL) {
95c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_RuntimeError, "lost __builtin__");
96c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
97c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
98c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
99c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Print value except if None */
100c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* After printing, also assign to '_' */
101c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Before, set '_' to None to avoid recursion */
102c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (o == Py_None) {
103c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(Py_None);
104c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return Py_None;
105c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
106c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyObject_SetAttrString(builtins, "_", Py_None) != 0)
107c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
108c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_FlushLine() != 0)
109c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
110c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    outf = PySys_GetObject("stdout");
111c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (outf == NULL) {
112c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
113c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
114c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
115c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyFile_WriteObject(o, outf, 0) != 0)
116c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
117c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyFile_SoftSpace(outf, 1);
118c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_FlushLine() != 0)
119c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
120c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyObject_SetAttrString(builtins, "_", o) != 0)
121c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
122c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
123c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
124f68f2fec7df1224a031c3feed8a0ef6028cfcdddMoshe Zadka}
125f68f2fec7df1224a031c3feed8a0ef6028cfcdddMoshe Zadka
126a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(displayhook_doc,
127b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee"displayhook(object) -> None\n"
128f68f2fec7df1224a031c3feed8a0ef6028cfcdddMoshe Zadka"\n"
1298af970ab58e371def3779f6dd2fffe0c389c79d4Florent Xicluna"Print an object to sys.stdout and also save it in __builtin__._\n"
130a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
131b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee
132b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yeestatic PyObject *
133b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yeesys_excepthook(PyObject* self, PyObject* args)
134b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee{
135c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *exc, *value, *tb;
136c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb))
137c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
138c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyErr_Display(exc, value, tb);
139c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
140c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
141b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee}
142b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee
143a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(excepthook_doc,
144b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee"excepthook(exctype, value, traceback) -> None\n"
145b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee"\n"
146a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis"Handle an exception by displaying it with a traceback on sys.stderr.\n"
147a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
148f68f2fec7df1224a031c3feed8a0ef6028cfcdddMoshe Zadka
149f68f2fec7df1224a031c3feed8a0ef6028cfcdddMoshe Zadkastatic PyObject *
15046d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossumsys_exc_info(PyObject *self, PyObject *noargs)
151a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum{
152c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyThreadState *tstate;
153c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    tstate = PyThreadState_GET();
154c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_BuildValue(
155c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        "(OOO)",
156c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        tstate->exc_type != NULL ? tstate->exc_type : Py_None,
157c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        tstate->exc_value != NULL ? tstate->exc_value : Py_None,
158c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        tstate->exc_traceback != NULL ?
159c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            tstate->exc_traceback : Py_None);
160a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum}
161a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum
162a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(exc_info_doc,
163c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum"exc_info() -> (type, value, traceback)\n\
164c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
16546d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van RossumReturn information about the most recent exception caught by an except\n\
16646d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossumclause in the current stack frame or in an older stack frame."
16746d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossum);
16846d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossum
16946d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossumstatic PyObject *
17046d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossumsys_exc_clear(PyObject *self, PyObject *noargs)
17146d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossum{
172c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyThreadState *tstate;
173c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *tmp_type, *tmp_value, *tmp_tb;
174c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
175c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyErr_WarnPy3k("sys.exc_clear() not supported in 3.x; "
176c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                       "use except clauses", 1) < 0)
177c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
178c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
179c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    tstate = PyThreadState_GET();
180c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    tmp_type = tstate->exc_type;
181c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    tmp_value = tstate->exc_value;
182c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    tmp_tb = tstate->exc_traceback;
183c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    tstate->exc_type = NULL;
184c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    tstate->exc_value = NULL;
185c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    tstate->exc_traceback = NULL;
186c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(tmp_type);
187c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(tmp_value);
188c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(tmp_tb);
189c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* For b/w compatibility */
190c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PySys_SetObject("exc_type", Py_None);
191c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PySys_SetObject("exc_value", Py_None);
192c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PySys_SetObject("exc_traceback", Py_None);
193c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
194c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
19546d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossum}
19646d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossum
19746d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van RossumPyDoc_STRVAR(exc_clear_doc,
19846d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossum"exc_clear() -> None\n\
19946d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossum\n\
20046d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van RossumClear global information on the current exception.  Subsequent calls to\n\
20146d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossumexc_info() will return (None,None,None) until another exception is raised\n\
20246d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossumin the current thread or the execution stack returns to a frame where\n\
20346d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossumanother exception is being handled."
204a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
205c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum
206a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossumstatic PyObject *
207f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterssys_exit(PyObject *self, PyObject *args)
20885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum{
209c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *exit_code = 0;
210c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
211c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
212c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Raise SystemExit so callers may catch it or clean up. */
213c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyErr_SetObject(PyExc_SystemExit, exit_code);
214c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return NULL;
21585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum}
21685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum
217a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(exit_doc,
218c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum"exit([status])\n\
219c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
220c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van RossumExit the interpreter by raising SystemExit(status).\n\
221c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van RossumIf the status is omitted or None, it defaults to zero (i.e., success).\n\
22208350fb639a54b8977784f09ee1741441650724fEzio MelottiIf the status is an integer, it will be used as the system exit status.\n\
223c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van RossumIf it is another kind of object, it will be printed and the system\n\
224a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwisexit status will be one (i.e., failure)."
225a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
226c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum
227107b7daf5a6ce123cad4ae7d02a12ae1eadcb30bMartin v. Löwis#ifdef Py_USING_UNICODE
228107b7daf5a6ce123cad4ae7d02a12ae1eadcb30bMartin v. Löwis
22965bf9f265e4052c3eee95cd73f8de66bc92e53bfGuido van Rossumstatic PyObject *
230e3eb1f2b2320bceb10a763ec8691200b85ec287aMartin v. Löwissys_getdefaultencoding(PyObject *self)
2318b4d01d9f93068ec08abf62f5307d9391fe6740aFred Drake{
232c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyString_FromString(PyUnicode_GetDefaultEncoding());
2338b4d01d9f93068ec08abf62f5307d9391fe6740aFred Drake}
2348b4d01d9f93068ec08abf62f5307d9391fe6740aFred Drake
235a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(getdefaultencoding_doc,
23699964b86b2e48ba2a1dba3df08ecbd35cab3e1c5Marc-André Lemburg"getdefaultencoding() -> string\n\
2378b4d01d9f93068ec08abf62f5307d9391fe6740aFred Drake\n\
2388b4d01d9f93068ec08abf62f5307d9391fe6740aFred DrakeReturn the current default string encoding used by the Unicode \n\
239a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwisimplementation."
240a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
2418b4d01d9f93068ec08abf62f5307d9391fe6740aFred Drake
2428b4d01d9f93068ec08abf62f5307d9391fe6740aFred Drakestatic PyObject *
243f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterssys_setdefaultencoding(PyObject *self, PyObject *args)
2448b4d01d9f93068ec08abf62f5307d9391fe6740aFred Drake{
245c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *encoding;
246c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding))
247c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
248c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyUnicode_SetDefaultEncoding(encoding))
249c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
250c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
251c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
2528b4d01d9f93068ec08abf62f5307d9391fe6740aFred Drake}
2538b4d01d9f93068ec08abf62f5307d9391fe6740aFred Drake
254a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(setdefaultencoding_doc,
25599964b86b2e48ba2a1dba3df08ecbd35cab3e1c5Marc-André Lemburg"setdefaultencoding(encoding)\n\
2568b4d01d9f93068ec08abf62f5307d9391fe6740aFred Drake\n\
257a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisSet the current default string encoding used by the Unicode implementation."
258a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
2598b4d01d9f93068ec08abf62f5307d9391fe6740aFred Drake
26073d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwisstatic PyObject *
26173d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwissys_getfilesystemencoding(PyObject *self)
26273d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis{
263c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (Py_FileSystemDefaultEncoding)
264c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyString_FromString(Py_FileSystemDefaultEncoding);
265c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
266c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
26773d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis}
26873d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis
26973d538b9c6d2f262a7d615248c84e509ebd64731Martin v. LöwisPyDoc_STRVAR(getfilesystemencoding_doc,
27073d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis"getfilesystemencoding() -> string\n\
27173d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis\n\
27273d538b9c6d2f262a7d615248c84e509ebd64731Martin v. LöwisReturn the encoding used to convert Unicode filenames in\n\
27373d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwisoperating system filenames."
27473d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis);
27573d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis
276339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#endif
277339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis
2785755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake/*
2795755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake * Cached interned string objects used for calling the profile and
2805755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake * trace functions.  Initialized by trace_init().
2815755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake */
282c69ebe8d50529eae281275c841428eb9b375a442Nicholas Bastinstatic PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
2835755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake
2845755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drakestatic int
2855755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Draketrace_init(void)
2865755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake{
287c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    static char *whatnames[7] = {"call", "exception", "line", "return",
288c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                    "c_call", "c_exception", "c_return"};
289c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *name;
290c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i;
291c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; i < 7; ++i) {
292c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (whatstrings[i] == NULL) {
293c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            name = PyString_InternFromString(whatnames[i]);
294c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (name == NULL)
295c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                return -1;
296c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            whatstrings[i] = name;
297c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
298c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
299c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
3005755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake}
3015755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake
3025755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake
3035755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drakestatic PyObject *
3045755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drakecall_trampoline(PyThreadState *tstate, PyObject* callback,
305c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                PyFrameObject *frame, int what, PyObject *arg)
3065755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake{
307c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *args = PyTuple_New(3);
308c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *whatstr;
309c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *result;
310c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
311c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (args == NULL)
312c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
313c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(frame);
314c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    whatstr = whatstrings[what];
315c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(whatstr);
316c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (arg == NULL)
317c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        arg = Py_None;
318c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(arg);
319c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyTuple_SET_ITEM(args, 0, (PyObject *)frame);
320c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyTuple_SET_ITEM(args, 1, whatstr);
321c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyTuple_SET_ITEM(args, 2, arg);
322c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
323c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* call the Python-level function */
324c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyFrame_FastToLocals(frame);
325c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    result = PyEval_CallObject(callback, args);
326c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyFrame_LocalsToFast(frame, 1);
327c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (result == NULL)
328c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyTraceBack_Here(frame);
329c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
330c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* cleanup */
331c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(args);
332c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return result;
3335755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake}
3345755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake
3355755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drakestatic int
3365755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drakeprofile_trampoline(PyObject *self, PyFrameObject *frame,
337c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                   int what, PyObject *arg)
3385755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake{
339c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyThreadState *tstate = frame->f_tstate;
340c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *result;
341c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
342c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (arg == NULL)
343c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        arg = Py_None;
344c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    result = call_trampoline(tstate, self, frame, what, arg);
345c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (result == NULL) {
346c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyEval_SetProfile(NULL, NULL);
347c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
348c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
349c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(result);
350c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
3515755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake}
3525755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake
3535755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drakestatic int
3545755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Draketrace_trampoline(PyObject *self, PyFrameObject *frame,
355c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                 int what, PyObject *arg)
3565755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake{
357c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyThreadState *tstate = frame->f_tstate;
358c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *callback;
359c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *result;
360c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
361c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (what == PyTrace_CALL)
362c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        callback = self;
363c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
364c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        callback = frame->f_trace;
365c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (callback == NULL)
366c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return 0;
367c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    result = call_trampoline(tstate, callback, frame, what, arg);
368c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (result == NULL) {
369c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyEval_SetTrace(NULL, NULL);
37098a9722e4a82b5f7dc0411233bbec892a02c7667Serhiy Storchaka        Py_CLEAR(frame->f_trace);
371c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return -1;
372c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
373c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (result != Py_None) {
374c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *temp = frame->f_trace;
375c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        frame->f_trace = NULL;
376c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_XDECREF(temp);
377c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        frame->f_trace = result;
378c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
379c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
380c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(result);
381c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
382c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return 0;
3835755ce693dfc497389ab89e8ae0e62c3cc89d4ffFred Drake}
384d083839fb4f44ff66792d80f7a71863600ca4638Fred Drake
3858b4d01d9f93068ec08abf62f5307d9391fe6740aFred Drakestatic PyObject *
386f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterssys_settrace(PyObject *self, PyObject *args)
387e2437a191d1498f12cbb6906dfbe4e79c38271adGuido van Rossum{
388c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (trace_init() == -1)
389c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
390c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (args == Py_None)
391c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyEval_SetTrace(NULL, NULL);
392c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
393c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyEval_SetTrace(trace_trampoline, args);
394c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
395c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
396e2437a191d1498f12cbb6906dfbe4e79c38271adGuido van Rossum}
397e2437a191d1498f12cbb6906dfbe4e79c38271adGuido van Rossum
398a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(settrace_doc,
399c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum"settrace(function)\n\
400c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
401c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van RossumSet the global debug tracing function.  It will be called on each\n\
402a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwisfunction call.  See the debugger chapter in the library manual."
403a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
404c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum
40565bf9f265e4052c3eee95cd73f8de66bc92e53bfGuido van Rossumstatic PyObject *
40656112895d69131ee4f34d4e3e9406614313df57fGeorg Brandlsys_gettrace(PyObject *self, PyObject *args)
40756112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl{
408c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyThreadState *tstate = PyThreadState_GET();
409c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *temp = tstate->c_traceobj;
41056112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl
411c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (temp == NULL)
412c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        temp = Py_None;
413c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(temp);
414c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return temp;
41556112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl}
41656112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl
41756112895d69131ee4f34d4e3e9406614313df57fGeorg BrandlPyDoc_STRVAR(gettrace_doc,
41856112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl"gettrace()\n\
41956112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl\n\
42056112895d69131ee4f34d4e3e9406614313df57fGeorg BrandlReturn the global debug tracing function set with sys.settrace.\n\
42156112895d69131ee4f34d4e3e9406614313df57fGeorg BrandlSee the debugger chapter in the library manual."
42256112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl);
42356112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl
42456112895d69131ee4f34d4e3e9406614313df57fGeorg Brandlstatic PyObject *
425f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterssys_setprofile(PyObject *self, PyObject *args)
426e2437a191d1498f12cbb6906dfbe4e79c38271adGuido van Rossum{
427c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (trace_init() == -1)
428c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
429c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (args == Py_None)
430c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyEval_SetProfile(NULL, NULL);
431c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
432c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyEval_SetProfile(profile_trampoline, args);
433c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
434c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
435e2437a191d1498f12cbb6906dfbe4e79c38271adGuido van Rossum}
436e2437a191d1498f12cbb6906dfbe4e79c38271adGuido van Rossum
437a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(setprofile_doc,
438c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum"setprofile(function)\n\
439c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
440c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van RossumSet the profiling function.  It will be called on each function call\n\
441a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwisand return.  See the profiler chapter in the library manual."
442a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
443c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum
44465bf9f265e4052c3eee95cd73f8de66bc92e53bfGuido van Rossumstatic PyObject *
44556112895d69131ee4f34d4e3e9406614313df57fGeorg Brandlsys_getprofile(PyObject *self, PyObject *args)
44656112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl{
447c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyThreadState *tstate = PyThreadState_GET();
448c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *temp = tstate->c_profileobj;
44956112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl
450c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (temp == NULL)
451c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        temp = Py_None;
452c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(temp);
453c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return temp;
45456112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl}
45556112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl
45656112895d69131ee4f34d4e3e9406614313df57fGeorg BrandlPyDoc_STRVAR(getprofile_doc,
45756112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl"getprofile()\n\
45856112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl\n\
45956112895d69131ee4f34d4e3e9406614313df57fGeorg BrandlReturn the profiling function set with sys.setprofile.\n\
46056112895d69131ee4f34d4e3e9406614313df57fGeorg BrandlSee the profiler chapter in the library manual."
46156112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl);
46256112895d69131ee4f34d4e3e9406614313df57fGeorg Brandl
46356112895d69131ee4f34d4e3e9406614313df57fGeorg Brandlstatic PyObject *
464f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterssys_setcheckinterval(PyObject *self, PyObject *args)
465a0d7a233981ce56c74d3fd6a4fb0cadac08a7654Guido van Rossum{
466c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval))
467c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
46819b851d11b04d1490040ff296ebec57dc3d7eecbRaymond Hettinger    _Py_Ticker = _Py_CheckInterval;
469c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
470c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
471a0d7a233981ce56c74d3fd6a4fb0cadac08a7654Guido van Rossum}
472a0d7a233981ce56c74d3fd6a4fb0cadac08a7654Guido van Rossum
473a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(setcheckinterval_doc,
474c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum"setcheckinterval(n)\n\
475c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
476c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van RossumTell the Python interpreter to check for asynchronous events every\n\
477a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwisn instructions.  This also affects how often thread switches occur."
478a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
479c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum
480ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hyltonstatic PyObject *
481e5e065b6699b33244e58b798e7b17b39bf2945a0Tim Peterssys_getcheckinterval(PyObject *self, PyObject *args)
482e5e065b6699b33244e58b798e7b17b39bf2945a0Tim Peters{
483c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromLong(_Py_CheckInterval);
484e5e065b6699b33244e58b798e7b17b39bf2945a0Tim Peters}
485e5e065b6699b33244e58b798e7b17b39bf2945a0Tim Peters
486e5e065b6699b33244e58b798e7b17b39bf2945a0Tim PetersPyDoc_STRVAR(getcheckinterval_doc,
487e5e065b6699b33244e58b798e7b17b39bf2945a0Tim Peters"getcheckinterval() -> current check interval; see setcheckinterval()."
488e5e065b6699b33244e58b798e7b17b39bf2945a0Tim Peters);
489e5e065b6699b33244e58b798e7b17b39bf2945a0Tim Peters
490f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. Löwis#ifdef WITH_TSC
491f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. Löwisstatic PyObject *
492f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. Löwissys_settscdump(PyObject *self, PyObject *args)
493f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. Löwis{
494c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int bool;
495c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyThreadState *tstate = PyThreadState_Get();
496c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
497c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "i:settscdump", &bool))
498c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
499c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (bool)
500c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        tstate->interp->tscdump = 1;
501c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else
502c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        tstate->interp->tscdump = 0;
503c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
504c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
505216b78bdaac9e538ee278b082c9fe0aeecc5f225Tim Peters
506f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. Löwis}
507f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. Löwis
508216b78bdaac9e538ee278b082c9fe0aeecc5f225Tim PetersPyDoc_STRVAR(settscdump_doc,
509f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. Löwis"settscdump(bool)\n\
510f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. Löwis\n\
511f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. LöwisIf true, tell the Python interpreter to dump VM measurements to\n\
512f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. Löwisstderr.  If false, turn off dump.  The measurements are based on the\n\
513800ba2375a970ca6095465021aa4d8e72279cd9fMichael W. Hudsonprocessor's time-stamp counter."
514216b78bdaac9e538ee278b082c9fe0aeecc5f225Tim Peters);
5150f5aed4e41d1df04ffd004747fc0da4ace16350fNeal Norwitz#endif /* TSC */
516f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. Löwis
517e5e065b6699b33244e58b798e7b17b39bf2945a0Tim Petersstatic PyObject *
518ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hyltonsys_setrecursionlimit(PyObject *self, PyObject *args)
519ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hylton{
520c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int new_limit;
521c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
522c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
523c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (new_limit <= 0) {
524c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_ValueError,
525c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "recursion limit must be positive");
526c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
527c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
528c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_SetRecursionLimit(new_limit);
529c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
530c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
531ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hylton}
532ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hylton
533a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(setrecursionlimit_doc,
534ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hylton"setrecursionlimit(n)\n\
535ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hylton\n\
536ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy HyltonSet the maximum depth of the Python interpreter stack to n.  This\n\
537ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hyltonlimit prevents infinite recursion from causing an overflow of the C\n\
538ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hyltonstack and crashing Python.  The highest possible limit is platform-\n\
539a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwisdependent."
540a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
541ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hylton
542ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hyltonstatic PyObject *
543e3eb1f2b2320bceb10a763ec8691200b85ec287aMartin v. Löwissys_getrecursionlimit(PyObject *self)
544ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hylton{
545c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromLong(Py_GetRecursionLimit());
546ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hylton}
547ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hylton
548a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(getrecursionlimit_doc,
549ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hylton"getrecursionlimit()\n\
550ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hylton\n\
551ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy HyltonReturn the current value of the recursion limit, the maximum depth\n\
552ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hyltonof the Python interpreter stack.  This limit prevents infinite\n\
553e739a0dbe9747c6751b82c805bdf186e115208abJack Jansenrecursion from causing an overflow of the C stack and crashing Python."
554a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
555ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hylton
5568696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond#ifdef MS_WINDOWS
5578696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark HammondPyDoc_STRVAR(getwindowsversion_doc,
5588696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond"getwindowsversion()\n\
5598696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond\n\
560ee931b7253fe332125dad0b7ba1681bdebb0a575Eric SmithReturn information about the running version of Windows as a named tuple.\n\
561ee931b7253fe332125dad0b7ba1681bdebb0a575Eric SmithThe members are named: major, minor, build, platform, service_pack,\n\
562ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smithservice_pack_major, service_pack_minor, suite_mask, and product_type. For\n\
56324b07bcba350bb86c4d6ca446e1564647a199868Ezio Melottibackward compatibility, only the first 5 items are available by indexing.\n\
564ee931b7253fe332125dad0b7ba1681bdebb0a575Eric SmithAll elements are numbers, except service_pack which is a string. Platform\n\
565ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smithmay be 0 for win32s, 1 for Windows 9x/ME, 2 for Windows NT/2000/XP/Vista/7,\n\
566ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smith3 for Windows CE. Product_type may be 1 for a workstation, 2 for a domain\n\
567ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smithcontroller, 3 for a server."
5688696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond);
5698696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond
570ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smithstatic PyTypeObject WindowsVersionType = {0, 0, 0, 0, 0, 0};
571ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smith
572ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smithstatic PyStructSequence_Field windows_version_fields[] = {
573c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"major", "Major version number"},
574c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"minor", "Minor version number"},
575c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"build", "Build number"},
576c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"platform", "Operating system platform"},
577c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"service_pack", "Latest Service Pack installed on the system"},
578c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"service_pack_major", "Service Pack major version number"},
579c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"service_pack_minor", "Service Pack minor version number"},
580c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"suite_mask", "Bit mask identifying available product suites"},
581c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"product_type", "System product type"},
582c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {0}
583ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smith};
584ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smith
585ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smithstatic PyStructSequence_Desc windows_version_desc = {
586c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    "sys.getwindowsversion",  /* name */
587c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    getwindowsversion_doc,    /* doc */
588c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    windows_version_fields,   /* fields */
589c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    5                         /* For backward compatibility,
590c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                 only the first 5 items are accessible
591c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                 via indexing, the rest are name only */
592ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smith};
593ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smith
5948696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammondstatic PyObject *
5958696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammondsys_getwindowsversion(PyObject *self)
5968696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond{
597c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *version;
598c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int pos = 0;
599c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    OSVERSIONINFOEX ver;
600c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ver.dwOSVersionInfoSize = sizeof(ver);
601c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!GetVersionEx((OSVERSIONINFO*) &ver))
602c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return PyErr_SetFromWindowsErr(0);
603c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
604c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    version = PyStructSequence_New(&WindowsVersionType);
605c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (version == NULL)
606c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
607c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
608c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwMajorVersion));
609c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwMinorVersion));
610c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwBuildNumber));
611c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.dwPlatformId));
612c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyStructSequence_SET_ITEM(version, pos++, PyString_FromString(ver.szCSDVersion));
613c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wServicePackMajor));
614c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wServicePackMinor));
615c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wSuiteMask));
616c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyStructSequence_SET_ITEM(version, pos++, PyInt_FromLong(ver.wProductType));
617c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
61815df36bb14e35489d841898069e3878f2144e48eSerhiy Storchaka    if (PyErr_Occurred()) {
61915df36bb14e35489d841898069e3878f2144e48eSerhiy Storchaka        Py_DECREF(version);
62015df36bb14e35489d841898069e3878f2144e48eSerhiy Storchaka        return NULL;
62115df36bb14e35489d841898069e3878f2144e48eSerhiy Storchaka    }
622c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return version;
6238696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond}
6248696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond
6258696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond#endif /* MS_WINDOWS */
6268696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond
627f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis#ifdef HAVE_DLOPEN
628f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwisstatic PyObject *
629f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwissys_setdlopenflags(PyObject *self, PyObject *args)
630f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis{
631c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int new_val;
632c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyThreadState *tstate = PyThreadState_GET();
633c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
634c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
635c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!tstate)
636c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
637c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    tstate->interp->dlopenflags = new_val;
638c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
639c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
640f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis}
641f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis
642a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(setdlopenflags_doc,
643f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis"setdlopenflags(n) -> None\n\
644f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis\n\
6457274cffa9e038ddef9ced658165014629ef3e715Alexandre VassalottiSet the flags used by the interpreter for dlopen calls, such as when the\n\
6467274cffa9e038ddef9ced658165014629ef3e715Alexandre Vassalottiinterpreter loads extension modules.  Among other things, this will enable\n\
6477274cffa9e038ddef9ced658165014629ef3e715Alexandre Vassalottia lazy resolving of symbols when importing a module, if called as\n\
6487274cffa9e038ddef9ced658165014629ef3e715Alexandre Vassalottisys.setdlopenflags(0).  To share symbols across extension modules, call as\n\
6497274cffa9e038ddef9ced658165014629ef3e715Alexandre Vassalottisys.setdlopenflags(ctypes.RTLD_GLOBAL).  Symbolic names for the flag modules\n\
6507274cffa9e038ddef9ced658165014629ef3e715Alexandre Vassalottican be either found in the ctypes module, or in the DLFCN module. If DLFCN\n\
6517274cffa9e038ddef9ced658165014629ef3e715Alexandre Vassalottiis not available, it can be generated from /usr/include/dlfcn.h using the\n\
6527274cffa9e038ddef9ced658165014629ef3e715Alexandre Vassalottih2py script.");
653f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis
654f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwisstatic PyObject *
655f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwissys_getdlopenflags(PyObject *self, PyObject *args)
656f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis{
657c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyThreadState *tstate = PyThreadState_GET();
658c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!tstate)
659c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
660c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromLong(tstate->interp->dlopenflags);
661f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis}
662f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis
663a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(getdlopenflags_doc,
664f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis"getdlopenflags() -> int\n\
665f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis\n\
6667274cffa9e038ddef9ced658165014629ef3e715Alexandre VassalottiReturn the current value of the flags that are used for dlopen calls.\n\
6677274cffa9e038ddef9ced658165014629ef3e715Alexandre VassalottiThe flag constants are defined in the ctypes and DLFCN modules.");
6687274cffa9e038ddef9ced658165014629ef3e715Alexandre Vassalotti
669c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#endif  /* HAVE_DLOPEN */
670f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis
67114b4adbd3365354f13b6a8a5f07a975a59ff1e34Guido van Rossum#ifdef USE_MALLOPT
67214b4adbd3365354f13b6a8a5f07a975a59ff1e34Guido van Rossum/* Link with -lmalloc (or -lmpc) on an SGI */
67314b4adbd3365354f13b6a8a5f07a975a59ff1e34Guido van Rossum#include <malloc.h>
67414b4adbd3365354f13b6a8a5f07a975a59ff1e34Guido van Rossum
67565bf9f265e4052c3eee95cd73f8de66bc92e53bfGuido van Rossumstatic PyObject *
676f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterssys_mdebug(PyObject *self, PyObject *args)
67714b4adbd3365354f13b6a8a5f07a975a59ff1e34Guido van Rossum{
678c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int flag;
679c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
680c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
681c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    mallopt(M_DEBUG, flag);
682c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(Py_None);
683c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return Py_None;
68414b4adbd3365354f13b6a8a5f07a975a59ff1e34Guido van Rossum}
68514b4adbd3365354f13b6a8a5f07a975a59ff1e34Guido van Rossum#endif /* USE_MALLOPT */
68614b4adbd3365354f13b6a8a5f07a975a59ff1e34Guido van Rossum
687c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchakasize_t
688c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka_PySys_GetSizeOf(PyObject *o)
68951df0647672bc758da6d58eecfe45da9dc5913dfRobert Schuppenies{
690c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka    static PyObject *str__sizeof__ = NULL;
691c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *res = NULL;
692f9b2aa2efed3374df55fe945922f67a322a5d695Serhiy Storchaka    Py_ssize_t size;
693c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
694c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Make sure the type is initialized. float gets initialized late */
695c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyType_Ready(Py_TYPE(o)) < 0)
696c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka        return (size_t)-1;
697c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
698c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Instance of old-style class */
699c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyInstance_Check(o))
700c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka        size = PyInstance_Type.tp_basicsize;
701c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* all other objects */
702c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
703c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *method = _PyObject_LookupSpecial(o, "__sizeof__",
704c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                                   &str__sizeof__);
705c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (method == NULL) {
706c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (!PyErr_Occurred())
707c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                PyErr_Format(PyExc_TypeError,
708c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                             "Type %.100s doesn't define __sizeof__",
709c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                             Py_TYPE(o)->tp_name);
710c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
711c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else {
712c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            res = PyObject_CallFunctionObjArgs(method, NULL);
713c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(method);
714c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
715c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
716c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka        if (res == NULL)
717c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka            return (size_t)-1;
718c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka
719c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka        size = (size_t)PyInt_AsSsize_t(res);
720c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka        Py_DECREF(res);
721f9b2aa2efed3374df55fe945922f67a322a5d695Serhiy Storchaka        if (size == -1 && PyErr_Occurred())
722c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka            return (size_t)-1;
723c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
724c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
725f9b2aa2efed3374df55fe945922f67a322a5d695Serhiy Storchaka    if (size < 0) {
726f9b2aa2efed3374df55fe945922f67a322a5d695Serhiy Storchaka        PyErr_SetString(PyExc_ValueError, "__sizeof__() should return >= 0");
727f9b2aa2efed3374df55fe945922f67a322a5d695Serhiy Storchaka        return (size_t)-1;
728f9b2aa2efed3374df55fe945922f67a322a5d695Serhiy Storchaka    }
729f9b2aa2efed3374df55fe945922f67a322a5d695Serhiy Storchaka
730c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* add gc_head size */
731c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka    if (PyObject_IS_GC(o))
732f9b2aa2efed3374df55fe945922f67a322a5d695Serhiy Storchaka        return ((size_t)size) + sizeof(PyGC_Head);
733f9b2aa2efed3374df55fe945922f67a322a5d695Serhiy Storchaka    return (size_t)size;
734c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka}
735c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka
736c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchakastatic PyObject *
737c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchakasys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
738c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka{
739c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka    static char *kwlist[] = {"object", "default", 0};
740c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka    size_t size;
741c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka    PyObject *o, *dflt = NULL;
742c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka
743c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",
744c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka                                     kwlist, &o, &dflt))
745c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka        return NULL;
746c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka
747c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka    size = _PySys_GetSizeOf(o);
748c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka
749c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka    if (size == (size_t)-1 && PyErr_Occurred()) {
750c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka        /* Has a default value been given */
751c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka        if (dflt != NULL && PyErr_ExceptionMatches(PyExc_TypeError)) {
752c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka            PyErr_Clear();
753c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka            Py_INCREF(dflt);
754c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka            return dflt;
755c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka        }
756c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka        else
757c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka            return NULL;
758c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
759c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka
760c95f51a9530440826d6cd8984183eaae8b4bb84cSerhiy Storchaka    return PyInt_FromSize_t(size);
76151df0647672bc758da6d58eecfe45da9dc5913dfRobert Schuppenies}
76251df0647672bc758da6d58eecfe45da9dc5913dfRobert Schuppenies
76351df0647672bc758da6d58eecfe45da9dc5913dfRobert SchuppeniesPyDoc_STRVAR(getsizeof_doc,
764476290299885a87b8b90b55bbfef067945e63913Robert Schuppenies"getsizeof(object, default) -> int\n\
76551df0647672bc758da6d58eecfe45da9dc5913dfRobert Schuppenies\n\
76651df0647672bc758da6d58eecfe45da9dc5913dfRobert SchuppeniesReturn the size of object in bytes.");
76751df0647672bc758da6d58eecfe45da9dc5913dfRobert Schuppenies
76851df0647672bc758da6d58eecfe45da9dc5913dfRobert Schuppeniesstatic PyObject *
769a768882b0000852539a312c939d69ab9f08f62aeFred Drakesys_getrefcount(PyObject *self, PyObject *arg)
7706ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender{
771c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromSsize_t(arg->ob_refcnt);
7726ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender}
7736ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender
7744be93d0e848ca2dc55f119a7b0eb31fb995d7d33Tim Peters#ifdef Py_REF_DEBUG
775440d89823020b71d7659fcd357c24549ce815b4cMark Hammondstatic PyObject *
776e3eb1f2b2320bceb10a763ec8691200b85ec287aMartin v. Löwissys_gettotalrefcount(PyObject *self)
777440d89823020b71d7659fcd357c24549ce815b4cMark Hammond{
778c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return PyInt_FromSsize_t(_Py_GetRefTotal());
779440d89823020b71d7659fcd357c24549ce815b4cMark Hammond}
780e170937af6463d92e95cea907964a23dff521f31Armin Rigo#endif /* Py_REF_DEBUG */
781440d89823020b71d7659fcd357c24549ce815b4cMark Hammond
782a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(getrefcount_doc,
783c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum"getrefcount(object) -> integer\n\
784c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
785ba3ff1ba7ba9b3920bafc1722c62b8abdb77b93cFred DrakeReturn the reference count of object.  The count returned is generally\n\
786ba3ff1ba7ba9b3920bafc1722c62b8abdb77b93cFred Drakeone higher than you might expect, because it includes the (temporary)\n\
787ba3ff1ba7ba9b3920bafc1722c62b8abdb77b93cFred Drakereference as an argument to getrefcount()."
788a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
789c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum
7906ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender#ifdef COUNT_ALLOCS
7916ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullenderstatic PyObject *
792e3eb1f2b2320bceb10a763ec8691200b85ec287aMartin v. Löwissys_getcounts(PyObject *self)
7936ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender{
794c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    extern PyObject *get_counts(void);
7956ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender
796c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return get_counts();
7976ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender}
7986ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender#endif
7996ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender
800a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STRVAR(getframe_doc,
801b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsaw"_getframe([depth]) -> frameobject\n\
802b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsaw\n\
803b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry WarsawReturn a frame object from the call stack.  If optional integer depth is\n\
804b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsawgiven, return the frame object that many calls below the top of the stack.\n\
805b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry WarsawIf that is deeper than the call stack, ValueError is raised.  The default\n\
806b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsawfor depth is zero, returning the frame at the top of the call stack.\n\
807b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsaw\n\
808b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry WarsawThis function should be used for internal and specialized\n\
809a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwispurposes only."
810a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis);
811b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsaw
812b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsawstatic PyObject *
813b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsawsys_getframe(PyObject *self, PyObject *args)
814b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsaw{
815c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyFrameObject *f = PyThreadState_GET()->frame;
816c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int depth = -1;
817c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
818c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "|i:_getframe", &depth))
819c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
820c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
821c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    while (depth > 0 && f != NULL) {
822c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        f = f->f_back;
823c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        --depth;
824c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
825c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (f == NULL) {
826c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyErr_SetString(PyExc_ValueError,
827c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        "call stack is not deep enough");
828c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
829c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
830c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_INCREF(f);
831c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return (PyObject*)f;
832b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsaw}
833b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsaw
83432a8361f2da758c1de662b6d5a1b780466e18cf9Tim PetersPyDoc_STRVAR(current_frames_doc,
83532a8361f2da758c1de662b6d5a1b780466e18cf9Tim Peters"_current_frames() -> dictionary\n\
83632a8361f2da758c1de662b6d5a1b780466e18cf9Tim Peters\n\
83732a8361f2da758c1de662b6d5a1b780466e18cf9Tim PetersReturn a dictionary mapping each current thread T's thread id to T's\n\
83832a8361f2da758c1de662b6d5a1b780466e18cf9Tim Peterscurrent stack frame.\n\
83932a8361f2da758c1de662b6d5a1b780466e18cf9Tim Peters\n\
84032a8361f2da758c1de662b6d5a1b780466e18cf9Tim PetersThis function should be used for specialized purposes only."
84132a8361f2da758c1de662b6d5a1b780466e18cf9Tim Peters);
84232a8361f2da758c1de662b6d5a1b780466e18cf9Tim Peters
84332a8361f2da758c1de662b6d5a1b780466e18cf9Tim Petersstatic PyObject *
84432a8361f2da758c1de662b6d5a1b780466e18cf9Tim Peterssys_current_frames(PyObject *self, PyObject *noargs)
84532a8361f2da758c1de662b6d5a1b780466e18cf9Tim Peters{
846c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return _PyThread_CurrentFrames();
84732a8361f2da758c1de662b6d5a1b780466e18cf9Tim Peters}
84832a8361f2da758c1de662b6d5a1b780466e18cf9Tim Peters
849a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van RossumPyDoc_STRVAR(call_tracing_doc,
850a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van Rossum"call_tracing(func, args) -> object\n\
851a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van Rossum\n\
852a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van RossumCall func(*args), while tracing is enabled.  The tracing state is\n\
853a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van Rossumsaved, and restored afterwards.  This is intended to be called from\n\
854a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van Rossuma debugger from a checkpoint, to recursively debug some other code."
855a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van Rossum);
856a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van Rossum
857a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van Rossumstatic PyObject *
858a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van Rossumsys_call_tracing(PyObject *self, PyObject *args)
859a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van Rossum{
860c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *func, *funcargs;
861c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (!PyArg_ParseTuple(args, "OO!:call_tracing", &func, &PyTuple_Type, &funcargs))
862c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
863c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return _PyEval_CallTracing(func, funcargs);
864a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van Rossum}
865a12fe4e81fa3221458e16225e76ec7b8a05820eeGuido van Rossum
866985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy HyltonPyDoc_STRVAR(callstats_doc,
867985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton"callstats() -> tuple of integers\n\
868985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton\n\
869985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy HyltonReturn a tuple of function call statistics, if CALL_PROFILE was defined\n\
870985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hyltonwhen Python was built.  Otherwise, return None.\n\
871985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton\n\
872985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy HyltonWhen enabled, this function returns detailed, implementation-specific\n\
873985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hyltondetails about the number of function calls executed. The return value is\n\
874985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hyltona 11-tuple where the entries in the tuple are counts of:\n\
875985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton0. all function calls\n\
876985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton1. calls to PyFunction_Type objects\n\
877985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton2. PyFunction calls that do not create an argument tuple\n\
878985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton3. PyFunction calls that do not create an argument tuple\n\
879985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton   and bypass PyEval_EvalCodeEx()\n\
880985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton4. PyMethod calls\n\
881985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton5. PyMethod calls on bound methods\n\
882985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton6. PyType calls\n\
883985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton7. PyCFunction calls\n\
884985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton8. generator calls\n\
885985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton9. All other calls\n\
886985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton10. Number of stack pops performed by call_function()"
887985eba53f5d1ac45037fbf19b6955c74823c1dedJeremy Hylton);
888b6a54d2a2cd0537be8e013a96068a8ffeaee5847Barry Warsaw
88953a6d1de831a4d25cebf7b957b52c42d1e9e8bdbSkip Montanaro#ifdef __cplusplus
89053a6d1de831a4d25cebf7b957b52c42d1e9e8bdbSkip Montanaroextern "C" {
89153a6d1de831a4d25cebf7b957b52c42d1e9e8bdbSkip Montanaro#endif
89253a6d1de831a4d25cebf7b957b52c42d1e9e8bdbSkip Montanaro
8937f3f2c1819ca3bd126c4793384dea811fcefc250Guido van Rossum#ifdef Py_TRACE_REFS
894ded690fc351ecaf0f72429107fa726a9916ab0f6Guido van Rossum/* Defined in objects.c because it uses static globals if that file */
895dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersextern PyObject *_Py_GetObjects(PyObject *, PyObject *);
8966ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender#endif
897ded690fc351ecaf0f72429107fa726a9916ab0f6Guido van Rossum
89843f1b8d6e4813f171d74c3c5e2c495e041afabefGuido van Rossum#ifdef DYNAMIC_EXECUTION_PROFILE
89943f1b8d6e4813f171d74c3c5e2c495e041afabefGuido van Rossum/* Defined in ceval.c because it uses static globals if that file */
900dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersextern PyObject *_Py_GetDXProfile(PyObject *,  PyObject *);
90143f1b8d6e4813f171d74c3c5e2c495e041afabefGuido van Rossum#endif
90243f1b8d6e4813f171d74c3c5e2c495e041afabefGuido van Rossum
90353a6d1de831a4d25cebf7b957b52c42d1e9e8bdbSkip Montanaro#ifdef __cplusplus
90453a6d1de831a4d25cebf7b957b52c42d1e9e8bdbSkip Montanaro}
90553a6d1de831a4d25cebf7b957b52c42d1e9e8bdbSkip Montanaro#endif
90653a6d1de831a4d25cebf7b957b52c42d1e9e8bdbSkip Montanaro
907422051a3675271e179995ad4a0f056ff94395d55Christian Heimesstatic PyObject *
908422051a3675271e179995ad4a0f056ff94395d55Christian Heimessys_clear_type_cache(PyObject* self, PyObject* args)
909422051a3675271e179995ad4a0f056ff94395d55Christian Heimes{
910c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyType_ClearCache();
911c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_RETURN_NONE;
912422051a3675271e179995ad4a0f056ff94395d55Christian Heimes}
913422051a3675271e179995ad4a0f056ff94395d55Christian Heimes
914422051a3675271e179995ad4a0f056ff94395d55Christian HeimesPyDoc_STRVAR(sys_clear_type_cache__doc__,
915422051a3675271e179995ad4a0f056ff94395d55Christian Heimes"_clear_type_cache() -> None\n\
916422051a3675271e179995ad4a0f056ff94395d55Christian HeimesClear the internal type lookup cache.");
917422051a3675271e179995ad4a0f056ff94395d55Christian Heimes
918422051a3675271e179995ad4a0f056ff94395d55Christian Heimes
91965bf9f265e4052c3eee95cd73f8de66bc92e53bfGuido van Rossumstatic PyMethodDef sys_methods[] = {
920c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Might as well keep this in alphabetic order */
921c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS,
922c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     callstats_doc},
923c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"_clear_type_cache",       sys_clear_type_cache,     METH_NOARGS,
924c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     sys_clear_type_cache__doc__},
925c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"_current_frames", sys_current_frames, METH_NOARGS,
926c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     current_frames_doc},
927c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"displayhook",     sys_displayhook, METH_O, displayhook_doc},
928c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"exc_info",        sys_exc_info, METH_NOARGS, exc_info_doc},
929c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"exc_clear",       sys_exc_clear, METH_NOARGS, exc_clear_doc},
930c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"excepthook",      sys_excepthook, METH_VARARGS, excepthook_doc},
931c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"exit",            sys_exit, METH_VARARGS, exit_doc},
932339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#ifdef Py_USING_UNICODE
933c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding,
934c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     METH_NOARGS, getdefaultencoding_doc},
935339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#endif
936f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis#ifdef HAVE_DLOPEN
937c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
938c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     getdlopenflags_doc},
939f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis#endif
9406ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender#ifdef COUNT_ALLOCS
941c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"getcounts",       (PyCFunction)sys_getcounts, METH_NOARGS},
9426ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender#endif
94343f1b8d6e4813f171d74c3c5e2c495e041afabefGuido van Rossum#ifdef DYNAMIC_EXECUTION_PROFILE
944c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"getdxp",          _Py_GetDXProfile, METH_VARARGS},
94543f1b8d6e4813f171d74c3c5e2c495e041afabefGuido van Rossum#endif
94673d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#ifdef Py_USING_UNICODE
947c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding,
948c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     METH_NOARGS, getfilesystemencoding_doc},
94973d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#endif
9507f3f2c1819ca3bd126c4793384dea811fcefc250Guido van Rossum#ifdef Py_TRACE_REFS
951c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"getobjects",      _Py_GetObjects, METH_VARARGS},
9524be93d0e848ca2dc55f119a7b0eb31fb995d7d33Tim Peters#endif
9534be93d0e848ca2dc55f119a7b0eb31fb995d7d33Tim Peters#ifdef Py_REF_DEBUG
954c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
9556ec3c653da9ffd098f522261d5592e64ff8e7889Sjoerd Mullender#endif
956c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"getrefcount",     (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc},
957c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
958c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     getrecursionlimit_doc},
959c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"getsizeof",   (PyCFunction)sys_getsizeof,
960c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     METH_VARARGS | METH_KEYWORDS, getsizeof_doc},
961c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"_getframe", sys_getframe, METH_VARARGS, getframe_doc},
9628696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond#ifdef MS_WINDOWS
963c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS,
964c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     getwindowsversion_doc},
9658696ebcd28d38f74ee0ffa2cd82d9db1c0bad8dfMark Hammond#endif /* MS_WINDOWS */
96614b4adbd3365354f13b6a8a5f07a975a59ff1e34Guido van Rossum#ifdef USE_MALLOPT
967c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"mdebug",          sys_mdebug, METH_VARARGS},
96814b4adbd3365354f13b6a8a5f07a975a59ff1e34Guido van Rossum#endif
969339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#ifdef Py_USING_UNICODE
970c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
971c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     setdefaultencoding_doc},
972339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#endif
973c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"setcheckinterval",        sys_setcheckinterval, METH_VARARGS,
974c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     setcheckinterval_doc},
975c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"getcheckinterval",        sys_getcheckinterval, METH_NOARGS,
976c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     getcheckinterval_doc},
977f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis#ifdef HAVE_DLOPEN
978c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"setdlopenflags", sys_setdlopenflags, METH_VARARGS,
979c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     setdlopenflags_doc},
980f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwis#endif
981c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"setprofile",      sys_setprofile, METH_O, setprofile_doc},
982c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"getprofile",      sys_getprofile, METH_NOARGS, getprofile_doc},
983c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
984c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     setrecursionlimit_doc},
985f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. Löwis#ifdef WITH_TSC
986c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc},
987f30d60edbc0d5047a2fdd01e25868e4b814107e2Martin v. Löwis#endif
988c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"settrace",        sys_settrace, METH_O, settrace_doc},
989c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"gettrace",        sys_gettrace, METH_NOARGS, gettrace_doc},
990c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
991c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {NULL,              NULL}           /* sentinel */
9923f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum};
9933f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum
99465bf9f265e4052c3eee95cd73f8de66bc92e53bfGuido van Rossumstatic PyObject *
995f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterslist_builtin_module_names(void)
99634679b7661873ec65e5157ddd1ea2be8269632d0Guido van Rossum{
997c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *list = PyList_New(0);
998c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i;
999c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (list == NULL)
1000c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1001c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1002c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *name = PyString_FromString(
1003c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyImport_Inittab[i].name);
1004c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (name == NULL)
1005c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
1006c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyList_Append(list, name);
1007c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(name);
1008c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1009c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyList_Sort(list) != 0) {
1010c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(list);
1011c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        list = NULL;
1012c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1013c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (list) {
1014c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *v = PyList_AsTuple(list);
1015c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(list);
1016c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        list = v;
1017c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1018c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return list;
101934679b7661873ec65e5157ddd1ea2be8269632d0Guido van Rossum}
102034679b7661873ec65e5157ddd1ea2be8269632d0Guido van Rossum
102123fff911a2e0185d3f4618cd02a7b051b55fdd7eGuido van Rossumstatic PyObject *warnoptions = NULL;
102223fff911a2e0185d3f4618cd02a7b051b55fdd7eGuido van Rossum
102323fff911a2e0185d3f4618cd02a7b051b55fdd7eGuido van Rossumvoid
102423fff911a2e0185d3f4618cd02a7b051b55fdd7eGuido van RossumPySys_ResetWarnOptions(void)
102523fff911a2e0185d3f4618cd02a7b051b55fdd7eGuido van Rossum{
1026c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (warnoptions == NULL || !PyList_Check(warnoptions))
1027c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return;
1028c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
102923fff911a2e0185d3f4618cd02a7b051b55fdd7eGuido van Rossum}
103023fff911a2e0185d3f4618cd02a7b051b55fdd7eGuido van Rossum
103123fff911a2e0185d3f4618cd02a7b051b55fdd7eGuido van Rossumvoid
103223fff911a2e0185d3f4618cd02a7b051b55fdd7eGuido van RossumPySys_AddWarnOption(char *s)
103323fff911a2e0185d3f4618cd02a7b051b55fdd7eGuido van Rossum{
1034c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *str;
1035c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1036c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (warnoptions == NULL || !PyList_Check(warnoptions)) {
1037c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_XDECREF(warnoptions);
1038c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        warnoptions = PyList_New(0);
1039c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (warnoptions == NULL)
1040c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return;
1041c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1042c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    str = PyString_FromString(s);
1043c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (str != NULL) {
1044c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyList_Append(warnoptions, str);
1045c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(str);
1046c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
104723fff911a2e0185d3f4618cd02a7b051b55fdd7eGuido van Rossum}
104823fff911a2e0185d3f4618cd02a7b051b55fdd7eGuido van Rossum
1049e9746890388178bb1e4cdad3c0586bf1862c3727Brett Cannonint
1050e9746890388178bb1e4cdad3c0586bf1862c3727Brett CannonPySys_HasWarnOptions(void)
1051e9746890388178bb1e4cdad3c0586bf1862c3727Brett Cannon{
105240f0a87666b7a6b76d247e00c7623919feeff1cfBrett Cannon    return (warnoptions != NULL && (PyList_Size(warnoptions) > 0)) ? 1 : 0;
1053e9746890388178bb1e4cdad3c0586bf1862c3727Brett Cannon}
1054e9746890388178bb1e4cdad3c0586bf1862c3727Brett Cannon
105540552d0857486782bb5be8f85d6f59375ca6d0b2Guido van Rossum/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
105640552d0857486782bb5be8f85d6f59375ca6d0b2Guido van Rossum   Two literals concatenated works just fine.  If you have a K&R compiler
105740552d0857486782bb5be8f85d6f59375ca6d0b2Guido van Rossum   or other abomination that however *does* understand longer strings,
105840552d0857486782bb5be8f85d6f59375ca6d0b2Guido van Rossum   get rid of the !!! comment in the middle and the quotes that surround it. */
1059a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_VAR(sys_doc) =
1060a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STR(
1061c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum"This module provides access to some objects used or maintained by the\n\
1062c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossuminterpreter and to functions that interact strongly with the interpreter.\n\
1063c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
1064c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van RossumDynamic objects:\n\
1065c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
1066c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumargv -- command line arguments; argv[0] is the script pathname if known\n\
1067c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumpath -- module search path; path[0] is the script directory, else ''\n\
1068c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossummodules -- dictionary of loaded modules\n\
1069b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee\n\
1070b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yeedisplayhook -- called to show results in an interactive session\n\
1071b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yeeexcepthook -- called to handle any uncaught exception other than SystemExit\n\
1072b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee  To customize printing in an interactive session or to install a custom\n\
1073b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee  top-level exception handler, assign other functions to replace these.\n\
1074b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee\n\
1075b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yeeexitfunc -- if sys.exitfunc exists, this routine is called when Python exits\n\
1076b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee  Assigning to sys.exitfunc is deprecated; use the atexit module instead.\n\
1077c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
1078c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumstdin -- standard input file object; used by raw_input() and input()\n\
1079c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumstdout -- standard output file object; used by the print statement\n\
1080c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumstderr -- standard error object; used for error messages\n\
1081b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee  By assigning other file objects (or objects that behave like files)\n\
1082b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee  to these, it is possible to redirect all of the interpreter's I/O.\n\
1083c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
1084c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumlast_type -- type of last uncaught exception\n\
1085c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumlast_value -- value of last uncaught exception\n\
1086c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumlast_traceback -- traceback of last uncaught exception\n\
1087c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum  These three are only available in an interactive session after a\n\
1088c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum  traceback has been printed.\n\
1089c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
1090c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumexc_type -- type of exception currently being handled\n\
1091c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumexc_value -- value of exception currently being handled\n\
1092c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumexc_traceback -- traceback of exception currently being handled\n\
1093c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum  The function exc_info() should be used instead of these three,\n\
1094c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum  because it is thread-safe.\n\
1095a71b5f4e1d39cda3d78a20a1c41056d362c56630Guido van Rossum"
1096a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis)
1097b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee/* concatenating string here */
1098a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STR(
1099a71b5f4e1d39cda3d78a20a1c41056d362c56630Guido van Rossum"\n\
1100c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van RossumStatic objects:\n\
1101c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
1102efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinsonfloat_info -- a dict with information about the float inplementation.\n\
1103efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinsonlong_info -- a struct sequence with information about the long implementation.\n\
1104c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossummaxint -- the largest supported integer (the smallest is -maxint-1)\n\
11054dd019fde36b53b30e69a2ce9cee3f2f9f25c2a6Martin v. Löwismaxsize -- the largest supported length of containers.\n\
1106ce9b5a55e164f1128756478b6a2bb548abec1980Martin v. Löwismaxunicode -- the largest supported character\n\
11072a47c0fa23a3b84d767ee846f93f98aee7e2f5c3Neal Norwitzbuiltin_module_names -- tuple of module names built into this interpreter\n\
1108801c08d700c16296dccd8f9fa31979d3ed052751Fred Drakeversion -- the version of this interpreter as a string\n\
110981fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smithversion_info -- version information as a named tuple\n\
1110801c08d700c16296dccd8f9fa31979d3ed052751Fred Drakehexversion -- version information encoded as a single integer\n\
1111c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumcopyright -- copyright notice pertaining to this interpreter\n\
1112c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumplatform -- platform identifier\n\
1113fe6f9d0edc8dc6dd7e51317c8f9788fdd5eeff50Petri Lehtinenexecutable -- absolute path of the executable binary of the Python interpreter\n\
1114c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumprefix -- prefix used to find the Python library\n\
1115c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumexec_prefix -- prefix used to find the machine-specific Python library\n\
1116da8652d920210a5ff783a7ad30f4c24d2b5ff2a2Mark Dickinsonfloat_repr_style -- string indicating the style of repr() output for floats\n\
1117b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee"
1118a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis)
1119b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee#ifdef MS_WINDOWS
1120b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee/* concatenating string here */
1121a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STR(
1122b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee"dllhandle -- [Windows only] integer handle of the Python DLL\n\
1123c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumwinver -- [Windows only] version number of the Python DLL\n\
1124b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee"
1125a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis)
1126b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee#endif /* MS_WINDOWS */
1127a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. LöwisPyDoc_STR(
1128b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee"__stdin__ -- the original stdin; don't touch!\n\
1129b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee__stdout__ -- the original stdout; don't touch!\n\
1130b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee__stderr__ -- the original stderr; don't touch!\n\
1131b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee__displayhook__ -- the original displayhook; don't touch!\n\
1132b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee__excepthook__ -- the original excepthook; don't touch!\n\
1133c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
1134c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van RossumFunctions:\n\
1135c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum\n\
1136f68f2fec7df1224a031c3feed8a0ef6028cfcdddMoshe Zadkadisplayhook() -- print an object to the screen, and save it in __builtin__._\n\
1137b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yeeexcepthook() -- print an exception and its traceback to sys.stderr\n\
1138c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumexc_info() -- return thread-safe information about the current exception\n\
113946d3dc37e4a01e8d72b00ab9ad4e4a07022b7b64Guido van Rossumexc_clear() -- clear the exception state for the current thread\n\
1140c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumexit() -- exit the interpreter by raising SystemExit\n\
1141f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwisgetdlopenflags() -- returns flags to be used for dlopen() calls\n\
114256112895d69131ee4f34d4e3e9406614313df57fGeorg Brandlgetprofile() -- get the global profiling function\n\
1143c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumgetrefcount() -- return the reference count for an object (plus one :-)\n\
1144ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hyltongetrecursionlimit() -- return the max recursion depth for the interpreter\n\
114551df0647672bc758da6d58eecfe45da9dc5913dfRobert Schuppeniesgetsizeof() -- return the size of an object in bytes\n\
114656112895d69131ee4f34d4e3e9406614313df57fGeorg Brandlgettrace() -- get the global debug tracing function\n\
1147c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumsetcheckinterval() -- control how often the interpreter checks for events\n\
1148f0473d511b7f883bfff3048f55e3a6adc7a43cb9Martin v. Löwissetdlopenflags() -- set the flags to be used for dlopen() calls\n\
1149c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumsetprofile() -- set the global profiling function\n\
1150ee5adfbae6df9a4ae8d73bccc4f3a55b7f382d11Jeremy Hyltonsetrecursionlimit() -- set the max recursion depth for the interpreter\n\
1151c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossumsettrace() -- set the global debug tracing function\n\
1152ccede598894e780cb3e4ef80aeede313f62bb1fbFred Drake"
1153a3fb4f78164e55ddecfd875b9b33791850213dfdMartin v. Löwis)
1154ccede598894e780cb3e4ef80aeede313f62bb1fbFred Drake/* end of sys_doc */ ;
1155c3bc31e249b3eb8bc17cf60532e333f9673130e9Guido van Rossum
11568e3ca8af2641a47a83f02135a77193b0b80c545eMartin v. Löwisstatic int
11578e3ca8af2641a47a83f02135a77193b0b80c545eMartin v. Löwis_check_and_flush (FILE *stream)
11588e3ca8af2641a47a83f02135a77193b0b80c545eMartin v. Löwis{
11598e3ca8af2641a47a83f02135a77193b0b80c545eMartin v. Löwis  int prev_fail = ferror (stream);
11608e3ca8af2641a47a83f02135a77193b0b80c545eMartin v. Löwis  return fflush (stream) || prev_fail ? EOF : 0;
11618e3ca8af2641a47a83f02135a77193b0b80c545eMartin v. Löwis}
11628e3ca8af2641a47a83f02135a77193b0b80c545eMartin v. Löwis
116343b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis/* Subversion branch and revision management */
116443b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwisstatic int svn_initialized;
116543b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwisstatic char patchlevel_revision[50]; /* Just the number */
116643b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwisstatic char branch[50];
116743b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwisstatic char shortbranch[50];
116843b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwisstatic const char *svn_revision;
116943b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis
1170e86e7a5b62250ab3a17c020bdeb0213a971f2585Tim Petersstatic void
1171e86e7a5b62250ab3a17c020bdeb0213a971f2585Tim Peterssvnversion_init(void)
117243b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis{
1173c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (svn_initialized)
1174c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return;
1175c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    svn_initialized = 1;
11767859d4098c941ddaf85fccd6850ae3004c47674eBenjamin Peterson    *patchlevel_revision = '\0';
11777859d4098c941ddaf85fccd6850ae3004c47674eBenjamin Peterson    strcpy(branch, "");
11787859d4098c941ddaf85fccd6850ae3004c47674eBenjamin Peterson    strcpy(shortbranch, "unknown");
11797859d4098c941ddaf85fccd6850ae3004c47674eBenjamin Peterson    svn_revision = "";
11807859d4098c941ddaf85fccd6850ae3004c47674eBenjamin Peterson    return;
118143b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis}
118243b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis
118343b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis/* Return svnversion output if available.
118443b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis   Else return Revision of patchlevel.h if on branch.
118543b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis   Else return empty string */
118643b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwisconst char*
118743b57805fbc9b500f0b4239fd925868b26475f35Martin v. LöwisPy_SubversionRevision()
118843b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis{
1189c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    svnversion_init();
1190c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return svn_revision;
119143b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis}
119243b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis
119343b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwisconst char*
119443b57805fbc9b500f0b4239fd925868b26475f35Martin v. LöwisPy_SubversionShortBranch()
119543b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis{
1196c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    svnversion_init();
1197c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return shortbranch;
119843b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis}
119943b57805fbc9b500f0b4239fd925868b26475f35Martin v. Löwis
1200f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes
1201f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian HeimesPyDoc_STRVAR(flags__doc__,
1202f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes"sys.flags\n\
1203f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes\n\
1204f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian HeimesFlags provided through command line arguments or environment vars.");
1205f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes
1206796fc3158572c9a20f64f6b1c54e278639e6f032Christian Heimesstatic PyTypeObject FlagsType = {0, 0, 0, 0, 0, 0};
1207f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes
1208f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimesstatic PyStructSequence_Field flags_fields[] = {
1209c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"debug",                   "-d"},
1210c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"py3k_warning",            "-3"},
1211c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"division_warning",        "-Q"},
1212c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"division_new",            "-Qnew"},
1213c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"inspect",                 "-i"},
1214c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"interactive",             "-i"},
1215c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"optimize",                "-O or -OO"},
1216c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"dont_write_bytecode",     "-B"},
1217c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"no_user_site",            "-s"},
1218c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"no_site",                 "-S"},
1219c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"ignore_environment",      "-E"},
1220c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"tabcheck",                "-t or -tt"},
1221c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"verbose",                 "-v"},
1222f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes#ifdef RISCOS
1223c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"riscos_wimp",             "???"},
1224f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes#endif
1225c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* {"unbuffered",                   "-u"}, */
1226c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"unicode",                 "-U"},
1227c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* {"skip_first",                   "-x"}, */
1228c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"bytes_warning", "-b"},
12291e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw    {"hash_randomization", "-R"},
1230c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {0}
1231f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes};
1232f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes
1233f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimesstatic PyStructSequence_Desc flags_desc = {
1234c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    "sys.flags",        /* name */
1235c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    flags__doc__,       /* doc */
1236c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    flags_fields,       /* fields */
1237f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes#ifdef RISCOS
12381e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw    17
1239f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes#else
12401e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw    16
1241f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes#endif
1242f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes};
1243f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes
1244f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimesstatic PyObject*
1245f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimesmake_flags(void)
1246f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes{
1247c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int pos = 0;
1248c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *seq;
1249f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes
1250c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    seq = PyStructSequence_New(&FlagsType);
1251c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (seq == NULL)
1252c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1253f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes
1254f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes#define SetFlag(flag) \
1255c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyStructSequence_SET_ITEM(seq, pos++, PyInt_FromLong(flag))
1256c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1257c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_DebugFlag);
1258c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_Py3kWarningFlag);
1259c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_DivisionWarningFlag);
1260c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(_Py_QnewFlag);
1261c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_InspectFlag);
1262c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_InteractiveFlag);
1263c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_OptimizeFlag);
1264c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_DontWriteBytecodeFlag);
1265c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_NoUserSiteDirectory);
1266c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_NoSiteFlag);
1267c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_IgnoreEnvironmentFlag);
1268c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_TabcheckFlag);
1269c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_VerboseFlag);
1270f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes#ifdef RISCOS
1271c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_RISCOSWimpFlag);
1272f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes#endif
1273c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* SetFlag(saw_unbuffered_flag); */
1274c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetFlag(Py_UnicodeFlag);
1275c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* SetFlag(skipfirstline); */
1276e9746890388178bb1e4cdad3c0586bf1862c3727Brett Cannon    SetFlag(Py_BytesWarningFlag);
12771e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw    SetFlag(Py_HashRandomizationFlag);
1278f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes#undef SetFlag
1279f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes
1280c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyErr_Occurred()) {
12810585418b0d50755500587a887f3a901f8149cd00Serhiy Storchaka        Py_DECREF(seq);
1282c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1283c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1284c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return seq;
1285f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes}
1286f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes
128781fe09344cfa290efd6041269e70a2d0b629a7c8Eric SmithPyDoc_STRVAR(version_info__doc__,
128881fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith"sys.version_info\n\
128981fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith\n\
129081fe09344cfa290efd6041269e70a2d0b629a7c8Eric SmithVersion information as a named tuple.");
129181fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith
129281fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smithstatic PyTypeObject VersionInfoType = {0, 0, 0, 0, 0, 0};
129381fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith
129481fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smithstatic PyStructSequence_Field version_info_fields[] = {
1295c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"major", "Major release number"},
1296c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"minor", "Minor release number"},
1297c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"micro", "Patch release number"},
12980caaa6c94d39d44db98f55f4f03d1f91f9c260afNed Deily    {"releaselevel", "'alpha', 'beta', 'candidate', or 'final'"},
1299c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {"serial", "Serial release number"},
1300c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {0}
130181fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith};
130281fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith
130381fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smithstatic PyStructSequence_Desc version_info_desc = {
1304c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    "sys.version_info",     /* name */
1305c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    version_info__doc__,    /* doc */
1306c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    version_info_fields,    /* fields */
1307c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    5
130881fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith};
130981fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith
131081fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smithstatic PyObject *
131181fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smithmake_version_info(void)
131281fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith{
1313c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *version_info;
1314c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *s;
1315c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int pos = 0;
1316c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1317c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    version_info = PyStructSequence_New(&VersionInfoType);
1318c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (version_info == NULL) {
1319c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1320c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1321c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1322c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /*
1323c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * These release level checks are mutually exclusive and cover
1324c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * the field, so don't get too fancy with the pre-processor!
1325c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     */
132681fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
1327c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    s = "alpha";
132881fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
1329c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    s = "beta";
133081fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
1331c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    s = "candidate";
133281fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
1333c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    s = "final";
133481fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith#endif
133581fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith
133681fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith#define SetIntItem(flag) \
1337c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyStructSequence_SET_ITEM(version_info, pos++, PyInt_FromLong(flag))
133881fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith#define SetStrItem(flag) \
1339c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyStructSequence_SET_ITEM(version_info, pos++, PyString_FromString(flag))
134081fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith
1341c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetIntItem(PY_MAJOR_VERSION);
1342c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetIntItem(PY_MINOR_VERSION);
1343c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetIntItem(PY_MICRO_VERSION);
1344c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetStrItem(s);
1345c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SetIntItem(PY_RELEASE_SERIAL);
134681fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith#undef SetIntItem
134781fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith#undef SetStrItem
134881fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith
1349c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyErr_Occurred()) {
1350c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_CLEAR(version_info);
1351c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1352c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1353c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return version_info;
135481fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith}
135581fe09344cfa290efd6041269e70a2d0b629a7c8Eric Smith
135625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van RossumPyObject *
1357f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouters_PySys_Init(void)
135885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum{
1359c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *m, *v, *sysdict;
1360c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *sysin, *sysout, *syserr;
1361c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *s;
1362c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1363c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    m = Py_InitModule3("sys", sys_methods, sys_doc);
1364c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (m == NULL)
1365c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1366c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    sysdict = PyModule_GetDict(m);
1367c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define SET_SYS_FROM_STRING(key, value)                 \
1368c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    v = value;                                          \
1369c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (v != NULL)                                      \
1370c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyDict_SetItemString(sysdict, key, v);          \
1371c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(v)
1372c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1373c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Check that stdin is not a directory
1374c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Using shell redirection, you can redirect stdin to a directory,
1375c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    crashing the Python interpreter. Catch this common mistake here
1376c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    and output a useful error message. Note that under MS Windows,
1377c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    the shell already prevents that. */
13781b3bef21b061a1543591d6d67d5501a4469504e9Martin v. Löwis#if !defined(MS_WINDOWS)
1379c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {
1380c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        struct stat sb;
1381c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (fstat(fileno(stdin), &sb) == 0 &&
1382c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            S_ISDIR(sb.st_mode)) {
1383c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* There's nothing more we can do. */
1384c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* Py_FatalError() will core dump, so just exit. */
1385c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n");
1386c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            exit(EXIT_FAILURE);
1387c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1388c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
13891b3bef21b061a1543591d6d67d5501a4469504e9Martin v. Löwis#endif
139011bd11922657f582ee05f1d3cefe32c3a9e51cb7Neal Norwitz
1391c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Closing the standard FILE* if sys.std* goes aways causes problems
1392c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * for embedded Python usages. Closing them when somebody explicitly
1393c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * invokes .close() might be possible, but the FAQ promises they get
1394c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * never closed. However, we still need to get write errors when
1395c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * writing fails (e.g. because stdout is redirected), so we flush the
1396c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * streams and check for errors before the file objects are deleted.
1397c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * On OS X, fflush()ing stdin causes an error, so we exempt stdin
1398c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     * from that procedure.
1399c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou     */
1400c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL);
1401c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    sysout = PyFile_FromFile(stdout, "<stdout>", "w", _check_and_flush);
1402c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    syserr = PyFile_FromFile(stderr, "<stderr>", "w", _check_and_flush);
1403c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyErr_Occurred())
1404c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1405c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1406c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyDict_SetItemString(sysdict, "stdin", sysin);
1407c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyDict_SetItemString(sysdict, "stdout", sysout);
1408c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyDict_SetItemString(sysdict, "stderr", syserr);
1409c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* Make backup copies for cleanup */
1410c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyDict_SetItemString(sysdict, "__stdin__", sysin);
1411c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyDict_SetItemString(sysdict, "__stdout__", sysout);
1412c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyDict_SetItemString(sysdict, "__stderr__", syserr);
1413c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyDict_SetItemString(sysdict, "__displayhook__",
1414c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         PyDict_GetItemString(sysdict, "displayhook"));
1415c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyDict_SetItemString(sysdict, "__excepthook__",
1416c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         PyDict_GetItemString(sysdict, "excepthook"));
1417c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(sysin);
1418c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(sysout);
1419c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_XDECREF(syserr);
1420c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1421c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("version",
1422c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         PyString_FromString(Py_GetVersion()));
1423c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("hexversion",
1424c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         PyInt_FromLong(PY_VERSION_HEX));
1425c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    svnversion_init();
1426c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("subversion",
1427c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         Py_BuildValue("(ssz)", "CPython", branch,
1428c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                      svn_revision));
14293a5508e2c075405f35b5c32f413445b9e875c92cGeorg Brandl    SET_SYS_FROM_STRING("_mercurial",
14303a5508e2c075405f35b5c32f413445b9e875c92cGeorg Brandl                        Py_BuildValue("(szz)", "CPython", _Py_hgidentifier(),
14313a5508e2c075405f35b5c32f413445b9e875c92cGeorg Brandl                                      _Py_hgversion()));
1432c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("dont_write_bytecode",
1433c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                         PyBool_FromLong(Py_DontWriteBytecodeFlag));
1434c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("api_version",
1435c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyInt_FromLong(PYTHON_API_VERSION));
1436c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("copyright",
1437c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyString_FromString(Py_GetCopyright()));
1438c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("platform",
1439c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyString_FromString(Py_GetPlatform()));
1440c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("executable",
1441c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyString_FromString(Py_GetProgramFullPath()));
1442c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("prefix",
1443c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyString_FromString(Py_GetPrefix()));
1444c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("exec_prefix",
1445c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyString_FromString(Py_GetExecPrefix()));
1446c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("maxsize",
1447c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyInt_FromSsize_t(PY_SSIZE_T_MAX));
1448c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("maxint",
1449c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyInt_FromLong(PyInt_GetMax()));
1450c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("py3kwarning",
1451c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyBool_FromLong(Py_Py3kWarningFlag));
1452c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("float_info",
1453c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyFloat_GetInfo());
1454c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("long_info",
1455c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyLong_GetInfo());
1456339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#ifdef Py_USING_UNICODE
1457c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("maxunicode",
1458c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyInt_FromLong(PyUnicode_GetMax()));
1459339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#endif
1460c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("builtin_module_names",
1461c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        list_builtin_module_names());
1462c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    {
1463c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Assumes that longs are at least 2 bytes long.
1464c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou           Should be safe! */
1465c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        unsigned long number = 1;
1466c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char *value;
1467c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1468c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        s = (char *) &number;
1469c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (s[0] == 0)
1470c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            value = "big";
1471c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else
1472c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            value = "little";
1473c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        SET_SYS_FROM_STRING("byteorder",
1474c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                            PyString_FromString(value));
1475c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
14768b9ea873ad4bbb6a5d31cff43fc589f6004a4e2eGuido van Rossum#ifdef MS_COREDLL
1477c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("dllhandle",
1478c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyLong_FromVoidPtr(PyWin_DLLhModule));
1479c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("winver",
1480c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyString_FromString(PyWin_DLLVersionString));
1481c606fe186f4b2e1d962651ae3ea34325c65b83dcGuido van Rossum#endif
1482c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (warnoptions == NULL) {
1483c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        warnoptions = PyList_New(0);
1484c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1485c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
1486c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_INCREF(warnoptions);
1487c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1488c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (warnoptions != NULL) {
1489c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
1490c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1491c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1492c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* version_info */
1493c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (VersionInfoType.tp_name == 0)
1494c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyStructSequence_InitType(&VersionInfoType, &version_info_desc);
1495c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("version_info", make_version_info());
1496c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* prevent user from creating new instances */
1497c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VersionInfoType.tp_init = NULL;
1498c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    VersionInfoType.tp_new = NULL;
1499c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1500c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* flags */
1501c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (FlagsType.tp_name == 0)
1502c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyStructSequence_InitType(&FlagsType, &flags_desc);
1503c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("flags", make_flags());
1504c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* prevent user from creating new instances */
1505c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    FlagsType.tp_init = NULL;
1506c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    FlagsType.tp_new = NULL;
1507f31b69f9dbfcb0d7f57147abcba47a940bd9430bChristian Heimes
1508ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smith
1509ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smith#if defined(MS_WINDOWS)
1510c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* getwindowsversion */
1511c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (WindowsVersionType.tp_name == 0)
1512c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyStructSequence_InitType(&WindowsVersionType, &windows_version_desc);
1513c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* prevent user from creating new instances */
1514c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    WindowsVersionType.tp_init = NULL;
1515c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    WindowsVersionType.tp_new = NULL;
1516ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smith#endif
1517ee931b7253fe332125dad0b7ba1681bdebb0a575Eric Smith
1518c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
1519da8652d920210a5ff783a7ad30f4c24d2b5ff2a2Mark Dickinson#ifndef PY_NO_SHORT_FLOAT_REPR
1520c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("float_repr_style",
1521c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyString_FromString("short"));
1522da8652d920210a5ff783a7ad30f4c24d2b5ff2a2Mark Dickinson#else
1523c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    SET_SYS_FROM_STRING("float_repr_style",
1524c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        PyString_FromString("legacy"));
1525da8652d920210a5ff783a7ad30f4c24d2b5ff2a2Mark Dickinson#endif
1526da8652d920210a5ff783a7ad30f4c24d2b5ff2a2Mark Dickinson
15270d9244332b4c9dad8722f7ed651fb922de93afe6Christian Heimes#undef SET_SYS_FROM_STRING
1528c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PyErr_Occurred())
1529c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1530c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return m;
15315b3138bec047cfe9d284516be3958680f4fcf4abGuido van Rossum}
15325b3138bec047cfe9d284516be3958680f4fcf4abGuido van Rossum
153365bf9f265e4052c3eee95cd73f8de66bc92e53bfGuido van Rossumstatic PyObject *
1534f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersmakepathobject(char *path, int delim)
15355b3138bec047cfe9d284516be3958680f4fcf4abGuido van Rossum{
1536c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    int i, n;
1537c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char *p;
1538c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *v, *w;
1539c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1540c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    n = 1;
1541c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    p = path;
1542c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    while ((p = strchr(p, delim)) != NULL) {
1543c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        n++;
1544c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        p++;
1545c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1546c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    v = PyList_New(n);
1547c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (v == NULL)
1548c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        return NULL;
1549c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    for (i = 0; ; i++) {
1550c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        p = strchr(path, delim);
1551c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (p == NULL)
1552c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p = strchr(path, '\0'); /* End of string */
1553c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        w = PyString_FromStringAndSize(path, (Py_ssize_t) (p - path));
1554c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (w == NULL) {
1555c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_DECREF(v);
1556c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            return NULL;
1557c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1558c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyList_SetItem(v, i, w);
1559c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (*p == '\0')
1560c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            break;
1561c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        path = p+1;
1562c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1563c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return v;
156485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum}
156585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum
156685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumvoid
1567f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPySys_SetPath(char *path)
156885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum{
1569c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *v;
1570c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if ((v = makepathobject(path, DELIM)) == NULL)
1571c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_FatalError("can't create sys.path");
1572c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PySys_SetObject("path", v) != 0)
1573c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_FatalError("can't assign sys.path");
1574c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(v);
15753f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum}
15763f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum
157765bf9f265e4052c3eee95cd73f8de66bc92e53bfGuido van Rossumstatic PyObject *
1578f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersmakeargvobject(int argc, char **argv)
15793f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum{
1580c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *av;
1581c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (argc <= 0 || argv == NULL) {
1582c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        /* Ensure at least one (empty) argument is seen */
1583c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        static char *empty_argv[1] = {""};
1584c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        argv = empty_argv;
1585c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        argc = 1;
1586c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1587c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    av = PyList_New(argc);
1588c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (av != NULL) {
1589c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int i;
1590c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        for (i = 0; i < argc; i++) {
1591c16f3bd8a391a68427a95e15a3c1894198ff0377Martin v. Löwis#ifdef __VMS
1592c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyObject *v;
1593c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1594c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* argv[0] is the script pathname if known */
1595c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (i == 0) {
1596c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                char* fn = decc$translate_vms(argv[0]);
1597c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if ((fn == (char *)0) || fn == (char *)-1)
1598c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    v = PyString_FromString(argv[0]);
1599c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                else
1600c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    v = PyString_FromString(
1601c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        decc$translate_vms(argv[0]));
1602c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            } else
1603c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                v = PyString_FromString(argv[i]);
1604c16f3bd8a391a68427a95e15a3c1894198ff0377Martin v. Löwis#else
1605c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyObject *v = PyString_FromString(argv[i]);
1606c16f3bd8a391a68427a95e15a3c1894198ff0377Martin v. Löwis#endif
1607c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (v == NULL) {
1608c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                Py_DECREF(av);
1609c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                av = NULL;
1610c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                break;
1611c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
1612c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyList_SetItem(av, i, v);
1613c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1614c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1615c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    return av;
16163f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum}
16173f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum
16183f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossumvoid
16196a2656094d1806abc5229758246865bcbaa34c5eAntoine PitrouPySys_SetArgvEx(int argc, char **argv, int updatepath)
16203f5da24ea304e674a9abbdcffc4d671e32aa70f1Guido van Rossum{
1621162e38c6a312aa3e9c353419301087a4620c513cGuido van Rossum#if defined(HAVE_REALPATH)
1622c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char fullpath[MAXPATHLEN];
16231b3bef21b061a1543591d6d67d5501a4469504e9Martin v. Löwis#elif defined(MS_WINDOWS) && !defined(MS_WINCE)
1624c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    char fullpath[MAX_PATH];
162527bb71e96382218a5a530772cd81ce6f91d22444Thomas Heller#endif
1626c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *av = makeargvobject(argc, argv);
1627c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *path = PySys_GetObject("path");
1628c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (av == NULL)
1629c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_FatalError("no mem for sys.argv");
1630c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (PySys_SetObject("argv", av) != 0)
1631c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_FatalError("can't assign sys.argv");
16326a2656094d1806abc5229758246865bcbaa34c5eAntoine Pitrou    if (updatepath && path != NULL) {
1633c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char *argv0 = argv[0];
1634c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char *p = NULL;
1635c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_ssize_t n = 0;
1636c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        PyObject *a;
1637c474deaaf63deb633bf9bc951c8cc1cd5d107edaGuido van Rossum#ifdef HAVE_READLINK
1638c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char link[MAXPATHLEN+1];
1639c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char argv0copy[2*MAXPATHLEN+1];
1640c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        int nr = 0;
1641c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0)
1642c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            nr = readlink(argv0, link, MAXPATHLEN);
1643c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (nr > 0) {
1644c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* It's a symlink */
1645c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            link[nr] = '\0';
1646c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (link[0] == SEP)
1647c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                argv0 = link; /* Link to absolute path */
1648c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            else if (strchr(link, SEP) == NULL)
1649c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                ; /* Link without path */
1650c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            else {
1651c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                /* Must join(dirname(argv0), link) */
1652c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                char *q = strrchr(argv0, SEP);
1653c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (q == NULL)
1654c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    argv0 = link; /* argv0 without path */
1655c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                else {
1656c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    /* Must make a copy */
1657c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    strcpy(argv0copy, argv0);
1658c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    q = strrchr(argv0copy, SEP);
1659c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    strcpy(q+1, link);
1660c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    argv0 = argv0copy;
1661c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                }
1662c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
1663c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1664c474deaaf63deb633bf9bc951c8cc1cd5d107edaGuido van Rossum#endif /* HAVE_READLINK */
1665cc88341e6d25a7ca9fc7765d93c436f02d84f83bGuido van Rossum#if SEP == '\\' /* Special case for MS filename syntax */
1666c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) {
1667c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char *q;
16681b3bef21b061a1543591d6d67d5501a4469504e9Martin v. Löwis#if defined(MS_WINDOWS) && !defined(MS_WINCE)
1669c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* This code here replaces the first element in argv with the full
1670c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            path that it represents. Under CE, there are no relative paths so
1671c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            the argument must be the full path anyway. */
1672c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            char *ptemp;
1673c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (GetFullPathName(argv0,
1674c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                               sizeof(fullpath),
1675c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                               fullpath,
1676c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                               &ptemp)) {
1677c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                argv0 = fullpath;
1678c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
167927bb71e96382218a5a530772cd81ce6f91d22444Thomas Heller#endif
1680c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p = strrchr(argv0, SEP);
1681c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            /* Test for alternate separator */
1682c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            q = strrchr(p ? p : argv0, '/');
1683c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (q != NULL)
1684c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                p = q;
1685c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (p != NULL) {
1686c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                n = p + 1 - argv0;
1687c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                if (n > 1 && p[-1] != ':')
1688c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                    n--; /* Drop trailing separator */
1689c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
1690c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1691cc88341e6d25a7ca9fc7765d93c436f02d84f83bGuido van Rossum#else /* All other filename syntaxes */
1692c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) {
1693162e38c6a312aa3e9c353419301087a4620c513cGuido van Rossum#if defined(HAVE_REALPATH)
1694c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (realpath(argv0, fullpath)) {
1695c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                argv0 = fullpath;
1696c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
1697162e38c6a312aa3e9c353419301087a4620c513cGuido van Rossum#endif
1698c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            p = strrchr(argv0, SEP);
1699c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1700c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (p != NULL) {
1701bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#ifndef RISCOS
1702c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            n = p + 1 - argv0;
1703bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#else /* don't include trailing separator */
1704c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            n = p - argv0;
1705bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#endif /* RISCOS */
1706cc88341e6d25a7ca9fc7765d93c436f02d84f83bGuido van Rossum#if SEP == '/' /* Special case for Unix filename syntax */
1707c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (n > 1)
1708c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                n--; /* Drop trailing separator */
1709cc88341e6d25a7ca9fc7765d93c436f02d84f83bGuido van Rossum#endif /* Unix */
1710c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1711cc88341e6d25a7ca9fc7765d93c436f02d84f83bGuido van Rossum#endif /* All others */
1712c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        a = PyString_FromStringAndSize(argv0, n);
1713c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (a == NULL)
1714c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_FatalError("no mem for sys.path insertion");
1715c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (PyList_Insert(path, 0, a) < 0)
1716c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            Py_FatalError("sys.path.insert(0) failed");
1717c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        Py_DECREF(a);
1718c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1719c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    Py_DECREF(av);
172085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum}
1721a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
17226a2656094d1806abc5229758246865bcbaa34c5eAntoine Pitrouvoid
17236a2656094d1806abc5229758246865bcbaa34c5eAntoine PitrouPySys_SetArgv(int argc, char **argv)
17246a2656094d1806abc5229758246865bcbaa34c5eAntoine Pitrou{
17256a2656094d1806abc5229758246865bcbaa34c5eAntoine Pitrou    PySys_SetArgvEx(argc, argv, 1);
17266a2656094d1806abc5229758246865bcbaa34c5eAntoine Pitrou}
17276a2656094d1806abc5229758246865bcbaa34c5eAntoine Pitrou
1728a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
1729a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
1730a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum   Adapted from code submitted by Just van Rossum.
1731a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
1732a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum   PySys_WriteStdout(format, ...)
1733a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum   PySys_WriteStderr(format, ...)
1734a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
1735a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum      The first function writes to sys.stdout; the second to sys.stderr.  When
1736a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum      there is a problem, they write to the real (C level) stdout or stderr;
17378442af35fe337a81efa83952574c5ca0dbcc2883Guido van Rossum      no exceptions are raised.
1738a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
1739a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum      Both take a printf-style format string as their first argument followed
1740a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum      by a variable length argument list determined by the format string.
1741a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
1742a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum      *** WARNING ***
1743a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
1744a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum      The format should limit the total size of the formatted output string to
1745a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum      1000 bytes.  In particular, this means that no unrestricted "%s" formats
1746a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum      should occur; these should be limited using "%.<N>s where <N> is a
1747a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum      decimal number calculated so that <N> plus the maximum size of other
1748a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum      formatted text does not exceed 1000 bytes.  Also watch out for "%f",
1749a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum      which can print hundreds of digits for very large numbers.
1750a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
1751a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum */
1752a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
1753a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossumstatic void
1754f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersmywrite(char *name, FILE *fp, const char *format, va_list va)
1755a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum{
1756c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *file;
1757c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyObject *error_type, *error_value, *error_traceback;
1758c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
1759c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyErr_Fetch(&error_type, &error_value, &error_traceback);
1760c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    file = PySys_GetObject(name);
1761c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (file == NULL || PyFile_AsFile(file) == fp)
1762c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        vfprintf(fp, format, va);
1763c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    else {
1764c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char buffer[1001];
1765c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        const int written = PyOS_vsnprintf(buffer, sizeof(buffer),
1766c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                           format, va);
1767c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (PyFile_WriteString(buffer, file) != 0) {
1768c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            PyErr_Clear();
1769c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            fputs(buffer, fp);
1770c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1771c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (written < 0 || (size_t)written >= sizeof(buffer)) {
1772c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            const char *truncated = "... truncated";
1773c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if (PyFile_WriteString(truncated, file) != 0) {
1774c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                PyErr_Clear();
1775c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                fputs(truncated, fp);
1776c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            }
1777c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }
1778c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    }
1779c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    PyErr_Restore(error_type, error_value, error_traceback);
1780a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum}
1781a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
1782a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossumvoid
1783a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van RossumPySys_WriteStdout(const char *format, ...)
1784a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum{
1785c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    va_list va;
1786a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
1787c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    va_start(va, format);
1788c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    mywrite("stdout", stdout, format, va);
1789c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    va_end(va);
1790a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum}
1791a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
1792a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossumvoid
1793a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van RossumPySys_WriteStderr(const char *format, ...)
1794a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum{
1795c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    va_list va;
1796a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum
1797c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    va_start(va, format);
1798c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    mywrite("stderr", stderr, format, va);
1799c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    va_end(va);
1800a890e688076d323baa8aef5b5da4bc6a60ad3adcGuido van Rossum}
1801