sysmodule.c revision 49526f48fc73d3ccdf09d466ed2d39a30e4df9b9
1
2/* System module */
3
4/*
5Various bits of information used by the interpreter are collected in
6module 'sys'.
7Function member:
8- exit(sts): raise SystemExit
9Data members:
10- stdin, stdout, stderr: standard file objects
11- modules: the table of modules (dictionary)
12- path: module search path (list of strings)
13- argv: script arguments (list of strings)
14- ps1, ps2: optional primary and secondary prompts (strings)
15*/
16
17#include "Python.h"
18#include "code.h"
19#include "frameobject.h"
20#include "pythread.h"
21
22#include "osdefs.h"
23
24#ifdef MS_WINDOWS
25#define WIN32_LEAN_AND_MEAN
26#include <windows.h>
27#endif /* MS_WINDOWS */
28
29#ifdef MS_COREDLL
30extern void *PyWin_DLLhModule;
31/* A string loaded from the DLL at startup: */
32extern const char *PyWin_DLLVersionString;
33#endif
34
35#ifdef __VMS
36#include <unixlib.h>
37#endif
38
39#ifdef HAVE_LANGINFO_H
40#include <locale.h>
41#include <langinfo.h>
42#endif
43
44PyObject *
45PySys_GetObject(const char *name)
46{
47    PyThreadState *tstate = PyThreadState_GET();
48    PyObject *sd = tstate->interp->sysdict;
49    if (sd == NULL)
50        return NULL;
51    return PyDict_GetItemString(sd, name);
52}
53
54int
55PySys_SetObject(const char *name, PyObject *v)
56{
57    PyThreadState *tstate = PyThreadState_GET();
58    PyObject *sd = tstate->interp->sysdict;
59    if (v == NULL) {
60        if (PyDict_GetItemString(sd, name) == NULL)
61            return 0;
62        else
63            return PyDict_DelItemString(sd, name);
64    }
65    else
66        return PyDict_SetItemString(sd, name, v);
67}
68
69/* Write repr(o) to sys.stdout using sys.stdout.encoding and 'backslashreplace'
70   error handler. If sys.stdout has a buffer attribute, use
71   sys.stdout.buffer.write(encoded), otherwise redecode the string and use
72   sys.stdout.write(redecoded).
73
74   Helper function for sys_displayhook(). */
75static int
76sys_displayhook_unencodable(PyObject *outf, PyObject *o)
77{
78    PyObject *stdout_encoding = NULL;
79    PyObject *encoded, *escaped_str, *repr_str, *buffer, *result;
80    char *stdout_encoding_str;
81    int ret;
82    _Py_IDENTIFIER(encoding);
83    _Py_IDENTIFIER(buffer);
84
85    stdout_encoding = _PyObject_GetAttrId(outf, &PyId_encoding);
86    if (stdout_encoding == NULL)
87        goto error;
88    stdout_encoding_str = _PyUnicode_AsString(stdout_encoding);
89    if (stdout_encoding_str == NULL)
90        goto error;
91
92    repr_str = PyObject_Repr(o);
93    if (repr_str == NULL)
94        goto error;
95    encoded = PyUnicode_AsEncodedString(repr_str,
96                                        stdout_encoding_str,
97                                        "backslashreplace");
98    Py_DECREF(repr_str);
99    if (encoded == NULL)
100        goto error;
101
102    buffer = _PyObject_GetAttrId(outf, &PyId_buffer);
103    if (buffer) {
104        _Py_IDENTIFIER(write);
105        result = _PyObject_CallMethodId(buffer, &PyId_write, "(O)", encoded);
106        Py_DECREF(buffer);
107        Py_DECREF(encoded);
108        if (result == NULL)
109            goto error;
110        Py_DECREF(result);
111    }
112    else {
113        PyErr_Clear();
114        escaped_str = PyUnicode_FromEncodedObject(encoded,
115                                                  stdout_encoding_str,
116                                                  "strict");
117        Py_DECREF(encoded);
118        if (PyFile_WriteObject(escaped_str, outf, Py_PRINT_RAW) != 0) {
119            Py_DECREF(escaped_str);
120            goto error;
121        }
122        Py_DECREF(escaped_str);
123    }
124    ret = 0;
125    goto finally;
126
127error:
128    ret = -1;
129finally:
130    Py_XDECREF(stdout_encoding);
131    return ret;
132}
133
134static PyObject *
135sys_displayhook(PyObject *self, PyObject *o)
136{
137    PyObject *outf;
138    PyInterpreterState *interp = PyThreadState_GET()->interp;
139    PyObject *modules = interp->modules;
140    PyObject *builtins = PyDict_GetItemString(modules, "builtins");
141    int err;
142    _Py_IDENTIFIER(_);
143
144    if (builtins == NULL) {
145        PyErr_SetString(PyExc_RuntimeError, "lost builtins module");
146        return NULL;
147    }
148
149    /* Print value except if None */
150    /* After printing, also assign to '_' */
151    /* Before, set '_' to None to avoid recursion */
152    if (o == Py_None) {
153        Py_INCREF(Py_None);
154        return Py_None;
155    }
156    if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0)
157        return NULL;
158    outf = PySys_GetObject("stdout");
159    if (outf == NULL || outf == Py_None) {
160        PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
161        return NULL;
162    }
163    if (PyFile_WriteObject(o, outf, 0) != 0) {
164        if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) {
165            /* repr(o) is not encodable to sys.stdout.encoding with
166             * sys.stdout.errors error handler (which is probably 'strict') */
167            PyErr_Clear();
168            err = sys_displayhook_unencodable(outf, o);
169            if (err)
170                return NULL;
171        }
172        else {
173            return NULL;
174        }
175    }
176    if (PyFile_WriteString("\n", outf) != 0)
177        return NULL;
178    if (_PyObject_SetAttrId(builtins, &PyId__, o) != 0)
179        return NULL;
180    Py_INCREF(Py_None);
181    return Py_None;
182}
183
184PyDoc_STRVAR(displayhook_doc,
185"displayhook(object) -> None\n"
186"\n"
187"Print an object to sys.stdout and also save it in builtins._\n"
188);
189
190static PyObject *
191sys_excepthook(PyObject* self, PyObject* args)
192{
193    PyObject *exc, *value, *tb;
194    if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb))
195        return NULL;
196    PyErr_Display(exc, value, tb);
197    Py_INCREF(Py_None);
198    return Py_None;
199}
200
201PyDoc_STRVAR(excepthook_doc,
202"excepthook(exctype, value, traceback) -> None\n"
203"\n"
204"Handle an exception by displaying it with a traceback on sys.stderr.\n"
205);
206
207static PyObject *
208sys_exc_info(PyObject *self, PyObject *noargs)
209{
210    PyThreadState *tstate;
211    tstate = PyThreadState_GET();
212    return Py_BuildValue(
213        "(OOO)",
214        tstate->exc_type != NULL ? tstate->exc_type : Py_None,
215        tstate->exc_value != NULL ? tstate->exc_value : Py_None,
216        tstate->exc_traceback != NULL ?
217            tstate->exc_traceback : Py_None);
218}
219
220PyDoc_STRVAR(exc_info_doc,
221"exc_info() -> (type, value, traceback)\n\
222\n\
223Return information about the most recent exception caught by an except\n\
224clause in the current stack frame or in an older stack frame."
225);
226
227static PyObject *
228sys_exit(PyObject *self, PyObject *args)
229{
230    PyObject *exit_code = 0;
231    if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
232        return NULL;
233    /* Raise SystemExit so callers may catch it or clean up. */
234    PyErr_SetObject(PyExc_SystemExit, exit_code);
235    return NULL;
236}
237
238PyDoc_STRVAR(exit_doc,
239"exit([status])\n\
240\n\
241Exit the interpreter by raising SystemExit(status).\n\
242If the status is omitted or None, it defaults to zero (i.e., success).\n\
243If the status is numeric, it will be used as the system exit status.\n\
244If it is another kind of object, it will be printed and the system\n\
245exit status will be one (i.e., failure)."
246);
247
248
249static PyObject *
250sys_getdefaultencoding(PyObject *self)
251{
252    return PyUnicode_FromString(PyUnicode_GetDefaultEncoding());
253}
254
255PyDoc_STRVAR(getdefaultencoding_doc,
256"getdefaultencoding() -> string\n\
257\n\
258Return the current default string encoding used by the Unicode \n\
259implementation."
260);
261
262static PyObject *
263sys_getfilesystemencoding(PyObject *self)
264{
265    if (Py_FileSystemDefaultEncoding)
266        return PyUnicode_FromString(Py_FileSystemDefaultEncoding);
267    PyErr_SetString(PyExc_RuntimeError,
268                    "filesystem encoding is not initialized");
269    return NULL;
270}
271
272PyDoc_STRVAR(getfilesystemencoding_doc,
273"getfilesystemencoding() -> string\n\
274\n\
275Return the encoding used to convert Unicode filenames in\n\
276operating system filenames."
277);
278
279static PyObject *
280sys_intern(PyObject *self, PyObject *args)
281{
282    PyObject *s;
283    if (!PyArg_ParseTuple(args, "U:intern", &s))
284        return NULL;
285    if (PyUnicode_CheckExact(s)) {
286        Py_INCREF(s);
287        PyUnicode_InternInPlace(&s);
288        return s;
289    }
290    else {
291        PyErr_Format(PyExc_TypeError,
292                        "can't intern %.400s", s->ob_type->tp_name);
293        return NULL;
294    }
295}
296
297PyDoc_STRVAR(intern_doc,
298"intern(string) -> string\n\
299\n\
300``Intern'' the given string.  This enters the string in the (global)\n\
301table of interned strings whose purpose is to speed up dictionary lookups.\n\
302Return the string itself or the previously interned string object with the\n\
303same value.");
304
305
306/*
307 * Cached interned string objects used for calling the profile and
308 * trace functions.  Initialized by trace_init().
309 */
310static PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
311
312static int
313trace_init(void)
314{
315    static char *whatnames[7] = {"call", "exception", "line", "return",
316                                    "c_call", "c_exception", "c_return"};
317    PyObject *name;
318    int i;
319    for (i = 0; i < 7; ++i) {
320        if (whatstrings[i] == NULL) {
321            name = PyUnicode_InternFromString(whatnames[i]);
322            if (name == NULL)
323                return -1;
324            whatstrings[i] = name;
325        }
326    }
327    return 0;
328}
329
330
331static PyObject *
332call_trampoline(PyThreadState *tstate, PyObject* callback,
333                PyFrameObject *frame, int what, PyObject *arg)
334{
335    PyObject *args = PyTuple_New(3);
336    PyObject *whatstr;
337    PyObject *result;
338
339    if (args == NULL)
340        return NULL;
341    Py_INCREF(frame);
342    whatstr = whatstrings[what];
343    Py_INCREF(whatstr);
344    if (arg == NULL)
345        arg = Py_None;
346    Py_INCREF(arg);
347    PyTuple_SET_ITEM(args, 0, (PyObject *)frame);
348    PyTuple_SET_ITEM(args, 1, whatstr);
349    PyTuple_SET_ITEM(args, 2, arg);
350
351    /* call the Python-level function */
352    PyFrame_FastToLocals(frame);
353    result = PyEval_CallObject(callback, args);
354    PyFrame_LocalsToFast(frame, 1);
355    if (result == NULL)
356        PyTraceBack_Here(frame);
357
358    /* cleanup */
359    Py_DECREF(args);
360    return result;
361}
362
363static int
364profile_trampoline(PyObject *self, PyFrameObject *frame,
365                   int what, PyObject *arg)
366{
367    PyThreadState *tstate = frame->f_tstate;
368    PyObject *result;
369
370    if (arg == NULL)
371        arg = Py_None;
372    result = call_trampoline(tstate, self, frame, what, arg);
373    if (result == NULL) {
374        PyEval_SetProfile(NULL, NULL);
375        return -1;
376    }
377    Py_DECREF(result);
378    return 0;
379}
380
381static int
382trace_trampoline(PyObject *self, PyFrameObject *frame,
383                 int what, PyObject *arg)
384{
385    PyThreadState *tstate = frame->f_tstate;
386    PyObject *callback;
387    PyObject *result;
388
389    if (what == PyTrace_CALL)
390        callback = self;
391    else
392        callback = frame->f_trace;
393    if (callback == NULL)
394        return 0;
395    result = call_trampoline(tstate, callback, frame, what, arg);
396    if (result == NULL) {
397        PyEval_SetTrace(NULL, NULL);
398        Py_XDECREF(frame->f_trace);
399        frame->f_trace = NULL;
400        return -1;
401    }
402    if (result != Py_None) {
403        PyObject *temp = frame->f_trace;
404        frame->f_trace = NULL;
405        Py_XDECREF(temp);
406        frame->f_trace = result;
407    }
408    else {
409        Py_DECREF(result);
410    }
411    return 0;
412}
413
414static PyObject *
415sys_settrace(PyObject *self, PyObject *args)
416{
417    if (trace_init() == -1)
418        return NULL;
419    if (args == Py_None)
420        PyEval_SetTrace(NULL, NULL);
421    else
422        PyEval_SetTrace(trace_trampoline, args);
423    Py_INCREF(Py_None);
424    return Py_None;
425}
426
427PyDoc_STRVAR(settrace_doc,
428"settrace(function)\n\
429\n\
430Set the global debug tracing function.  It will be called on each\n\
431function call.  See the debugger chapter in the library manual."
432);
433
434static PyObject *
435sys_gettrace(PyObject *self, PyObject *args)
436{
437    PyThreadState *tstate = PyThreadState_GET();
438    PyObject *temp = tstate->c_traceobj;
439
440    if (temp == NULL)
441        temp = Py_None;
442    Py_INCREF(temp);
443    return temp;
444}
445
446PyDoc_STRVAR(gettrace_doc,
447"gettrace()\n\
448\n\
449Return the global debug tracing function set with sys.settrace.\n\
450See the debugger chapter in the library manual."
451);
452
453static PyObject *
454sys_setprofile(PyObject *self, PyObject *args)
455{
456    if (trace_init() == -1)
457        return NULL;
458    if (args == Py_None)
459        PyEval_SetProfile(NULL, NULL);
460    else
461        PyEval_SetProfile(profile_trampoline, args);
462    Py_INCREF(Py_None);
463    return Py_None;
464}
465
466PyDoc_STRVAR(setprofile_doc,
467"setprofile(function)\n\
468\n\
469Set the profiling function.  It will be called on each function call\n\
470and return.  See the profiler chapter in the library manual."
471);
472
473static PyObject *
474sys_getprofile(PyObject *self, PyObject *args)
475{
476    PyThreadState *tstate = PyThreadState_GET();
477    PyObject *temp = tstate->c_profileobj;
478
479    if (temp == NULL)
480        temp = Py_None;
481    Py_INCREF(temp);
482    return temp;
483}
484
485PyDoc_STRVAR(getprofile_doc,
486"getprofile()\n\
487\n\
488Return the profiling function set with sys.setprofile.\n\
489See the profiler chapter in the library manual."
490);
491
492static int _check_interval = 100;
493
494static PyObject *
495sys_setcheckinterval(PyObject *self, PyObject *args)
496{
497    if (PyErr_WarnEx(PyExc_DeprecationWarning,
498                     "sys.getcheckinterval() and sys.setcheckinterval() "
499                     "are deprecated.  Use sys.setswitchinterval() "
500                     "instead.", 1) < 0)
501        return NULL;
502    if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_check_interval))
503        return NULL;
504    Py_INCREF(Py_None);
505    return Py_None;
506}
507
508PyDoc_STRVAR(setcheckinterval_doc,
509"setcheckinterval(n)\n\
510\n\
511Tell the Python interpreter to check for asynchronous events every\n\
512n instructions.  This also affects how often thread switches occur."
513);
514
515static PyObject *
516sys_getcheckinterval(PyObject *self, PyObject *args)
517{
518    if (PyErr_WarnEx(PyExc_DeprecationWarning,
519                     "sys.getcheckinterval() and sys.setcheckinterval() "
520                     "are deprecated.  Use sys.getswitchinterval() "
521                     "instead.", 1) < 0)
522        return NULL;
523    return PyLong_FromLong(_check_interval);
524}
525
526PyDoc_STRVAR(getcheckinterval_doc,
527"getcheckinterval() -> current check interval; see setcheckinterval()."
528);
529
530#ifdef WITH_THREAD
531static PyObject *
532sys_setswitchinterval(PyObject *self, PyObject *args)
533{
534    double d;
535    if (!PyArg_ParseTuple(args, "d:setswitchinterval", &d))
536        return NULL;
537    if (d <= 0.0) {
538        PyErr_SetString(PyExc_ValueError,
539                        "switch interval must be strictly positive");
540        return NULL;
541    }
542    _PyEval_SetSwitchInterval((unsigned long) (1e6 * d));
543    Py_INCREF(Py_None);
544    return Py_None;
545}
546
547PyDoc_STRVAR(setswitchinterval_doc,
548"setswitchinterval(n)\n\
549\n\
550Set the ideal thread switching delay inside the Python interpreter\n\
551The actual frequency of switching threads can be lower if the\n\
552interpreter executes long sequences of uninterruptible code\n\
553(this is implementation-specific and workload-dependent).\n\
554\n\
555The parameter must represent the desired switching delay in seconds\n\
556A typical value is 0.005 (5 milliseconds)."
557);
558
559static PyObject *
560sys_getswitchinterval(PyObject *self, PyObject *args)
561{
562    return PyFloat_FromDouble(1e-6 * _PyEval_GetSwitchInterval());
563}
564
565PyDoc_STRVAR(getswitchinterval_doc,
566"getswitchinterval() -> current thread switch interval; see setswitchinterval()."
567);
568
569#endif /* WITH_THREAD */
570
571#ifdef WITH_TSC
572static PyObject *
573sys_settscdump(PyObject *self, PyObject *args)
574{
575    int bool;
576    PyThreadState *tstate = PyThreadState_Get();
577
578    if (!PyArg_ParseTuple(args, "i:settscdump", &bool))
579        return NULL;
580    if (bool)
581        tstate->interp->tscdump = 1;
582    else
583        tstate->interp->tscdump = 0;
584    Py_INCREF(Py_None);
585    return Py_None;
586
587}
588
589PyDoc_STRVAR(settscdump_doc,
590"settscdump(bool)\n\
591\n\
592If true, tell the Python interpreter to dump VM measurements to\n\
593stderr.  If false, turn off dump.  The measurements are based on the\n\
594processor's time-stamp counter."
595);
596#endif /* TSC */
597
598static PyObject *
599sys_setrecursionlimit(PyObject *self, PyObject *args)
600{
601    int new_limit;
602    if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
603        return NULL;
604    if (new_limit <= 0) {
605        PyErr_SetString(PyExc_ValueError,
606                        "recursion limit must be positive");
607        return NULL;
608    }
609    Py_SetRecursionLimit(new_limit);
610    Py_INCREF(Py_None);
611    return Py_None;
612}
613
614static PyTypeObject Hash_InfoType;
615
616PyDoc_STRVAR(hash_info_doc,
617"hash_info\n\
618\n\
619A struct sequence providing parameters used for computing\n\
620numeric hashes.  The attributes are read only.");
621
622static PyStructSequence_Field hash_info_fields[] = {
623    {"width", "width of the type used for hashing, in bits"},
624    {"modulus", "prime number giving the modulus on which the hash "
625                "function is based"},
626    {"inf", "value to be used for hash of a positive infinity"},
627    {"nan", "value to be used for hash of a nan"},
628    {"imag", "multiplier used for the imaginary part of a complex number"},
629    {NULL, NULL}
630};
631
632static PyStructSequence_Desc hash_info_desc = {
633    "sys.hash_info",
634    hash_info_doc,
635    hash_info_fields,
636    5,
637};
638
639static PyObject *
640get_hash_info(void)
641{
642    PyObject *hash_info;
643    int field = 0;
644    hash_info = PyStructSequence_New(&Hash_InfoType);
645    if (hash_info == NULL)
646        return NULL;
647    PyStructSequence_SET_ITEM(hash_info, field++,
648                              PyLong_FromLong(8*sizeof(Py_hash_t)));
649    PyStructSequence_SET_ITEM(hash_info, field++,
650                              PyLong_FromSsize_t(_PyHASH_MODULUS));
651    PyStructSequence_SET_ITEM(hash_info, field++,
652                              PyLong_FromLong(_PyHASH_INF));
653    PyStructSequence_SET_ITEM(hash_info, field++,
654                              PyLong_FromLong(_PyHASH_NAN));
655    PyStructSequence_SET_ITEM(hash_info, field++,
656                              PyLong_FromLong(_PyHASH_IMAG));
657    if (PyErr_Occurred()) {
658        Py_CLEAR(hash_info);
659        return NULL;
660    }
661    return hash_info;
662}
663
664
665PyDoc_STRVAR(setrecursionlimit_doc,
666"setrecursionlimit(n)\n\
667\n\
668Set the maximum depth of the Python interpreter stack to n.  This\n\
669limit prevents infinite recursion from causing an overflow of the C\n\
670stack and crashing Python.  The highest possible limit is platform-\n\
671dependent."
672);
673
674static PyObject *
675sys_getrecursionlimit(PyObject *self)
676{
677    return PyLong_FromLong(Py_GetRecursionLimit());
678}
679
680PyDoc_STRVAR(getrecursionlimit_doc,
681"getrecursionlimit()\n\
682\n\
683Return the current value of the recursion limit, the maximum depth\n\
684of the Python interpreter stack.  This limit prevents infinite\n\
685recursion from causing an overflow of the C stack and crashing Python."
686);
687
688#ifdef MS_WINDOWS
689PyDoc_STRVAR(getwindowsversion_doc,
690"getwindowsversion()\n\
691\n\
692Return information about the running version of Windows as a named tuple.\n\
693The members are named: major, minor, build, platform, service_pack,\n\
694service_pack_major, service_pack_minor, suite_mask, and product_type. For\n\
695backward compatibility, only the first 5 items are available by indexing.\n\
696All elements are numbers, except service_pack which is a string. Platform\n\
697may be 0 for win32s, 1 for Windows 9x/ME, 2 for Windows NT/2000/XP/Vista/7,\n\
6983 for Windows CE. Product_type may be 1 for a workstation, 2 for a domain\n\
699controller, 3 for a server."
700);
701
702static PyTypeObject WindowsVersionType = {0, 0, 0, 0, 0, 0};
703
704static PyStructSequence_Field windows_version_fields[] = {
705    {"major", "Major version number"},
706    {"minor", "Minor version number"},
707    {"build", "Build number"},
708    {"platform", "Operating system platform"},
709    {"service_pack", "Latest Service Pack installed on the system"},
710    {"service_pack_major", "Service Pack major version number"},
711    {"service_pack_minor", "Service Pack minor version number"},
712    {"suite_mask", "Bit mask identifying available product suites"},
713    {"product_type", "System product type"},
714    {0}
715};
716
717static PyStructSequence_Desc windows_version_desc = {
718    "sys.getwindowsversion",  /* name */
719    getwindowsversion_doc,    /* doc */
720    windows_version_fields,   /* fields */
721    5                         /* For backward compatibility,
722                                 only the first 5 items are accessible
723                                 via indexing, the rest are name only */
724};
725
726static PyObject *
727sys_getwindowsversion(PyObject *self)
728{
729    PyObject *version;
730    int pos = 0;
731    OSVERSIONINFOEX ver;
732    ver.dwOSVersionInfoSize = sizeof(ver);
733    if (!GetVersionEx((OSVERSIONINFO*) &ver))
734        return PyErr_SetFromWindowsErr(0);
735
736    version = PyStructSequence_New(&WindowsVersionType);
737    if (version == NULL)
738        return NULL;
739
740    PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMajorVersion));
741    PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMinorVersion));
742    PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwBuildNumber));
743    PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwPlatformId));
744    PyStructSequence_SET_ITEM(version, pos++, PyUnicode_FromString(ver.szCSDVersion));
745    PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMajor));
746    PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMinor));
747    PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wSuiteMask));
748    PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wProductType));
749
750    return version;
751}
752
753#endif /* MS_WINDOWS */
754
755#ifdef HAVE_DLOPEN
756static PyObject *
757sys_setdlopenflags(PyObject *self, PyObject *args)
758{
759    int new_val;
760    PyThreadState *tstate = PyThreadState_GET();
761    if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
762        return NULL;
763    if (!tstate)
764        return NULL;
765    tstate->interp->dlopenflags = new_val;
766    Py_INCREF(Py_None);
767    return Py_None;
768}
769
770PyDoc_STRVAR(setdlopenflags_doc,
771"setdlopenflags(n) -> None\n\
772\n\
773Set the flags used by the interpreter for dlopen calls, such as when the\n\
774interpreter loads extension modules.  Among other things, this will enable\n\
775a lazy resolving of symbols when importing a module, if called as\n\
776sys.setdlopenflags(0).  To share symbols across extension modules, call as\n\
777sys.setdlopenflags(ctypes.RTLD_GLOBAL).  Symbolic names for the flag modules\n\
778can be found in the os module (RTLD_xxx constants, e.g. os.RTLD_LAZY).");
779
780static PyObject *
781sys_getdlopenflags(PyObject *self, PyObject *args)
782{
783    PyThreadState *tstate = PyThreadState_GET();
784    if (!tstate)
785        return NULL;
786    return PyLong_FromLong(tstate->interp->dlopenflags);
787}
788
789PyDoc_STRVAR(getdlopenflags_doc,
790"getdlopenflags() -> int\n\
791\n\
792Return the current value of the flags that are used for dlopen calls.\n\
793The flag constants are defined in the ctypes and DLFCN modules.");
794
795#endif  /* HAVE_DLOPEN */
796
797#ifdef USE_MALLOPT
798/* Link with -lmalloc (or -lmpc) on an SGI */
799#include <malloc.h>
800
801static PyObject *
802sys_mdebug(PyObject *self, PyObject *args)
803{
804    int flag;
805    if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
806        return NULL;
807    mallopt(M_DEBUG, flag);
808    Py_INCREF(Py_None);
809    return Py_None;
810}
811#endif /* USE_MALLOPT */
812
813static PyObject *
814sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
815{
816    PyObject *res = NULL;
817    static PyObject *gc_head_size = NULL;
818    static char *kwlist[] = {"object", "default", 0};
819    PyObject *o, *dflt = NULL;
820    PyObject *method;
821    _Py_IDENTIFIER(__sizeof__);
822
823    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",
824                                     kwlist, &o, &dflt))
825        return NULL;
826
827    /* Initialize static variable for GC head size */
828    if (gc_head_size == NULL) {
829        gc_head_size = PyLong_FromSsize_t(sizeof(PyGC_Head));
830        if (gc_head_size == NULL)
831            return NULL;
832    }
833
834    /* Make sure the type is initialized. float gets initialized late */
835    if (PyType_Ready(Py_TYPE(o)) < 0)
836        return NULL;
837
838    method = _PyObject_LookupSpecial(o, &PyId___sizeof__);
839    if (method == NULL) {
840        if (!PyErr_Occurred())
841            PyErr_Format(PyExc_TypeError,
842                         "Type %.100s doesn't define __sizeof__",
843                         Py_TYPE(o)->tp_name);
844    }
845    else {
846        res = PyObject_CallFunctionObjArgs(method, NULL);
847        Py_DECREF(method);
848    }
849
850    /* Has a default value been given */
851    if ((res == NULL) && (dflt != NULL) &&
852        PyErr_ExceptionMatches(PyExc_TypeError))
853    {
854        PyErr_Clear();
855        Py_INCREF(dflt);
856        return dflt;
857    }
858    else if (res == NULL)
859        return res;
860
861    /* add gc_head size */
862    if (PyObject_IS_GC(o)) {
863        PyObject *tmp = res;
864        res = PyNumber_Add(tmp, gc_head_size);
865        Py_DECREF(tmp);
866    }
867    return res;
868}
869
870PyDoc_STRVAR(getsizeof_doc,
871"getsizeof(object, default) -> int\n\
872\n\
873Return the size of object in bytes.");
874
875static PyObject *
876sys_getrefcount(PyObject *self, PyObject *arg)
877{
878    return PyLong_FromSsize_t(arg->ob_refcnt);
879}
880
881#ifdef Py_REF_DEBUG
882static PyObject *
883sys_gettotalrefcount(PyObject *self)
884{
885    return PyLong_FromSsize_t(_Py_GetRefTotal());
886}
887#endif /* Py_REF_DEBUG */
888
889PyDoc_STRVAR(getrefcount_doc,
890"getrefcount(object) -> integer\n\
891\n\
892Return the reference count of object.  The count returned is generally\n\
893one higher than you might expect, because it includes the (temporary)\n\
894reference as an argument to getrefcount()."
895);
896
897#ifdef COUNT_ALLOCS
898static PyObject *
899sys_getcounts(PyObject *self)
900{
901    extern PyObject *get_counts(void);
902
903    return get_counts();
904}
905#endif
906
907PyDoc_STRVAR(getframe_doc,
908"_getframe([depth]) -> frameobject\n\
909\n\
910Return a frame object from the call stack.  If optional integer depth is\n\
911given, return the frame object that many calls below the top of the stack.\n\
912If that is deeper than the call stack, ValueError is raised.  The default\n\
913for depth is zero, returning the frame at the top of the call stack.\n\
914\n\
915This function should be used for internal and specialized\n\
916purposes only."
917);
918
919static PyObject *
920sys_getframe(PyObject *self, PyObject *args)
921{
922    PyFrameObject *f = PyThreadState_GET()->frame;
923    int depth = -1;
924
925    if (!PyArg_ParseTuple(args, "|i:_getframe", &depth))
926        return NULL;
927
928    while (depth > 0 && f != NULL) {
929        f = f->f_back;
930        --depth;
931    }
932    if (f == NULL) {
933        PyErr_SetString(PyExc_ValueError,
934                        "call stack is not deep enough");
935        return NULL;
936    }
937    Py_INCREF(f);
938    return (PyObject*)f;
939}
940
941PyDoc_STRVAR(current_frames_doc,
942"_current_frames() -> dictionary\n\
943\n\
944Return a dictionary mapping each current thread T's thread id to T's\n\
945current stack frame.\n\
946\n\
947This function should be used for specialized purposes only."
948);
949
950static PyObject *
951sys_current_frames(PyObject *self, PyObject *noargs)
952{
953    return _PyThread_CurrentFrames();
954}
955
956PyDoc_STRVAR(call_tracing_doc,
957"call_tracing(func, args) -> object\n\
958\n\
959Call func(*args), while tracing is enabled.  The tracing state is\n\
960saved, and restored afterwards.  This is intended to be called from\n\
961a debugger from a checkpoint, to recursively debug some other code."
962);
963
964static PyObject *
965sys_call_tracing(PyObject *self, PyObject *args)
966{
967    PyObject *func, *funcargs;
968    if (!PyArg_ParseTuple(args, "OO!:call_tracing", &func, &PyTuple_Type, &funcargs))
969        return NULL;
970    return _PyEval_CallTracing(func, funcargs);
971}
972
973PyDoc_STRVAR(callstats_doc,
974"callstats() -> tuple of integers\n\
975\n\
976Return a tuple of function call statistics, if CALL_PROFILE was defined\n\
977when Python was built.  Otherwise, return None.\n\
978\n\
979When enabled, this function returns detailed, implementation-specific\n\
980details about the number of function calls executed. The return value is\n\
981a 11-tuple where the entries in the tuple are counts of:\n\
9820. all function calls\n\
9831. calls to PyFunction_Type objects\n\
9842. PyFunction calls that do not create an argument tuple\n\
9853. PyFunction calls that do not create an argument tuple\n\
986   and bypass PyEval_EvalCodeEx()\n\
9874. PyMethod calls\n\
9885. PyMethod calls on bound methods\n\
9896. PyType calls\n\
9907. PyCFunction calls\n\
9918. generator calls\n\
9929. All other calls\n\
99310. Number of stack pops performed by call_function()"
994);
995
996#ifdef __cplusplus
997extern "C" {
998#endif
999
1000static PyObject *
1001sys_debugmallocstats(PyObject *self, PyObject *args)
1002{
1003#ifdef WITH_PYMALLOC
1004    _PyObject_DebugMallocStats(stderr);
1005    fputc('\n', stderr);
1006#endif
1007    _PyObject_DebugTypeStats(stderr);
1008
1009    Py_RETURN_NONE;
1010}
1011PyDoc_STRVAR(debugmallocstats_doc,
1012"_debugmallocstats()\n\
1013\n\
1014Print summary info to stderr about the state of\n\
1015pymalloc's structures.\n\
1016\n\
1017In Py_DEBUG mode, also perform some expensive internal consistency\n\
1018checks.\n\
1019");
1020
1021#ifdef Py_TRACE_REFS
1022/* Defined in objects.c because it uses static globals if that file */
1023extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
1024#endif
1025
1026#ifdef DYNAMIC_EXECUTION_PROFILE
1027/* Defined in ceval.c because it uses static globals if that file */
1028extern PyObject *_Py_GetDXProfile(PyObject *,  PyObject *);
1029#endif
1030
1031#ifdef __cplusplus
1032}
1033#endif
1034
1035static PyObject *
1036sys_clear_type_cache(PyObject* self, PyObject* args)
1037{
1038    PyType_ClearCache();
1039    Py_RETURN_NONE;
1040}
1041
1042PyDoc_STRVAR(sys_clear_type_cache__doc__,
1043"_clear_type_cache() -> None\n\
1044Clear the internal type lookup cache.");
1045
1046
1047static PyMethodDef sys_methods[] = {
1048    /* Might as well keep this in alphabetic order */
1049    {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS,
1050     callstats_doc},
1051    {"_clear_type_cache",       sys_clear_type_cache,     METH_NOARGS,
1052     sys_clear_type_cache__doc__},
1053    {"_current_frames", sys_current_frames, METH_NOARGS,
1054     current_frames_doc},
1055    {"displayhook",     sys_displayhook, METH_O, displayhook_doc},
1056    {"exc_info",        sys_exc_info, METH_NOARGS, exc_info_doc},
1057    {"excepthook",      sys_excepthook, METH_VARARGS, excepthook_doc},
1058    {"exit",            sys_exit, METH_VARARGS, exit_doc},
1059    {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding,
1060     METH_NOARGS, getdefaultencoding_doc},
1061#ifdef HAVE_DLOPEN
1062    {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
1063     getdlopenflags_doc},
1064#endif
1065#ifdef COUNT_ALLOCS
1066    {"getcounts",       (PyCFunction)sys_getcounts, METH_NOARGS},
1067#endif
1068#ifdef DYNAMIC_EXECUTION_PROFILE
1069    {"getdxp",          _Py_GetDXProfile, METH_VARARGS},
1070#endif
1071    {"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding,
1072     METH_NOARGS, getfilesystemencoding_doc},
1073#ifdef Py_TRACE_REFS
1074    {"getobjects",      _Py_GetObjects, METH_VARARGS},
1075#endif
1076#ifdef Py_REF_DEBUG
1077    {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
1078#endif
1079    {"getrefcount",     (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc},
1080    {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
1081     getrecursionlimit_doc},
1082    {"getsizeof",   (PyCFunction)sys_getsizeof,
1083     METH_VARARGS | METH_KEYWORDS, getsizeof_doc},
1084    {"_getframe", sys_getframe, METH_VARARGS, getframe_doc},
1085#ifdef MS_WINDOWS
1086    {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS,
1087     getwindowsversion_doc},
1088#endif /* MS_WINDOWS */
1089    {"intern",          sys_intern,     METH_VARARGS, intern_doc},
1090#ifdef USE_MALLOPT
1091    {"mdebug",          sys_mdebug, METH_VARARGS},
1092#endif
1093    {"setcheckinterval",        sys_setcheckinterval, METH_VARARGS,
1094     setcheckinterval_doc},
1095    {"getcheckinterval",        sys_getcheckinterval, METH_NOARGS,
1096     getcheckinterval_doc},
1097#ifdef WITH_THREAD
1098    {"setswitchinterval",       sys_setswitchinterval, METH_VARARGS,
1099     setswitchinterval_doc},
1100    {"getswitchinterval",       sys_getswitchinterval, METH_NOARGS,
1101     getswitchinterval_doc},
1102#endif
1103#ifdef HAVE_DLOPEN
1104    {"setdlopenflags", sys_setdlopenflags, METH_VARARGS,
1105     setdlopenflags_doc},
1106#endif
1107    {"setprofile",      sys_setprofile, METH_O, setprofile_doc},
1108    {"getprofile",      sys_getprofile, METH_NOARGS, getprofile_doc},
1109    {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
1110     setrecursionlimit_doc},
1111#ifdef WITH_TSC
1112    {"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc},
1113#endif
1114    {"settrace",        sys_settrace, METH_O, settrace_doc},
1115    {"gettrace",        sys_gettrace, METH_NOARGS, gettrace_doc},
1116    {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
1117    {"_debugmallocstats", sys_debugmallocstats, METH_VARARGS,
1118     debugmallocstats_doc},
1119    {NULL,              NULL}           /* sentinel */
1120};
1121
1122static PyObject *
1123list_builtin_module_names(void)
1124{
1125    PyObject *list = PyList_New(0);
1126    int i;
1127    if (list == NULL)
1128        return NULL;
1129    for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1130        PyObject *name = PyUnicode_FromString(
1131            PyImport_Inittab[i].name);
1132        if (name == NULL)
1133            break;
1134        PyList_Append(list, name);
1135        Py_DECREF(name);
1136    }
1137    if (PyList_Sort(list) != 0) {
1138        Py_DECREF(list);
1139        list = NULL;
1140    }
1141    if (list) {
1142        PyObject *v = PyList_AsTuple(list);
1143        Py_DECREF(list);
1144        list = v;
1145    }
1146    return list;
1147}
1148
1149static PyObject *warnoptions = NULL;
1150
1151void
1152PySys_ResetWarnOptions(void)
1153{
1154    if (warnoptions == NULL || !PyList_Check(warnoptions))
1155        return;
1156    PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
1157}
1158
1159void
1160PySys_AddWarnOptionUnicode(PyObject *unicode)
1161{
1162    if (warnoptions == NULL || !PyList_Check(warnoptions)) {
1163        Py_XDECREF(warnoptions);
1164        warnoptions = PyList_New(0);
1165        if (warnoptions == NULL)
1166            return;
1167    }
1168    PyList_Append(warnoptions, unicode);
1169}
1170
1171void
1172PySys_AddWarnOption(const wchar_t *s)
1173{
1174    PyObject *unicode;
1175    unicode = PyUnicode_FromWideChar(s, -1);
1176    if (unicode == NULL)
1177        return;
1178    PySys_AddWarnOptionUnicode(unicode);
1179    Py_DECREF(unicode);
1180}
1181
1182int
1183PySys_HasWarnOptions(void)
1184{
1185    return (warnoptions != NULL && (PyList_Size(warnoptions) > 0)) ? 1 : 0;
1186}
1187
1188static PyObject *xoptions = NULL;
1189
1190static PyObject *
1191get_xoptions(void)
1192{
1193    if (xoptions == NULL || !PyDict_Check(xoptions)) {
1194        Py_XDECREF(xoptions);
1195        xoptions = PyDict_New();
1196    }
1197    return xoptions;
1198}
1199
1200void
1201PySys_AddXOption(const wchar_t *s)
1202{
1203    PyObject *opts;
1204    PyObject *name = NULL, *value = NULL;
1205    const wchar_t *name_end;
1206
1207    opts = get_xoptions();
1208    if (opts == NULL)
1209        goto error;
1210
1211    name_end = wcschr(s, L'=');
1212    if (!name_end) {
1213        name = PyUnicode_FromWideChar(s, -1);
1214        value = Py_True;
1215        Py_INCREF(value);
1216    }
1217    else {
1218        name = PyUnicode_FromWideChar(s, name_end - s);
1219        value = PyUnicode_FromWideChar(name_end + 1, -1);
1220    }
1221    if (name == NULL || value == NULL)
1222        goto error;
1223    PyDict_SetItem(opts, name, value);
1224    Py_DECREF(name);
1225    Py_DECREF(value);
1226    return;
1227
1228error:
1229    Py_XDECREF(name);
1230    Py_XDECREF(value);
1231    /* No return value, therefore clear error state if possible */
1232    if (_Py_atomic_load_relaxed(&_PyThreadState_Current))
1233        PyErr_Clear();
1234}
1235
1236PyObject *
1237PySys_GetXOptions(void)
1238{
1239    return get_xoptions();
1240}
1241
1242/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
1243   Two literals concatenated works just fine.  If you have a K&R compiler
1244   or other abomination that however *does* understand longer strings,
1245   get rid of the !!! comment in the middle and the quotes that surround it. */
1246PyDoc_VAR(sys_doc) =
1247PyDoc_STR(
1248"This module provides access to some objects used or maintained by the\n\
1249interpreter and to functions that interact strongly with the interpreter.\n\
1250\n\
1251Dynamic objects:\n\
1252\n\
1253argv -- command line arguments; argv[0] is the script pathname if known\n\
1254path -- module search path; path[0] is the script directory, else ''\n\
1255modules -- dictionary of loaded modules\n\
1256\n\
1257displayhook -- called to show results in an interactive session\n\
1258excepthook -- called to handle any uncaught exception other than SystemExit\n\
1259  To customize printing in an interactive session or to install a custom\n\
1260  top-level exception handler, assign other functions to replace these.\n\
1261\n\
1262stdin -- standard input file object; used by input()\n\
1263stdout -- standard output file object; used by print()\n\
1264stderr -- standard error object; used for error messages\n\
1265  By assigning other file objects (or objects that behave like files)\n\
1266  to these, it is possible to redirect all of the interpreter's I/O.\n\
1267\n\
1268last_type -- type of last uncaught exception\n\
1269last_value -- value of last uncaught exception\n\
1270last_traceback -- traceback of last uncaught exception\n\
1271  These three are only available in an interactive session after a\n\
1272  traceback has been printed.\n\
1273"
1274)
1275/* concatenating string here */
1276PyDoc_STR(
1277"\n\
1278Static objects:\n\
1279\n\
1280builtin_module_names -- tuple of module names built into this interpreter\n\
1281copyright -- copyright notice pertaining to this interpreter\n\
1282exec_prefix -- prefix used to find the machine-specific Python library\n\
1283executable -- absolute path of the executable binary of the Python interpreter\n\
1284float_info -- a struct sequence with information about the float implementation.\n\
1285float_repr_style -- string indicating the style of repr() output for floats\n\
1286hexversion -- version information encoded as a single integer\n\
1287implementation -- Python implementation information.\n\
1288int_info -- a struct sequence with information about the int implementation.\n\
1289maxsize -- the largest supported length of containers.\n\
1290maxunicode -- the value of the largest Unicode codepoint\n\
1291platform -- platform identifier\n\
1292prefix -- prefix used to find the Python library\n\
1293thread_info -- a struct sequence with information about the thread implementation.\n\
1294version -- the version of this interpreter as a string\n\
1295version_info -- version information as a named tuple\n\
1296"
1297)
1298#ifdef MS_WINDOWS
1299/* concatenating string here */
1300PyDoc_STR(
1301"dllhandle -- [Windows only] integer handle of the Python DLL\n\
1302winver -- [Windows only] version number of the Python DLL\n\
1303"
1304)
1305#endif /* MS_WINDOWS */
1306PyDoc_STR(
1307"__stdin__ -- the original stdin; don't touch!\n\
1308__stdout__ -- the original stdout; don't touch!\n\
1309__stderr__ -- the original stderr; don't touch!\n\
1310__displayhook__ -- the original displayhook; don't touch!\n\
1311__excepthook__ -- the original excepthook; don't touch!\n\
1312\n\
1313Functions:\n\
1314\n\
1315displayhook() -- print an object to the screen, and save it in builtins._\n\
1316excepthook() -- print an exception and its traceback to sys.stderr\n\
1317exc_info() -- return thread-safe information about the current exception\n\
1318exit() -- exit the interpreter by raising SystemExit\n\
1319getdlopenflags() -- returns flags to be used for dlopen() calls\n\
1320getprofile() -- get the global profiling function\n\
1321getrefcount() -- return the reference count for an object (plus one :-)\n\
1322getrecursionlimit() -- return the max recursion depth for the interpreter\n\
1323getsizeof() -- return the size of an object in bytes\n\
1324gettrace() -- get the global debug tracing function\n\
1325setcheckinterval() -- control how often the interpreter checks for events\n\
1326setdlopenflags() -- set the flags to be used for dlopen() calls\n\
1327setprofile() -- set the global profiling function\n\
1328setrecursionlimit() -- set the max recursion depth for the interpreter\n\
1329settrace() -- set the global debug tracing function\n\
1330"
1331)
1332/* end of sys_doc */ ;
1333
1334
1335PyDoc_STRVAR(flags__doc__,
1336"sys.flags\n\
1337\n\
1338Flags provided through command line arguments or environment vars.");
1339
1340static PyTypeObject FlagsType;
1341
1342static PyStructSequence_Field flags_fields[] = {
1343    {"debug",                   "-d"},
1344    {"inspect",                 "-i"},
1345    {"interactive",             "-i"},
1346    {"optimize",                "-O or -OO"},
1347    {"dont_write_bytecode",     "-B"},
1348    {"no_user_site",            "-s"},
1349    {"no_site",                 "-S"},
1350    {"ignore_environment",      "-E"},
1351    {"verbose",                 "-v"},
1352#ifdef RISCOS
1353    {"riscos_wimp",             "???"},
1354#endif
1355    /* {"unbuffered",                   "-u"}, */
1356    /* {"skip_first",                   "-x"}, */
1357    {"bytes_warning",           "-b"},
1358    {"quiet",                   "-q"},
1359    {"hash_randomization",      "-R"},
1360    {0}
1361};
1362
1363static PyStructSequence_Desc flags_desc = {
1364    "sys.flags",        /* name */
1365    flags__doc__,       /* doc */
1366    flags_fields,       /* fields */
1367#ifdef RISCOS
1368    13
1369#else
1370    12
1371#endif
1372};
1373
1374static PyObject*
1375make_flags(void)
1376{
1377    int pos = 0;
1378    PyObject *seq;
1379
1380    seq = PyStructSequence_New(&FlagsType);
1381    if (seq == NULL)
1382        return NULL;
1383
1384#define SetFlag(flag) \
1385    PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag))
1386
1387    SetFlag(Py_DebugFlag);
1388    SetFlag(Py_InspectFlag);
1389    SetFlag(Py_InteractiveFlag);
1390    SetFlag(Py_OptimizeFlag);
1391    SetFlag(Py_DontWriteBytecodeFlag);
1392    SetFlag(Py_NoUserSiteDirectory);
1393    SetFlag(Py_NoSiteFlag);
1394    SetFlag(Py_IgnoreEnvironmentFlag);
1395    SetFlag(Py_VerboseFlag);
1396#ifdef RISCOS
1397    SetFlag(Py_RISCOSWimpFlag);
1398#endif
1399    /* SetFlag(saw_unbuffered_flag); */
1400    /* SetFlag(skipfirstline); */
1401    SetFlag(Py_BytesWarningFlag);
1402    SetFlag(Py_QuietFlag);
1403    SetFlag(Py_HashRandomizationFlag);
1404#undef SetFlag
1405
1406    if (PyErr_Occurred()) {
1407        return NULL;
1408    }
1409    return seq;
1410}
1411
1412PyDoc_STRVAR(version_info__doc__,
1413"sys.version_info\n\
1414\n\
1415Version information as a named tuple.");
1416
1417static PyTypeObject VersionInfoType;
1418
1419static PyStructSequence_Field version_info_fields[] = {
1420    {"major", "Major release number"},
1421    {"minor", "Minor release number"},
1422    {"micro", "Patch release number"},
1423    {"releaselevel", "'alpha', 'beta', 'candidate', or 'release'"},
1424    {"serial", "Serial release number"},
1425    {0}
1426};
1427
1428static PyStructSequence_Desc version_info_desc = {
1429    "sys.version_info",     /* name */
1430    version_info__doc__,    /* doc */
1431    version_info_fields,    /* fields */
1432    5
1433};
1434
1435static PyObject *
1436make_version_info(void)
1437{
1438    PyObject *version_info;
1439    char *s;
1440    int pos = 0;
1441
1442    version_info = PyStructSequence_New(&VersionInfoType);
1443    if (version_info == NULL) {
1444        return NULL;
1445    }
1446
1447    /*
1448     * These release level checks are mutually exclusive and cover
1449     * the field, so don't get too fancy with the pre-processor!
1450     */
1451#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
1452    s = "alpha";
1453#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
1454    s = "beta";
1455#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
1456    s = "candidate";
1457#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
1458    s = "final";
1459#endif
1460
1461#define SetIntItem(flag) \
1462    PyStructSequence_SET_ITEM(version_info, pos++, PyLong_FromLong(flag))
1463#define SetStrItem(flag) \
1464    PyStructSequence_SET_ITEM(version_info, pos++, PyUnicode_FromString(flag))
1465
1466    SetIntItem(PY_MAJOR_VERSION);
1467    SetIntItem(PY_MINOR_VERSION);
1468    SetIntItem(PY_MICRO_VERSION);
1469    SetStrItem(s);
1470    SetIntItem(PY_RELEASE_SERIAL);
1471#undef SetIntItem
1472#undef SetStrItem
1473
1474    if (PyErr_Occurred()) {
1475        Py_CLEAR(version_info);
1476        return NULL;
1477    }
1478    return version_info;
1479}
1480
1481static PyObject *
1482make_impl_info(PyObject *version_info)
1483{
1484    int res;
1485    PyObject *impl_info, *value, *ns;
1486
1487    impl_info = PyDict_New();
1488    if (impl_info == NULL)
1489        return NULL;
1490
1491    /* populate the dict */
1492
1493#define NAME "cpython"
1494#define QUOTE(arg) #arg
1495#define STRIFY(name) QUOTE(name)
1496#define MAJOR STRIFY(PY_MAJOR_VERSION)
1497#define MINOR STRIFY(PY_MINOR_VERSION)
1498#define TAG NAME "-" MAJOR MINOR
1499    value = PyUnicode_FromString(NAME);
1500    if (value == NULL)
1501        goto error;
1502    res = PyDict_SetItemString(impl_info, "name", value);
1503    Py_DECREF(value);
1504    if (res < 0)
1505        goto error;
1506
1507    value = PyUnicode_FromString(TAG);
1508    if (value == NULL)
1509        goto error;
1510    res = PyDict_SetItemString(impl_info, "cache_tag", value);
1511    Py_DECREF(value);
1512    if (res < 0)
1513        goto error;
1514#undef NAME
1515#undef QUOTE
1516#undef STRIFY
1517#undef MAJOR
1518#undef MINOR
1519#undef TAG
1520
1521    res = PyDict_SetItemString(impl_info, "version", version_info);
1522    if (res < 0)
1523        goto error;
1524
1525    value = PyLong_FromLong(PY_VERSION_HEX);
1526    if (value == NULL)
1527        goto error;
1528    res = PyDict_SetItemString(impl_info, "hexversion", value);
1529    Py_DECREF(value);
1530    if (res < 0)
1531        goto error;
1532
1533    /* dict ready */
1534
1535    ns = _PyNamespace_New(impl_info);
1536    Py_DECREF(impl_info);
1537    return ns;
1538
1539error:
1540    Py_CLEAR(impl_info);
1541    return NULL;
1542}
1543
1544static struct PyModuleDef sysmodule = {
1545    PyModuleDef_HEAD_INIT,
1546    "sys",
1547    sys_doc,
1548    -1, /* multiple "initialization" just copies the module dict. */
1549    sys_methods,
1550    NULL,
1551    NULL,
1552    NULL,
1553    NULL
1554};
1555
1556PyObject *
1557_PySys_Init(void)
1558{
1559    PyObject *m, *v, *sysdict, *version_info;
1560    char *s;
1561
1562    m = PyModule_Create(&sysmodule);
1563    if (m == NULL)
1564        return NULL;
1565    sysdict = PyModule_GetDict(m);
1566#define SET_SYS_FROM_STRING(key, value)                 \
1567    v = value;                                          \
1568    if (v != NULL)                                      \
1569        PyDict_SetItemString(sysdict, key, v);          \
1570    Py_XDECREF(v)
1571
1572    /* Check that stdin is not a directory
1573    Using shell redirection, you can redirect stdin to a directory,
1574    crashing the Python interpreter. Catch this common mistake here
1575    and output a useful error message. Note that under MS Windows,
1576    the shell already prevents that. */
1577#if !defined(MS_WINDOWS)
1578    {
1579        struct stat sb;
1580        if (fstat(fileno(stdin), &sb) == 0 &&
1581            S_ISDIR(sb.st_mode)) {
1582            /* There's nothing more we can do. */
1583            /* Py_FatalError() will core dump, so just exit. */
1584            PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n");
1585            exit(EXIT_FAILURE);
1586        }
1587    }
1588#endif
1589
1590    /* stdin/stdout/stderr are now set by pythonrun.c */
1591
1592    PyDict_SetItemString(sysdict, "__displayhook__",
1593                         PyDict_GetItemString(sysdict, "displayhook"));
1594    PyDict_SetItemString(sysdict, "__excepthook__",
1595                         PyDict_GetItemString(sysdict, "excepthook"));
1596    SET_SYS_FROM_STRING("version",
1597                         PyUnicode_FromString(Py_GetVersion()));
1598    SET_SYS_FROM_STRING("hexversion",
1599                         PyLong_FromLong(PY_VERSION_HEX));
1600    SET_SYS_FROM_STRING("_mercurial",
1601                        Py_BuildValue("(szz)", "CPython", _Py_hgidentifier(),
1602                                      _Py_hgversion()));
1603    SET_SYS_FROM_STRING("dont_write_bytecode",
1604                         PyBool_FromLong(Py_DontWriteBytecodeFlag));
1605    SET_SYS_FROM_STRING("api_version",
1606                        PyLong_FromLong(PYTHON_API_VERSION));
1607    SET_SYS_FROM_STRING("copyright",
1608                        PyUnicode_FromString(Py_GetCopyright()));
1609    SET_SYS_FROM_STRING("platform",
1610                        PyUnicode_FromString(Py_GetPlatform()));
1611    SET_SYS_FROM_STRING("executable",
1612                        PyUnicode_FromWideChar(
1613                               Py_GetProgramFullPath(), -1));
1614    SET_SYS_FROM_STRING("prefix",
1615                        PyUnicode_FromWideChar(Py_GetPrefix(), -1));
1616    SET_SYS_FROM_STRING("exec_prefix",
1617                        PyUnicode_FromWideChar(Py_GetExecPrefix(), -1));
1618    SET_SYS_FROM_STRING("base_prefix",
1619                        PyUnicode_FromWideChar(Py_GetPrefix(), -1));
1620    SET_SYS_FROM_STRING("base_exec_prefix",
1621                        PyUnicode_FromWideChar(Py_GetExecPrefix(), -1));
1622    SET_SYS_FROM_STRING("maxsize",
1623                        PyLong_FromSsize_t(PY_SSIZE_T_MAX));
1624    SET_SYS_FROM_STRING("float_info",
1625                        PyFloat_GetInfo());
1626    SET_SYS_FROM_STRING("int_info",
1627                        PyLong_GetInfo());
1628    /* initialize hash_info */
1629    if (Hash_InfoType.tp_name == 0)
1630        PyStructSequence_InitType(&Hash_InfoType, &hash_info_desc);
1631    SET_SYS_FROM_STRING("hash_info",
1632                        get_hash_info());
1633    SET_SYS_FROM_STRING("maxunicode",
1634                        PyLong_FromLong(0x10FFFF));
1635    SET_SYS_FROM_STRING("builtin_module_names",
1636                        list_builtin_module_names());
1637    {
1638        /* Assumes that longs are at least 2 bytes long.
1639           Should be safe! */
1640        unsigned long number = 1;
1641        char *value;
1642
1643        s = (char *) &number;
1644        if (s[0] == 0)
1645            value = "big";
1646        else
1647            value = "little";
1648        SET_SYS_FROM_STRING("byteorder",
1649                            PyUnicode_FromString(value));
1650    }
1651#ifdef MS_COREDLL
1652    SET_SYS_FROM_STRING("dllhandle",
1653                        PyLong_FromVoidPtr(PyWin_DLLhModule));
1654    SET_SYS_FROM_STRING("winver",
1655                        PyUnicode_FromString(PyWin_DLLVersionString));
1656#endif
1657#ifdef ABIFLAGS
1658    SET_SYS_FROM_STRING("abiflags",
1659                        PyUnicode_FromString(ABIFLAGS));
1660#endif
1661    if (warnoptions == NULL) {
1662        warnoptions = PyList_New(0);
1663    }
1664    else {
1665        Py_INCREF(warnoptions);
1666    }
1667    if (warnoptions != NULL) {
1668        PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
1669    }
1670
1671    v = get_xoptions();
1672    if (v != NULL) {
1673        PyDict_SetItemString(sysdict, "_xoptions", v);
1674    }
1675
1676    /* version_info */
1677    if (VersionInfoType.tp_name == 0)
1678        PyStructSequence_InitType(&VersionInfoType, &version_info_desc);
1679    version_info = make_version_info();
1680    SET_SYS_FROM_STRING("version_info", version_info);
1681    /* prevent user from creating new instances */
1682    VersionInfoType.tp_init = NULL;
1683    VersionInfoType.tp_new = NULL;
1684
1685    /* implementation */
1686    SET_SYS_FROM_STRING("implementation", make_impl_info(version_info));
1687
1688    /* flags */
1689    if (FlagsType.tp_name == 0)
1690        PyStructSequence_InitType(&FlagsType, &flags_desc);
1691    SET_SYS_FROM_STRING("flags", make_flags());
1692    /* prevent user from creating new instances */
1693    FlagsType.tp_init = NULL;
1694    FlagsType.tp_new = NULL;
1695
1696
1697#if defined(MS_WINDOWS)
1698    /* getwindowsversion */
1699    if (WindowsVersionType.tp_name == 0)
1700        PyStructSequence_InitType(&WindowsVersionType, &windows_version_desc);
1701    /* prevent user from creating new instances */
1702    WindowsVersionType.tp_init = NULL;
1703    WindowsVersionType.tp_new = NULL;
1704#endif
1705
1706    /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
1707#ifndef PY_NO_SHORT_FLOAT_REPR
1708    SET_SYS_FROM_STRING("float_repr_style",
1709                        PyUnicode_FromString("short"));
1710#else
1711    SET_SYS_FROM_STRING("float_repr_style",
1712                        PyUnicode_FromString("legacy"));
1713#endif
1714
1715#ifdef WITH_THREAD
1716    SET_SYS_FROM_STRING("thread_info", PyThread_GetInfo());
1717#endif
1718
1719#undef SET_SYS_FROM_STRING
1720    if (PyErr_Occurred())
1721        return NULL;
1722    return m;
1723}
1724
1725static PyObject *
1726makepathobject(const wchar_t *path, wchar_t delim)
1727{
1728    int i, n;
1729    const wchar_t *p;
1730    PyObject *v, *w;
1731
1732    n = 1;
1733    p = path;
1734    while ((p = wcschr(p, delim)) != NULL) {
1735        n++;
1736        p++;
1737    }
1738    v = PyList_New(n);
1739    if (v == NULL)
1740        return NULL;
1741    for (i = 0; ; i++) {
1742        p = wcschr(path, delim);
1743        if (p == NULL)
1744            p = path + wcslen(path); /* End of string */
1745        w = PyUnicode_FromWideChar(path, (Py_ssize_t)(p - path));
1746        if (w == NULL) {
1747            Py_DECREF(v);
1748            return NULL;
1749        }
1750        PyList_SetItem(v, i, w);
1751        if (*p == '\0')
1752            break;
1753        path = p+1;
1754    }
1755    return v;
1756}
1757
1758void
1759PySys_SetPath(const wchar_t *path)
1760{
1761    PyObject *v;
1762    if ((v = makepathobject(path, DELIM)) == NULL)
1763        Py_FatalError("can't create sys.path");
1764    if (PySys_SetObject("path", v) != 0)
1765        Py_FatalError("can't assign sys.path");
1766    Py_DECREF(v);
1767}
1768
1769static PyObject *
1770makeargvobject(int argc, wchar_t **argv)
1771{
1772    PyObject *av;
1773    if (argc <= 0 || argv == NULL) {
1774        /* Ensure at least one (empty) argument is seen */
1775        static wchar_t *empty_argv[1] = {L""};
1776        argv = empty_argv;
1777        argc = 1;
1778    }
1779    av = PyList_New(argc);
1780    if (av != NULL) {
1781        int i;
1782        for (i = 0; i < argc; i++) {
1783#ifdef __VMS
1784            PyObject *v;
1785
1786            /* argv[0] is the script pathname if known */
1787            if (i == 0) {
1788                char* fn = decc$translate_vms(argv[0]);
1789                if ((fn == (char *)0) || fn == (char *)-1)
1790                    v = PyUnicode_FromString(argv[0]);
1791                else
1792                    v = PyUnicode_FromString(
1793                        decc$translate_vms(argv[0]));
1794            } else
1795                v = PyUnicode_FromString(argv[i]);
1796#else
1797            PyObject *v = PyUnicode_FromWideChar(argv[i], -1);
1798#endif
1799            if (v == NULL) {
1800                Py_DECREF(av);
1801                av = NULL;
1802                break;
1803            }
1804            PyList_SetItem(av, i, v);
1805        }
1806    }
1807    return av;
1808}
1809
1810#define _HAVE_SCRIPT_ARGUMENT(argc, argv) \
1811  (argc > 0 && argv0 != NULL && \
1812   wcscmp(argv0, L"-c") != 0 && wcscmp(argv0, L"-m") != 0)
1813
1814static void
1815sys_update_path(int argc, wchar_t **argv)
1816{
1817    wchar_t *argv0;
1818    wchar_t *p = NULL;
1819    Py_ssize_t n = 0;
1820    PyObject *a;
1821    PyObject *path;
1822#ifdef HAVE_READLINK
1823    wchar_t link[MAXPATHLEN+1];
1824    wchar_t argv0copy[2*MAXPATHLEN+1];
1825    int nr = 0;
1826#endif
1827#if defined(HAVE_REALPATH)
1828    wchar_t fullpath[MAXPATHLEN];
1829#elif defined(MS_WINDOWS) && !defined(MS_WINCE)
1830    wchar_t fullpath[MAX_PATH];
1831#endif
1832
1833    path = PySys_GetObject("path");
1834    if (path == NULL)
1835        return;
1836
1837    argv0 = argv[0];
1838
1839#ifdef HAVE_READLINK
1840    if (_HAVE_SCRIPT_ARGUMENT(argc, argv))
1841        nr = _Py_wreadlink(argv0, link, MAXPATHLEN);
1842    if (nr > 0) {
1843        /* It's a symlink */
1844        link[nr] = '\0';
1845        if (link[0] == SEP)
1846            argv0 = link; /* Link to absolute path */
1847        else if (wcschr(link, SEP) == NULL)
1848            ; /* Link without path */
1849        else {
1850            /* Must join(dirname(argv0), link) */
1851            wchar_t *q = wcsrchr(argv0, SEP);
1852            if (q == NULL)
1853                argv0 = link; /* argv0 without path */
1854            else {
1855                /* Must make a copy */
1856                wcscpy(argv0copy, argv0);
1857                q = wcsrchr(argv0copy, SEP);
1858                wcscpy(q+1, link);
1859                argv0 = argv0copy;
1860            }
1861        }
1862    }
1863#endif /* HAVE_READLINK */
1864#if SEP == '\\' /* Special case for MS filename syntax */
1865    if (_HAVE_SCRIPT_ARGUMENT(argc, argv)) {
1866        wchar_t *q;
1867#if defined(MS_WINDOWS) && !defined(MS_WINCE)
1868        /* This code here replaces the first element in argv with the full
1869        path that it represents. Under CE, there are no relative paths so
1870        the argument must be the full path anyway. */
1871        wchar_t *ptemp;
1872        if (GetFullPathNameW(argv0,
1873                           Py_ARRAY_LENGTH(fullpath),
1874                           fullpath,
1875                           &ptemp)) {
1876            argv0 = fullpath;
1877        }
1878#endif
1879        p = wcsrchr(argv0, SEP);
1880        /* Test for alternate separator */
1881        q = wcsrchr(p ? p : argv0, '/');
1882        if (q != NULL)
1883            p = q;
1884        if (p != NULL) {
1885            n = p + 1 - argv0;
1886            if (n > 1 && p[-1] != ':')
1887                n--; /* Drop trailing separator */
1888        }
1889    }
1890#else /* All other filename syntaxes */
1891    if (_HAVE_SCRIPT_ARGUMENT(argc, argv)) {
1892#if defined(HAVE_REALPATH)
1893        if (_Py_wrealpath(argv0, fullpath, PATH_MAX)) {
1894            argv0 = fullpath;
1895        }
1896#endif
1897        p = wcsrchr(argv0, SEP);
1898    }
1899    if (p != NULL) {
1900        n = p + 1 - argv0;
1901#if SEP == '/' /* Special case for Unix filename syntax */
1902        if (n > 1)
1903            n--; /* Drop trailing separator */
1904#endif /* Unix */
1905    }
1906#endif /* All others */
1907    a = PyUnicode_FromWideChar(argv0, n);
1908    if (a == NULL)
1909        Py_FatalError("no mem for sys.path insertion");
1910    if (PyList_Insert(path, 0, a) < 0)
1911        Py_FatalError("sys.path.insert(0) failed");
1912    Py_DECREF(a);
1913}
1914
1915void
1916PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
1917{
1918    PyObject *av = makeargvobject(argc, argv);
1919    if (av == NULL)
1920        Py_FatalError("no mem for sys.argv");
1921    if (PySys_SetObject("argv", av) != 0)
1922        Py_FatalError("can't assign sys.argv");
1923    Py_DECREF(av);
1924    if (updatepath)
1925        sys_update_path(argc, argv);
1926}
1927
1928void
1929PySys_SetArgv(int argc, wchar_t **argv)
1930{
1931    PySys_SetArgvEx(argc, argv, 1);
1932}
1933
1934/* Reimplementation of PyFile_WriteString() no calling indirectly
1935   PyErr_CheckSignals(): avoid the call to PyObject_Str(). */
1936
1937static int
1938sys_pyfile_write_unicode(PyObject *unicode, PyObject *file)
1939{
1940    PyObject *writer = NULL, *args = NULL, *result = NULL;
1941    int err;
1942    _Py_IDENTIFIER(write);
1943
1944    if (file == NULL)
1945        return -1;
1946
1947    writer = _PyObject_GetAttrId(file, &PyId_write);
1948    if (writer == NULL)
1949        goto error;
1950
1951    args = PyTuple_Pack(1, unicode);
1952    if (args == NULL)
1953        goto error;
1954
1955    result = PyEval_CallObject(writer, args);
1956    if (result == NULL) {
1957        goto error;
1958    } else {
1959        err = 0;
1960        goto finally;
1961    }
1962
1963error:
1964    err = -1;
1965finally:
1966    Py_XDECREF(writer);
1967    Py_XDECREF(args);
1968    Py_XDECREF(result);
1969    return err;
1970}
1971
1972static int
1973sys_pyfile_write(const char *text, PyObject *file)
1974{
1975    PyObject *unicode = NULL;
1976    int err;
1977
1978    if (file == NULL)
1979        return -1;
1980
1981    unicode = PyUnicode_FromString(text);
1982    if (unicode == NULL)
1983        return -1;
1984
1985    err = sys_pyfile_write_unicode(unicode, file);
1986    Py_DECREF(unicode);
1987    return err;
1988}
1989
1990/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
1991   Adapted from code submitted by Just van Rossum.
1992
1993   PySys_WriteStdout(format, ...)
1994   PySys_WriteStderr(format, ...)
1995
1996      The first function writes to sys.stdout; the second to sys.stderr.  When
1997      there is a problem, they write to the real (C level) stdout or stderr;
1998      no exceptions are raised.
1999
2000      PyErr_CheckSignals() is not called to avoid the execution of the Python
2001      signal handlers: they may raise a new exception whereas sys_write()
2002      ignores all exceptions.
2003
2004      Both take a printf-style format string as their first argument followed
2005      by a variable length argument list determined by the format string.
2006
2007      *** WARNING ***
2008
2009      The format should limit the total size of the formatted output string to
2010      1000 bytes.  In particular, this means that no unrestricted "%s" formats
2011      should occur; these should be limited using "%.<N>s where <N> is a
2012      decimal number calculated so that <N> plus the maximum size of other
2013      formatted text does not exceed 1000 bytes.  Also watch out for "%f",
2014      which can print hundreds of digits for very large numbers.
2015
2016 */
2017
2018static void
2019sys_write(char *name, FILE *fp, const char *format, va_list va)
2020{
2021    PyObject *file;
2022    PyObject *error_type, *error_value, *error_traceback;
2023    char buffer[1001];
2024    int written;
2025
2026    PyErr_Fetch(&error_type, &error_value, &error_traceback);
2027    file = PySys_GetObject(name);
2028    written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
2029    if (sys_pyfile_write(buffer, file) != 0) {
2030        PyErr_Clear();
2031        fputs(buffer, fp);
2032    }
2033    if (written < 0 || (size_t)written >= sizeof(buffer)) {
2034        const char *truncated = "... truncated";
2035        if (sys_pyfile_write(truncated, file) != 0)
2036            fputs(truncated, fp);
2037    }
2038    PyErr_Restore(error_type, error_value, error_traceback);
2039}
2040
2041void
2042PySys_WriteStdout(const char *format, ...)
2043{
2044    va_list va;
2045
2046    va_start(va, format);
2047    sys_write("stdout", stdout, format, va);
2048    va_end(va);
2049}
2050
2051void
2052PySys_WriteStderr(const char *format, ...)
2053{
2054    va_list va;
2055
2056    va_start(va, format);
2057    sys_write("stderr", stderr, format, va);
2058    va_end(va);
2059}
2060
2061static void
2062sys_format(char *name, FILE *fp, const char *format, va_list va)
2063{
2064    PyObject *file, *message;
2065    PyObject *error_type, *error_value, *error_traceback;
2066    char *utf8;
2067
2068    PyErr_Fetch(&error_type, &error_value, &error_traceback);
2069    file = PySys_GetObject(name);
2070    message = PyUnicode_FromFormatV(format, va);
2071    if (message != NULL) {
2072        if (sys_pyfile_write_unicode(message, file) != 0) {
2073            PyErr_Clear();
2074            utf8 = _PyUnicode_AsString(message);
2075            if (utf8 != NULL)
2076                fputs(utf8, fp);
2077        }
2078        Py_DECREF(message);
2079    }
2080    PyErr_Restore(error_type, error_value, error_traceback);
2081}
2082
2083void
2084PySys_FormatStdout(const char *format, ...)
2085{
2086    va_list va;
2087
2088    va_start(va, format);
2089    sys_format("stdout", stdout, format, va);
2090    va_end(va);
2091}
2092
2093void
2094PySys_FormatStderr(const char *format, ...)
2095{
2096    va_list va;
2097
2098    va_start(va, format);
2099    sys_format("stderr", stderr, format, va);
2100    va_end(va);
2101}
2102