sysmodule.c revision 8c6632636807c35bee40210ed8483c1eca82664f
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 "eval.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 MS_WINDOWS
40#include <windows.h>
41#endif
42
43#ifdef HAVE_LANGINFO_H
44#include <locale.h>
45#include <langinfo.h>
46#endif
47
48PyObject *
49PySys_GetObject(const char *name)
50{
51	PyThreadState *tstate = PyThreadState_GET();
52	PyObject *sd = tstate->interp->sysdict;
53	if (sd == NULL)
54		return NULL;
55	return PyDict_GetItemString(sd, name);
56}
57
58int
59PySys_SetObject(const char *name, PyObject *v)
60{
61	PyThreadState *tstate = PyThreadState_GET();
62	PyObject *sd = tstate->interp->sysdict;
63	if (v == NULL) {
64		if (PyDict_GetItemString(sd, name) == NULL)
65			return 0;
66		else
67			return PyDict_DelItemString(sd, name);
68	}
69	else
70		return PyDict_SetItemString(sd, name, v);
71}
72
73static PyObject *
74sys_displayhook(PyObject *self, PyObject *o)
75{
76	PyObject *outf;
77	PyInterpreterState *interp = PyThreadState_GET()->interp;
78	PyObject *modules = interp->modules;
79	PyObject *builtins = PyDict_GetItemString(modules, "__builtin__");
80
81	if (builtins == NULL) {
82		PyErr_SetString(PyExc_RuntimeError, "lost __builtin__");
83		return NULL;
84	}
85
86	/* Print value except if None */
87	/* After printing, also assign to '_' */
88	/* Before, set '_' to None to avoid recursion */
89	if (o == Py_None) {
90		Py_INCREF(Py_None);
91		return Py_None;
92	}
93	if (PyObject_SetAttrString(builtins, "_", Py_None) != 0)
94		return NULL;
95	outf = PySys_GetObject("stdout");
96	if (outf == NULL) {
97		PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
98		return NULL;
99	}
100	if (PyFile_WriteObject(o, outf, 0) != 0)
101		return NULL;
102	if (PyFile_WriteString("\n", outf) != 0)
103		return NULL;
104	if (PyObject_SetAttrString(builtins, "_", o) != 0)
105		return NULL;
106	Py_INCREF(Py_None);
107	return Py_None;
108}
109
110PyDoc_STRVAR(displayhook_doc,
111"displayhook(object) -> None\n"
112"\n"
113"Print an object to sys.stdout and also save it in __builtin__.\n"
114);
115
116static PyObject *
117sys_excepthook(PyObject* self, PyObject* args)
118{
119	PyObject *exc, *value, *tb;
120	if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb))
121		return NULL;
122	PyErr_Display(exc, value, tb);
123	Py_INCREF(Py_None);
124	return Py_None;
125}
126
127PyDoc_STRVAR(excepthook_doc,
128"excepthook(exctype, value, traceback) -> None\n"
129"\n"
130"Handle an exception by displaying it with a traceback on sys.stderr.\n"
131);
132
133static PyObject *
134sys_exc_info(PyObject *self, PyObject *noargs)
135{
136	PyThreadState *tstate;
137	tstate = PyThreadState_GET();
138	return Py_BuildValue(
139		"(OOO)",
140		tstate->exc_type != NULL ? tstate->exc_type : Py_None,
141		tstate->exc_value != NULL ? tstate->exc_value : Py_None,
142		tstate->exc_traceback != NULL ?
143			tstate->exc_traceback : Py_None);
144}
145
146PyDoc_STRVAR(exc_info_doc,
147"exc_info() -> (type, value, traceback)\n\
148\n\
149Return information about the most recent exception caught by an except\n\
150clause in the current stack frame or in an older stack frame."
151);
152
153static PyObject *
154sys_exit(PyObject *self, PyObject *args)
155{
156	PyObject *exit_code = 0;
157	if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
158		return NULL;
159	/* Raise SystemExit so callers may catch it or clean up. */
160	PyErr_SetObject(PyExc_SystemExit, exit_code);
161	return NULL;
162}
163
164PyDoc_STRVAR(exit_doc,
165"exit([status])\n\
166\n\
167Exit the interpreter by raising SystemExit(status).\n\
168If the status is omitted or None, it defaults to zero (i.e., success).\n\
169If the status is numeric, it will be used as the system exit status.\n\
170If it is another kind of object, it will be printed and the system\n\
171exit status will be one (i.e., failure)."
172);
173
174
175static PyObject *
176sys_getdefaultencoding(PyObject *self)
177{
178	return PyUnicode_FromString(PyUnicode_GetDefaultEncoding());
179}
180
181PyDoc_STRVAR(getdefaultencoding_doc,
182"getdefaultencoding() -> string\n\
183\n\
184Return the current default string encoding used by the Unicode \n\
185implementation."
186);
187
188static PyObject *
189sys_setdefaultencoding(PyObject *self, PyObject *args)
190{
191	char *encoding;
192	if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding))
193		return NULL;
194	if (PyUnicode_SetDefaultEncoding(encoding))
195	    	return NULL;
196	Py_INCREF(Py_None);
197	return Py_None;
198}
199
200PyDoc_STRVAR(setdefaultencoding_doc,
201"setdefaultencoding(encoding)\n\
202\n\
203Set the current default string encoding used by the Unicode implementation."
204);
205
206static PyObject *
207sys_getfilesystemencoding(PyObject *self)
208{
209	if (Py_FileSystemDefaultEncoding)
210		return PyUnicode_FromString(Py_FileSystemDefaultEncoding);
211	Py_INCREF(Py_None);
212	return Py_None;
213}
214
215PyDoc_STRVAR(getfilesystemencoding_doc,
216"getfilesystemencoding() -> string\n\
217\n\
218Return the encoding used to convert Unicode filenames in\n\
219operating system filenames."
220);
221
222
223
224static PyObject *
225sys_intern(PyObject *self, PyObject *args)
226{
227	PyObject *s;
228	if (!PyArg_ParseTuple(args, "S:intern", &s))
229		return NULL;
230	if (PyString_CheckExact(s)) {
231		Py_INCREF(s);
232		PyString_InternInPlace(&s);
233		return s;
234	}
235	else if (PyUnicode_CheckExact(s)) {
236		Py_INCREF(s);
237		PyUnicode_InternInPlace(&s);
238		return s;
239	}
240	else {
241		PyErr_Format(PyExc_TypeError,
242				"can't intern %.400s", s->ob_type->tp_name);
243		return NULL;
244	}
245}
246
247PyDoc_STRVAR(intern_doc,
248"intern(string) -> string\n\
249\n\
250``Intern'' the given string.  This enters the string in the (global)\n\
251table of interned strings whose purpose is to speed up dictionary lookups.\n\
252Return the string itself or the previously interned string object with the\n\
253same value.");
254
255
256/*
257 * Cached interned string objects used for calling the profile and
258 * trace functions.  Initialized by trace_init().
259 */
260static PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
261
262static int
263trace_init(void)
264{
265	static char *whatnames[7] = {"call", "exception", "line", "return",
266					"c_call", "c_exception", "c_return"};
267	PyObject *name;
268	int i;
269	for (i = 0; i < 7; ++i) {
270		if (whatstrings[i] == NULL) {
271			name = PyUnicode_InternFromString(whatnames[i]);
272			if (name == NULL)
273				return -1;
274			whatstrings[i] = name;
275                }
276	}
277	return 0;
278}
279
280
281static PyObject *
282call_trampoline(PyThreadState *tstate, PyObject* callback,
283		PyFrameObject *frame, int what, PyObject *arg)
284{
285	PyObject *args = PyTuple_New(3);
286	PyObject *whatstr;
287	PyObject *result;
288
289	if (args == NULL)
290		return NULL;
291	Py_INCREF(frame);
292	whatstr = whatstrings[what];
293	Py_INCREF(whatstr);
294	if (arg == NULL)
295		arg = Py_None;
296	Py_INCREF(arg);
297	PyTuple_SET_ITEM(args, 0, (PyObject *)frame);
298	PyTuple_SET_ITEM(args, 1, whatstr);
299	PyTuple_SET_ITEM(args, 2, arg);
300
301	/* call the Python-level function */
302	PyFrame_FastToLocals(frame);
303	result = PyEval_CallObject(callback, args);
304	PyFrame_LocalsToFast(frame, 1);
305	if (result == NULL)
306		PyTraceBack_Here(frame);
307
308	/* cleanup */
309	Py_DECREF(args);
310	return result;
311}
312
313static int
314profile_trampoline(PyObject *self, PyFrameObject *frame,
315		   int what, PyObject *arg)
316{
317	PyThreadState *tstate = frame->f_tstate;
318	PyObject *result;
319
320	if (arg == NULL)
321		arg = Py_None;
322	result = call_trampoline(tstate, self, frame, what, arg);
323	if (result == NULL) {
324		PyEval_SetProfile(NULL, NULL);
325		return -1;
326	}
327	Py_DECREF(result);
328	return 0;
329}
330
331static int
332trace_trampoline(PyObject *self, PyFrameObject *frame,
333		 int what, PyObject *arg)
334{
335	PyThreadState *tstate = frame->f_tstate;
336	PyObject *callback;
337	PyObject *result;
338
339	if (what == PyTrace_CALL)
340		callback = self;
341	else
342		callback = frame->f_trace;
343	if (callback == NULL)
344		return 0;
345	result = call_trampoline(tstate, callback, frame, what, arg);
346	if (result == NULL) {
347		PyEval_SetTrace(NULL, NULL);
348		Py_XDECREF(frame->f_trace);
349		frame->f_trace = NULL;
350		return -1;
351	}
352	if (result != Py_None) {
353		PyObject *temp = frame->f_trace;
354		frame->f_trace = NULL;
355		Py_XDECREF(temp);
356		frame->f_trace = result;
357	}
358	else {
359		Py_DECREF(result);
360	}
361	return 0;
362}
363
364static PyObject *
365sys_settrace(PyObject *self, PyObject *args)
366{
367	if (trace_init() == -1)
368		return NULL;
369	if (args == Py_None)
370		PyEval_SetTrace(NULL, NULL);
371	else
372		PyEval_SetTrace(trace_trampoline, args);
373	Py_INCREF(Py_None);
374	return Py_None;
375}
376
377PyDoc_STRVAR(settrace_doc,
378"settrace(function)\n\
379\n\
380Set the global debug tracing function.  It will be called on each\n\
381function call.  See the debugger chapter in the library manual."
382);
383
384static PyObject *
385sys_setprofile(PyObject *self, PyObject *args)
386{
387	if (trace_init() == -1)
388		return NULL;
389	if (args == Py_None)
390		PyEval_SetProfile(NULL, NULL);
391	else
392		PyEval_SetProfile(profile_trampoline, args);
393	Py_INCREF(Py_None);
394	return Py_None;
395}
396
397PyDoc_STRVAR(setprofile_doc,
398"setprofile(function)\n\
399\n\
400Set the profiling function.  It will be called on each function call\n\
401and return.  See the profiler chapter in the library manual."
402);
403
404static PyObject *
405sys_setcheckinterval(PyObject *self, PyObject *args)
406{
407	if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_Py_CheckInterval))
408		return NULL;
409	Py_INCREF(Py_None);
410	return Py_None;
411}
412
413PyDoc_STRVAR(setcheckinterval_doc,
414"setcheckinterval(n)\n\
415\n\
416Tell the Python interpreter to check for asynchronous events every\n\
417n instructions.  This also affects how often thread switches occur."
418);
419
420static PyObject *
421sys_getcheckinterval(PyObject *self, PyObject *args)
422{
423	return PyInt_FromLong(_Py_CheckInterval);
424}
425
426PyDoc_STRVAR(getcheckinterval_doc,
427"getcheckinterval() -> current check interval; see setcheckinterval()."
428);
429
430#ifdef WITH_TSC
431static PyObject *
432sys_settscdump(PyObject *self, PyObject *args)
433{
434	int bool;
435	PyThreadState *tstate = PyThreadState_Get();
436
437	if (!PyArg_ParseTuple(args, "i:settscdump", &bool))
438		return NULL;
439	if (bool)
440		tstate->interp->tscdump = 1;
441	else
442		tstate->interp->tscdump = 0;
443	Py_INCREF(Py_None);
444	return Py_None;
445
446}
447
448PyDoc_STRVAR(settscdump_doc,
449"settscdump(bool)\n\
450\n\
451If true, tell the Python interpreter to dump VM measurements to\n\
452stderr.  If false, turn off dump.  The measurements are based on the\n\
453processor's time-stamp counter."
454);
455#endif /* TSC */
456
457static PyObject *
458sys_setrecursionlimit(PyObject *self, PyObject *args)
459{
460	int new_limit;
461	if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
462		return NULL;
463	if (new_limit <= 0) {
464		PyErr_SetString(PyExc_ValueError,
465				"recursion limit must be positive");
466		return NULL;
467	}
468	Py_SetRecursionLimit(new_limit);
469	Py_INCREF(Py_None);
470	return Py_None;
471}
472
473PyDoc_STRVAR(setrecursionlimit_doc,
474"setrecursionlimit(n)\n\
475\n\
476Set the maximum depth of the Python interpreter stack to n.  This\n\
477limit prevents infinite recursion from causing an overflow of the C\n\
478stack and crashing Python.  The highest possible limit is platform-\n\
479dependent."
480);
481
482static PyObject *
483sys_getrecursionlimit(PyObject *self)
484{
485	return PyInt_FromLong(Py_GetRecursionLimit());
486}
487
488PyDoc_STRVAR(getrecursionlimit_doc,
489"getrecursionlimit()\n\
490\n\
491Return the current value of the recursion limit, the maximum depth\n\
492of the Python interpreter stack.  This limit prevents infinite\n\
493recursion from causing an overflow of the C stack and crashing Python."
494);
495
496#ifdef MS_WINDOWS
497PyDoc_STRVAR(getwindowsversion_doc,
498"getwindowsversion()\n\
499\n\
500Return information about the running version of Windows.\n\
501The result is a tuple of (major, minor, build, platform, text)\n\
502All elements are numbers, except text which is a string.\n\
503Platform may be 0 for win32s, 1 for Windows 9x/ME, 2 for Windows NT/2000/XP\n\
504"
505);
506
507static PyObject *
508sys_getwindowsversion(PyObject *self)
509{
510	OSVERSIONINFO ver;
511	ver.dwOSVersionInfoSize = sizeof(ver);
512	if (!GetVersionEx(&ver))
513		return PyErr_SetFromWindowsErr(0);
514	return Py_BuildValue("HHHHs",
515	                     ver.dwMajorVersion,
516	                     ver.dwMinorVersion,
517	                     ver.dwBuildNumber,
518	                     ver.dwPlatformId,
519	                     ver.szCSDVersion);
520}
521
522#endif /* MS_WINDOWS */
523
524#ifdef HAVE_DLOPEN
525static PyObject *
526sys_setdlopenflags(PyObject *self, PyObject *args)
527{
528	int new_val;
529        PyThreadState *tstate = PyThreadState_GET();
530	if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
531		return NULL;
532        if (!tstate)
533		return NULL;
534        tstate->interp->dlopenflags = new_val;
535	Py_INCREF(Py_None);
536	return Py_None;
537}
538
539PyDoc_STRVAR(setdlopenflags_doc,
540"setdlopenflags(n) -> None\n\
541\n\
542Set the flags that will be used for dlopen() calls. Among other\n\
543things, this will enable a lazy resolving of symbols when importing\n\
544a module, if called as sys.setdlopenflags(0)\n\
545To share symbols across extension modules, call as\n\
546sys.setdlopenflags(dl.RTLD_NOW|dl.RTLD_GLOBAL)"
547);
548
549static PyObject *
550sys_getdlopenflags(PyObject *self, PyObject *args)
551{
552        PyThreadState *tstate = PyThreadState_GET();
553        if (!tstate)
554		return NULL;
555        return PyInt_FromLong(tstate->interp->dlopenflags);
556}
557
558PyDoc_STRVAR(getdlopenflags_doc,
559"getdlopenflags() -> int\n\
560\n\
561Return the current value of the flags that are used for dlopen()\n\
562calls. The flag constants are defined in the dl module."
563);
564#endif
565
566#ifdef USE_MALLOPT
567/* Link with -lmalloc (or -lmpc) on an SGI */
568#include <malloc.h>
569
570static PyObject *
571sys_mdebug(PyObject *self, PyObject *args)
572{
573	int flag;
574	if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
575		return NULL;
576	mallopt(M_DEBUG, flag);
577	Py_INCREF(Py_None);
578	return Py_None;
579}
580#endif /* USE_MALLOPT */
581
582static PyObject *
583sys_getrefcount(PyObject *self, PyObject *arg)
584{
585	return PyInt_FromSsize_t(arg->ob_refcnt);
586}
587
588#ifdef Py_REF_DEBUG
589static PyObject *
590sys_gettotalrefcount(PyObject *self)
591{
592	return PyInt_FromSsize_t(_Py_GetRefTotal());
593}
594#endif /* Py_REF_DEBUG */
595
596PyDoc_STRVAR(getrefcount_doc,
597"getrefcount(object) -> integer\n\
598\n\
599Return the reference count of object.  The count returned is generally\n\
600one higher than you might expect, because it includes the (temporary)\n\
601reference as an argument to getrefcount()."
602);
603
604#ifdef COUNT_ALLOCS
605static PyObject *
606sys_getcounts(PyObject *self)
607{
608	extern PyObject *get_counts(void);
609
610	return get_counts();
611}
612#endif
613
614PyDoc_STRVAR(getframe_doc,
615"_getframe([depth]) -> frameobject\n\
616\n\
617Return a frame object from the call stack.  If optional integer depth is\n\
618given, return the frame object that many calls below the top of the stack.\n\
619If that is deeper than the call stack, ValueError is raised.  The default\n\
620for depth is zero, returning the frame at the top of the call stack.\n\
621\n\
622This function should be used for internal and specialized\n\
623purposes only."
624);
625
626static PyObject *
627sys_getframe(PyObject *self, PyObject *args)
628{
629	PyFrameObject *f = PyThreadState_GET()->frame;
630	int depth = -1;
631
632	if (!PyArg_ParseTuple(args, "|i:_getframe", &depth))
633		return NULL;
634
635	while (depth > 0 && f != NULL) {
636		f = f->f_back;
637		--depth;
638	}
639	if (f == NULL) {
640		PyErr_SetString(PyExc_ValueError,
641				"call stack is not deep enough");
642		return NULL;
643	}
644	Py_INCREF(f);
645	return (PyObject*)f;
646}
647
648PyDoc_STRVAR(current_frames_doc,
649"_current_frames() -> dictionary\n\
650\n\
651Return a dictionary mapping each current thread T's thread id to T's\n\
652current stack frame.\n\
653\n\
654This function should be used for specialized purposes only."
655);
656
657static PyObject *
658sys_current_frames(PyObject *self, PyObject *noargs)
659{
660	return _PyThread_CurrentFrames();
661}
662
663/* sys_formatter_iterator is used to implement
664   string.Formatter.vformat.  it parses a string and returns tuples
665   describing the parsed elements.  see unicodeobject.c's
666   _unicodeformatter_iterator for details */
667static PyObject *
668sys_formatter_iterator(PyObject *self, PyObject *args)
669{
670        /* in 2.6, check type and dispatch to unicode or string
671           accordingly */
672        PyObject *str;
673
674        if (!PyArg_ParseTuple(args, "O:_formatter_iterator", &str))
675                return NULL;
676
677        if (!PyUnicode_Check(str)) {
678                PyErr_SetString(PyExc_TypeError,
679                                "_formatter_iterator expects unicode object");
680                return NULL;
681        }
682
683        return _unicodeformatter_iterator(str);
684}
685
686/* sys_formatter_lookup is used to implement string.Formatter.vformat.
687   it takes an PEP 3101 "field name", args, and kwargs, and returns a
688   tuple (index, name, object).  see unicodeobject.c's
689   _unicodeformatter_lookup for details */
690static PyObject *
691sys_formatter_lookup(PyObject *self, PyObject *args)
692{
693        PyObject *field_name;
694        PyObject *arg_args;
695        PyObject *kwargs;
696
697        if (!PyArg_ParseTuple(args, "OOO:_formatter_lookup", &field_name,
698                              &arg_args, &kwargs))
699                return NULL;
700
701        if (!PyUnicode_Check(field_name)) {
702                PyErr_SetString(PyExc_TypeError,
703                                "_formatter_lookup expects unicode object");
704                return NULL;
705        }
706
707        return _unicodeformatter_lookup(field_name, arg_args, kwargs);
708}
709
710
711PyDoc_STRVAR(call_tracing_doc,
712"call_tracing(func, args) -> object\n\
713\n\
714Call func(*args), while tracing is enabled.  The tracing state is\n\
715saved, and restored afterwards.  This is intended to be called from\n\
716a debugger from a checkpoint, to recursively debug some other code."
717);
718
719static PyObject *
720sys_call_tracing(PyObject *self, PyObject *args)
721{
722	PyObject *func, *funcargs;
723	if (!PyArg_UnpackTuple(args, "call_tracing", 2, 2, &func, &funcargs))
724		return NULL;
725	return _PyEval_CallTracing(func, funcargs);
726}
727
728PyDoc_STRVAR(callstats_doc,
729"callstats() -> tuple of integers\n\
730\n\
731Return a tuple of function call statistics, if CALL_PROFILE was defined\n\
732when Python was built.  Otherwise, return None.\n\
733\n\
734When enabled, this function returns detailed, implementation-specific\n\
735details about the number of function calls executed. The return value is\n\
736a 11-tuple where the entries in the tuple are counts of:\n\
7370. all function calls\n\
7381. calls to PyFunction_Type objects\n\
7392. PyFunction calls that do not create an argument tuple\n\
7403. PyFunction calls that do not create an argument tuple\n\
741   and bypass PyEval_EvalCodeEx()\n\
7424. PyMethod calls\n\
7435. PyMethod calls on bound methods\n\
7446. PyType calls\n\
7457. PyCFunction calls\n\
7468. generator calls\n\
7479. All other calls\n\
74810. Number of stack pops performed by call_function()"
749);
750
751#ifdef __cplusplus
752extern "C" {
753#endif
754
755#ifdef Py_TRACE_REFS
756/* Defined in objects.c because it uses static globals if that file */
757extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
758#endif
759
760#ifdef DYNAMIC_EXECUTION_PROFILE
761/* Defined in ceval.c because it uses static globals if that file */
762extern PyObject *_Py_GetDXProfile(PyObject *,  PyObject *);
763#endif
764
765#ifdef __cplusplus
766}
767#endif
768
769static PyMethodDef sys_methods[] = {
770	/* Might as well keep this in alphabetic order */
771	{"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS,
772	 callstats_doc},
773	{"_current_frames", sys_current_frames, METH_NOARGS,
774	 current_frames_doc},
775        {"_formatter_parser", sys_formatter_iterator, METH_VARARGS},
776        {"_formatter_lookup", sys_formatter_lookup, METH_VARARGS},
777	{"displayhook",	sys_displayhook, METH_O, displayhook_doc},
778	{"exc_info",	sys_exc_info, METH_NOARGS, exc_info_doc},
779	{"excepthook",	sys_excepthook, METH_VARARGS, excepthook_doc},
780	{"exit",	sys_exit, METH_VARARGS, exit_doc},
781	{"getdefaultencoding", (PyCFunction)sys_getdefaultencoding,
782	 METH_NOARGS, getdefaultencoding_doc},
783#ifdef HAVE_DLOPEN
784	{"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
785	 getdlopenflags_doc},
786#endif
787#ifdef COUNT_ALLOCS
788	{"getcounts",	(PyCFunction)sys_getcounts, METH_NOARGS},
789#endif
790#ifdef DYNAMIC_EXECUTION_PROFILE
791	{"getdxp",	_Py_GetDXProfile, METH_VARARGS},
792#endif
793	{"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding,
794	 METH_NOARGS, getfilesystemencoding_doc},
795#ifdef Py_TRACE_REFS
796	{"getobjects",	_Py_GetObjects, METH_VARARGS},
797#endif
798#ifdef Py_REF_DEBUG
799	{"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
800#endif
801	{"getrefcount",	(PyCFunction)sys_getrefcount, METH_O, getrefcount_doc},
802	{"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
803	 getrecursionlimit_doc},
804	{"_getframe", sys_getframe, METH_VARARGS, getframe_doc},
805#ifdef MS_WINDOWS
806	{"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS,
807	 getwindowsversion_doc},
808#endif /* MS_WINDOWS */
809 	{"intern",	sys_intern,     METH_VARARGS, intern_doc},
810#ifdef USE_MALLOPT
811	{"mdebug",	sys_mdebug, METH_VARARGS},
812#endif
813	{"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
814	 setdefaultencoding_doc},
815	{"setcheckinterval",	sys_setcheckinterval, METH_VARARGS,
816	 setcheckinterval_doc},
817	{"getcheckinterval",	sys_getcheckinterval, METH_NOARGS,
818	 getcheckinterval_doc},
819#ifdef HAVE_DLOPEN
820	{"setdlopenflags", sys_setdlopenflags, METH_VARARGS,
821	 setdlopenflags_doc},
822#endif
823	{"setprofile",	sys_setprofile, METH_O, setprofile_doc},
824	{"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
825	 setrecursionlimit_doc},
826#ifdef WITH_TSC
827	{"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc},
828#endif
829	{"settrace",	sys_settrace, METH_O, settrace_doc},
830	{"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
831	{NULL,		NULL}		/* sentinel */
832};
833
834static PyObject *
835list_builtin_module_names(void)
836{
837	PyObject *list = PyList_New(0);
838	int i;
839	if (list == NULL)
840		return NULL;
841	for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
842		PyObject *name = PyUnicode_FromString(
843			PyImport_Inittab[i].name);
844		if (name == NULL)
845			break;
846		PyList_Append(list, name);
847		Py_DECREF(name);
848	}
849	if (PyList_Sort(list) != 0) {
850		Py_DECREF(list);
851		list = NULL;
852	}
853	if (list) {
854		PyObject *v = PyList_AsTuple(list);
855		Py_DECREF(list);
856		list = v;
857	}
858	return list;
859}
860
861static PyObject *warnoptions = NULL;
862
863void
864PySys_ResetWarnOptions(void)
865{
866	if (warnoptions == NULL || !PyList_Check(warnoptions))
867		return;
868	PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
869}
870
871void
872PySys_AddWarnOption(const char *s)
873{
874	PyObject *str;
875
876	if (warnoptions == NULL || !PyList_Check(warnoptions)) {
877		Py_XDECREF(warnoptions);
878		warnoptions = PyList_New(0);
879		if (warnoptions == NULL)
880			return;
881	}
882	str = PyUnicode_FromString(s);
883	if (str != NULL) {
884		PyList_Append(warnoptions, str);
885		Py_DECREF(str);
886	}
887}
888
889/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
890   Two literals concatenated works just fine.  If you have a K&R compiler
891   or other abomination that however *does* understand longer strings,
892   get rid of the !!! comment in the middle and the quotes that surround it. */
893PyDoc_VAR(sys_doc) =
894PyDoc_STR(
895"This module provides access to some objects used or maintained by the\n\
896interpreter and to functions that interact strongly with the interpreter.\n\
897\n\
898Dynamic objects:\n\
899\n\
900argv -- command line arguments; argv[0] is the script pathname if known\n\
901path -- module search path; path[0] is the script directory, else ''\n\
902modules -- dictionary of loaded modules\n\
903\n\
904displayhook -- called to show results in an interactive session\n\
905excepthook -- called to handle any uncaught exception other than SystemExit\n\
906  To customize printing in an interactive session or to install a custom\n\
907  top-level exception handler, assign other functions to replace these.\n\
908\n\
909stdin -- standard input file object; used by raw_input() and input()\n\
910stdout -- standard output file object; used by print()\n\
911stderr -- standard error object; used for error messages\n\
912  By assigning other file objects (or objects that behave like files)\n\
913  to these, it is possible to redirect all of the interpreter's I/O.\n\
914\n\
915last_type -- type of last uncaught exception\n\
916last_value -- value of last uncaught exception\n\
917last_traceback -- traceback of last uncaught exception\n\
918  These three are only available in an interactive session after a\n\
919  traceback has been printed.\n\
920"
921)
922/* concatenating string here */
923PyDoc_STR(
924"\n\
925Static objects:\n\
926\n\
927maxint -- the largest supported integer (the smallest is -maxint-1)\n\
928maxunicode -- the largest supported character\n\
929builtin_module_names -- tuple of module names built into this interpreter\n\
930version -- the version of this interpreter as a string\n\
931version_info -- version information as a tuple\n\
932hexversion -- version information encoded as a single integer\n\
933copyright -- copyright notice pertaining to this interpreter\n\
934platform -- platform identifier\n\
935executable -- pathname of this Python interpreter\n\
936prefix -- prefix used to find the Python library\n\
937exec_prefix -- prefix used to find the machine-specific Python library\n\
938"
939)
940#ifdef MS_WINDOWS
941/* concatenating string here */
942PyDoc_STR(
943"dllhandle -- [Windows only] integer handle of the Python DLL\n\
944winver -- [Windows only] version number of the Python DLL\n\
945"
946)
947#endif /* MS_WINDOWS */
948PyDoc_STR(
949"__stdin__ -- the original stdin; don't touch!\n\
950__stdout__ -- the original stdout; don't touch!\n\
951__stderr__ -- the original stderr; don't touch!\n\
952__displayhook__ -- the original displayhook; don't touch!\n\
953__excepthook__ -- the original excepthook; don't touch!\n\
954\n\
955Functions:\n\
956\n\
957displayhook() -- print an object to the screen, and save it in __builtin__._\n\
958excepthook() -- print an exception and its traceback to sys.stderr\n\
959exc_info() -- return thread-safe information about the current exception\n\
960exit() -- exit the interpreter by raising SystemExit\n\
961getdlopenflags() -- returns flags to be used for dlopen() calls\n\
962getrefcount() -- return the reference count for an object (plus one :-)\n\
963getrecursionlimit() -- return the max recursion depth for the interpreter\n\
964setcheckinterval() -- control how often the interpreter checks for events\n\
965setdlopenflags() -- set the flags to be used for dlopen() calls\n\
966setprofile() -- set the global profiling function\n\
967setrecursionlimit() -- set the max recursion depth for the interpreter\n\
968settrace() -- set the global debug tracing function\n\
969"
970)
971/* end of sys_doc */ ;
972
973/* Subversion branch and revision management */
974static const char _patchlevel_revision[] = PY_PATCHLEVEL_REVISION;
975static const char headurl[] = "$HeadURL$";
976static int svn_initialized;
977static char patchlevel_revision[50]; /* Just the number */
978static char branch[50];
979static char shortbranch[50];
980static const char *svn_revision;
981
982static void
983svnversion_init(void)
984{
985	const char *python, *br_start, *br_end, *br_end2, *svnversion;
986	Py_ssize_t len;
987	int istag = 0;
988
989	if (svn_initialized)
990		return;
991
992	python = strstr(headurl, "/python/");
993	if (!python) {
994		strcpy(branch, "unknown branch");
995		strcpy(shortbranch, "unknown");
996	}
997	else {
998		br_start = python + 8;
999		br_end = strchr(br_start, '/');
1000		assert(br_end);
1001
1002		/* Works even for trunk,
1003		   as we are in trunk/Python/sysmodule.c */
1004		br_end2 = strchr(br_end+1, '/');
1005
1006		istag = strncmp(br_start, "tags", 4) == 0;
1007		if (strncmp(br_start, "trunk", 5) == 0) {
1008			strcpy(branch, "trunk");
1009			strcpy(shortbranch, "trunk");
1010		}
1011		else if (istag || strncmp(br_start, "branches", 8) == 0) {
1012			len = br_end2 - br_start;
1013			strncpy(branch, br_start, len);
1014			branch[len] = '\0';
1015
1016			len = br_end2 - (br_end + 1);
1017			strncpy(shortbranch, br_end + 1, len);
1018			shortbranch[len] = '\0';
1019		}
1020		else {
1021			Py_FatalError("bad HeadURL");
1022			return;
1023		}
1024	}
1025
1026
1027	svnversion = _Py_svnversion();
1028	if (strcmp(svnversion, "exported") != 0)
1029		svn_revision = svnversion;
1030	else if (istag) {
1031		len = strlen(_patchlevel_revision);
1032		assert(len >= 13);
1033		assert(len < (sizeof(patchlevel_revision) + 13));
1034		strncpy(patchlevel_revision, _patchlevel_revision + 11,
1035			len - 13);
1036		patchlevel_revision[len - 13] = '\0';
1037		svn_revision = patchlevel_revision;
1038	}
1039	else
1040		svn_revision = "";
1041
1042	svn_initialized = 1;
1043}
1044
1045/* Return svnversion output if available.
1046   Else return Revision of patchlevel.h if on branch.
1047   Else return empty string */
1048const char*
1049Py_SubversionRevision()
1050{
1051	svnversion_init();
1052	return svn_revision;
1053}
1054
1055const char*
1056Py_SubversionShortBranch()
1057{
1058	svnversion_init();
1059	return shortbranch;
1060}
1061
1062PyObject *
1063_PySys_Init(void)
1064{
1065	PyObject *m, *v, *sysdict;
1066	char *s;
1067
1068	m = Py_InitModule3("sys", sys_methods, sys_doc);
1069	if (m == NULL)
1070		return NULL;
1071	sysdict = PyModule_GetDict(m);
1072
1073	{
1074		/* XXX: does this work on Win/Win64? (see posix_fstat) */
1075		struct stat sb;
1076		if (fstat(fileno(stdin), &sb) == 0 &&
1077		    S_ISDIR(sb.st_mode)) {
1078			/* There's nothing more we can do. */
1079			/* Py_FatalError() will core dump, so just exit. */
1080			PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n");
1081			exit(EXIT_FAILURE);
1082		}
1083	}
1084
1085        /* stdin/stdout/stderr are now set by site.py. */
1086
1087	PyDict_SetItemString(sysdict, "__displayhook__",
1088                             PyDict_GetItemString(sysdict, "displayhook"));
1089	PyDict_SetItemString(sysdict, "__excepthook__",
1090                             PyDict_GetItemString(sysdict, "excepthook"));
1091	PyDict_SetItemString(sysdict, "version",
1092			     v = PyUnicode_FromString(Py_GetVersion()));
1093	Py_XDECREF(v);
1094	PyDict_SetItemString(sysdict, "hexversion",
1095			     v = PyInt_FromLong(PY_VERSION_HEX));
1096	Py_XDECREF(v);
1097	svnversion_init();
1098	v = Py_BuildValue("(UUU)", "CPython", branch, svn_revision);
1099	PyDict_SetItemString(sysdict, "subversion", v);
1100	Py_XDECREF(v);
1101	/*
1102	 * These release level checks are mutually exclusive and cover
1103	 * the field, so don't get too fancy with the pre-processor!
1104	 */
1105#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
1106	s = "alpha";
1107#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
1108	s = "beta";
1109#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
1110	s = "candidate";
1111#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
1112	s = "final";
1113#endif
1114
1115#define SET_SYS_FROM_STRING(key, value)			\
1116	v = value;					\
1117	if (v != NULL)					\
1118		PyDict_SetItemString(sysdict, key, v);	\
1119	Py_XDECREF(v)
1120
1121	SET_SYS_FROM_STRING("version_info",
1122			    Py_BuildValue("iiiUi", PY_MAJOR_VERSION,
1123					       PY_MINOR_VERSION,
1124					       PY_MICRO_VERSION, s,
1125					       PY_RELEASE_SERIAL));
1126	SET_SYS_FROM_STRING("api_version",
1127			    PyInt_FromLong(PYTHON_API_VERSION));
1128	SET_SYS_FROM_STRING("copyright",
1129			    PyUnicode_FromString(Py_GetCopyright()));
1130	SET_SYS_FROM_STRING("platform",
1131			    PyUnicode_FromString(Py_GetPlatform()));
1132	SET_SYS_FROM_STRING("executable",
1133			    PyUnicode_FromString(Py_GetProgramFullPath()));
1134	SET_SYS_FROM_STRING("prefix",
1135			    PyUnicode_FromString(Py_GetPrefix()));
1136	SET_SYS_FROM_STRING("exec_prefix",
1137		   	    PyUnicode_FromString(Py_GetExecPrefix()));
1138	SET_SYS_FROM_STRING("maxint",
1139			    PyInt_FromLong(PyInt_GetMax()));
1140	SET_SYS_FROM_STRING("maxunicode",
1141			    PyInt_FromLong(PyUnicode_GetMax()));
1142	SET_SYS_FROM_STRING("builtin_module_names",
1143			    list_builtin_module_names());
1144	{
1145		/* Assumes that longs are at least 2 bytes long.
1146		   Should be safe! */
1147		unsigned long number = 1;
1148		char *value;
1149
1150		s = (char *) &number;
1151		if (s[0] == 0)
1152			value = "big";
1153		else
1154			value = "little";
1155		SET_SYS_FROM_STRING("byteorder",
1156				    PyUnicode_FromString(value));
1157	}
1158#ifdef MS_COREDLL
1159	SET_SYS_FROM_STRING("dllhandle",
1160			    PyLong_FromVoidPtr(PyWin_DLLhModule));
1161	SET_SYS_FROM_STRING("winver",
1162			    PyUnicode_FromString(PyWin_DLLVersionString));
1163#endif
1164#undef SET_SYS_FROM_STRING
1165	if (warnoptions == NULL) {
1166		warnoptions = PyList_New(0);
1167	}
1168	else {
1169		Py_INCREF(warnoptions);
1170	}
1171	if (warnoptions != NULL) {
1172		PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
1173	}
1174
1175	if (PyErr_Occurred())
1176		return NULL;
1177	return m;
1178}
1179
1180static PyObject *
1181makepathobject(const char *path, int delim)
1182{
1183	int i, n;
1184	const char *p;
1185	PyObject *v, *w;
1186
1187	n = 1;
1188	p = path;
1189	while ((p = strchr(p, delim)) != NULL) {
1190		n++;
1191		p++;
1192	}
1193	v = PyList_New(n);
1194	if (v == NULL)
1195		return NULL;
1196	for (i = 0; ; i++) {
1197		p = strchr(path, delim);
1198		if (p == NULL)
1199			p = strchr(path, '\0'); /* End of string */
1200		w = PyUnicode_FromStringAndSize(path, (Py_ssize_t) (p - path));
1201		if (w == NULL) {
1202			Py_DECREF(v);
1203			return NULL;
1204		}
1205		PyList_SetItem(v, i, w);
1206		if (*p == '\0')
1207			break;
1208		path = p+1;
1209	}
1210	return v;
1211}
1212
1213void
1214PySys_SetPath(const char *path)
1215{
1216	PyObject *v;
1217	if ((v = makepathobject(path, DELIM)) == NULL)
1218		Py_FatalError("can't create sys.path");
1219	if (PySys_SetObject("path", v) != 0)
1220		Py_FatalError("can't assign sys.path");
1221	Py_DECREF(v);
1222}
1223
1224static PyObject *
1225makeargvobject(int argc, char **argv)
1226{
1227	PyObject *av;
1228	if (argc <= 0 || argv == NULL) {
1229		/* Ensure at least one (empty) argument is seen */
1230		static char *empty_argv[1] = {""};
1231		argv = empty_argv;
1232		argc = 1;
1233	}
1234	av = PyList_New(argc);
1235	if (av != NULL) {
1236		int i;
1237		for (i = 0; i < argc; i++) {
1238#ifdef __VMS
1239			PyObject *v;
1240
1241			/* argv[0] is the script pathname if known */
1242			if (i == 0) {
1243				char* fn = decc$translate_vms(argv[0]);
1244				if ((fn == (char *)0) || fn == (char *)-1)
1245					v = PyUnicode_FromString(argv[0]);
1246				else
1247					v = PyUnicode_FromString(
1248						decc$translate_vms(argv[0]));
1249			} else
1250				v = PyUnicode_FromString(argv[i]);
1251#else
1252			PyObject *v = PyUnicode_FromString(argv[i]);
1253#endif
1254			if (v == NULL) {
1255				Py_DECREF(av);
1256				av = NULL;
1257				break;
1258			}
1259			PyList_SetItem(av, i, v);
1260		}
1261	}
1262	return av;
1263}
1264
1265void
1266PySys_SetArgv(int argc, char **argv)
1267{
1268#if defined(HAVE_REALPATH)
1269	char fullpath[MAXPATHLEN];
1270#elif defined(MS_WINDOWS)
1271	char fullpath[MAX_PATH];
1272#endif
1273	PyObject *av = makeargvobject(argc, argv);
1274	PyObject *path = PySys_GetObject("path");
1275	if (av == NULL)
1276		Py_FatalError("no mem for sys.argv");
1277	if (PySys_SetObject("argv", av) != 0)
1278		Py_FatalError("can't assign sys.argv");
1279	if (path != NULL) {
1280		char *argv0 = argv[0];
1281		char *p = NULL;
1282		Py_ssize_t n = 0;
1283		PyObject *a;
1284#ifdef HAVE_READLINK
1285		char link[MAXPATHLEN+1];
1286		char argv0copy[2*MAXPATHLEN+1];
1287		int nr = 0;
1288		if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0)
1289			nr = readlink(argv0, link, MAXPATHLEN);
1290		if (nr > 0) {
1291			/* It's a symlink */
1292			link[nr] = '\0';
1293			if (link[0] == SEP)
1294				argv0 = link; /* Link to absolute path */
1295			else if (strchr(link, SEP) == NULL)
1296				; /* Link without path */
1297			else {
1298				/* Must join(dirname(argv0), link) */
1299				char *q = strrchr(argv0, SEP);
1300				if (q == NULL)
1301					argv0 = link; /* argv0 without path */
1302				else {
1303					/* Must make a copy */
1304					strcpy(argv0copy, argv0);
1305					q = strrchr(argv0copy, SEP);
1306					strcpy(q+1, link);
1307					argv0 = argv0copy;
1308				}
1309			}
1310		}
1311#endif /* HAVE_READLINK */
1312#if SEP == '\\' /* Special case for MS filename syntax */
1313		if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) {
1314			char *q;
1315#ifdef MS_WINDOWS
1316			char *ptemp;
1317			if (GetFullPathName(argv0,
1318					   sizeof(fullpath),
1319					   fullpath,
1320					   &ptemp)) {
1321				argv0 = fullpath;
1322			}
1323#endif
1324			p = strrchr(argv0, SEP);
1325			/* Test for alternate separator */
1326			q = strrchr(p ? p : argv0, '/');
1327			if (q != NULL)
1328				p = q;
1329			if (p != NULL) {
1330				n = p + 1 - argv0;
1331				if (n > 1 && p[-1] != ':')
1332					n--; /* Drop trailing separator */
1333			}
1334		}
1335#else /* All other filename syntaxes */
1336		if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) {
1337#if defined(HAVE_REALPATH)
1338			if (realpath(argv0, fullpath)) {
1339				argv0 = fullpath;
1340			}
1341#endif
1342			p = strrchr(argv0, SEP);
1343		}
1344		if (p != NULL) {
1345			n = p + 1 - argv0;
1346#if SEP == '/' /* Special case for Unix filename syntax */
1347			if (n > 1)
1348				n--; /* Drop trailing separator */
1349#endif /* Unix */
1350		}
1351#endif /* All others */
1352		a = PyUnicode_FromStringAndSize(argv0, n);
1353		if (a == NULL)
1354			Py_FatalError("no mem for sys.path insertion");
1355		if (PyList_Insert(path, 0, a) < 0)
1356			Py_FatalError("sys.path.insert(0) failed");
1357		Py_DECREF(a);
1358	}
1359	Py_DECREF(av);
1360}
1361
1362
1363/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
1364   Adapted from code submitted by Just van Rossum.
1365
1366   PySys_WriteStdout(format, ...)
1367   PySys_WriteStderr(format, ...)
1368
1369      The first function writes to sys.stdout; the second to sys.stderr.  When
1370      there is a problem, they write to the real (C level) stdout or stderr;
1371      no exceptions are raised.
1372
1373      Both take a printf-style format string as their first argument followed
1374      by a variable length argument list determined by the format string.
1375
1376      *** WARNING ***
1377
1378      The format should limit the total size of the formatted output string to
1379      1000 bytes.  In particular, this means that no unrestricted "%s" formats
1380      should occur; these should be limited using "%.<N>s where <N> is a
1381      decimal number calculated so that <N> plus the maximum size of other
1382      formatted text does not exceed 1000 bytes.  Also watch out for "%f",
1383      which can print hundreds of digits for very large numbers.
1384
1385 */
1386
1387static void
1388mywrite(char *name, FILE *fp, const char *format, va_list va)
1389{
1390	PyObject *file;
1391	PyObject *error_type, *error_value, *error_traceback;
1392	char buffer[1001];
1393	int written;
1394
1395	PyErr_Fetch(&error_type, &error_value, &error_traceback);
1396	file = PySys_GetObject(name);
1397	written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
1398	if (PyFile_WriteString(buffer, file) != 0) {
1399		PyErr_Clear();
1400		fputs(buffer, fp);
1401	}
1402	if (written < 0 || (size_t)written >= sizeof(buffer)) {
1403		const char *truncated = "... truncated";
1404		if (PyFile_WriteString(truncated, file) != 0) {
1405			PyErr_Clear();
1406			fputs(truncated, fp);
1407		}
1408	}
1409	PyErr_Restore(error_type, error_value, error_traceback);
1410}
1411
1412void
1413PySys_WriteStdout(const char *format, ...)
1414{
1415	va_list va;
1416
1417	va_start(va, format);
1418	mywrite("stdout", stdout, format, va);
1419	va_end(va);
1420}
1421
1422void
1423PySys_WriteStderr(const char *format, ...)
1424{
1425	va_list va;
1426
1427	va_start(va, format);
1428	mywrite("stderr", stderr, format, va);
1429	va_end(va);
1430}
1431