blob: 51bd85bd3f860133a8e377bf901dd31322913e0e [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* System module */
3
4/*
5Various bits of information used by the interpreter are collected in
6module 'sys'.
Guido van Rossum3f5da241990-12-20 15:06:42 +00007Function member:
Guido van Rossumcc8914f1995-03-20 15:09:40 +00008- exit(sts): raise SystemExit
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00009Data members:
10- stdin, stdout, stderr: standard file objects
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011- modules: the table of modules (dictionary)
Guido van Rossum3f5da241990-12-20 15:06:42 +000012- path: module search path (list of strings)
13- argv: script arguments (list of strings)
14- ps1, ps2: optional primary and secondary prompts (strings)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000015*/
16
Guido van Rossum65bf9f21997-04-29 18:33:38 +000017#include "Python.h"
Christian Heimesd32ed6f2008-01-14 18:49:24 +000018#include "structseq.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000019#include "code.h"
Barry Warsawb6a54d22000-12-06 21:47:46 +000020#include "frameobject.h"
Guido van Rossuma12fe4e2003-04-09 19:06:21 +000021#include "eval.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022
Guido van Rossume2437a11992-03-23 18:20:18 +000023#include "osdefs.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000024
Mark Hammond8696ebc2002-10-08 02:44:31 +000025#ifdef MS_WINDOWS
26#define WIN32_LEAN_AND_MEAN
Amaury Forgeot d'Arc06cfe952007-11-10 13:55:44 +000027#include <windows.h>
Mark Hammond8696ebc2002-10-08 02:44:31 +000028#endif /* MS_WINDOWS */
29
Guido van Rossum9b38a141996-09-11 23:12:24 +000030#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000031extern void *PyWin_DLLhModule;
Guido van Rossum6c1e5f21997-09-29 23:34:23 +000032/* A string loaded from the DLL at startup: */
33extern const char *PyWin_DLLVersionString;
Guido van Rossumc606fe11996-04-09 02:37:57 +000034#endif
35
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +000036#ifdef __VMS
37#include <unixlib.h>
38#endif
39
Martin v. Löwis5467d4c2003-05-10 07:10:12 +000040#ifdef HAVE_LANGINFO_H
41#include <locale.h>
42#include <langinfo.h>
43#endif
44
Guido van Rossum65bf9f21997-04-29 18:33:38 +000045PyObject *
Neal Norwitzf3081322007-08-25 00:32:45 +000046PySys_GetObject(const char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047{
Nicholas Bastine5662ae2004-03-24 22:22:12 +000048 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossum25ce5661997-08-02 03:10:38 +000049 PyObject *sd = tstate->interp->sysdict;
Guido van Rossumbe203361999-10-05 22:17:41 +000050 if (sd == NULL)
51 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +000052 return PyDict_GetItemString(sd, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053}
54
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055int
Neal Norwitzf3081322007-08-25 00:32:45 +000056PySys_SetObject(const char *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057{
Nicholas Bastine5662ae2004-03-24 22:22:12 +000058 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossum25ce5661997-08-02 03:10:38 +000059 PyObject *sd = tstate->interp->sysdict;
Guido van Rossum5ad58c61992-01-26 18:15:48 +000060 if (v == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +000061 if (PyDict_GetItemString(sd, name) == NULL)
Guido van Rossum5ad58c61992-01-26 18:15:48 +000062 return 0;
63 else
Guido van Rossum25ce5661997-08-02 03:10:38 +000064 return PyDict_DelItemString(sd, name);
Guido van Rossum5ad58c61992-01-26 18:15:48 +000065 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066 else
Guido van Rossum25ce5661997-08-02 03:10:38 +000067 return PyDict_SetItemString(sd, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068}
69
Guido van Rossum65bf9f21997-04-29 18:33:38 +000070static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +000071sys_displayhook(PyObject *self, PyObject *o)
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000072{
Martin v. Löwise3eb1f22001-08-16 13:15:00 +000073 PyObject *outf;
Nicholas Bastine5662ae2004-03-24 22:22:12 +000074 PyInterpreterState *interp = PyThreadState_GET()->interp;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000075 PyObject *modules = interp->modules;
Georg Brandl1a3284e2007-12-02 09:40:06 +000076 PyObject *builtins = PyDict_GetItemString(modules, "builtins");
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000077
Moshe Zadka03897ea2001-07-23 13:32:43 +000078 if (builtins == NULL) {
Georg Brandl1a3284e2007-12-02 09:40:06 +000079 PyErr_SetString(PyExc_RuntimeError, "lost builtins module");
Moshe Zadka03897ea2001-07-23 13:32:43 +000080 return NULL;
81 }
82
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000083 /* Print value except if None */
84 /* After printing, also assign to '_' */
85 /* Before, set '_' to None to avoid recursion */
86 if (o == Py_None) {
87 Py_INCREF(Py_None);
88 return Py_None;
89 }
90 if (PyObject_SetAttrString(builtins, "_", Py_None) != 0)
91 return NULL;
Greg Steinceb9b7c2001-01-11 09:27:34 +000092 outf = PySys_GetObject("stdout");
Christian Heimes2be03732007-11-15 02:26:46 +000093 if (outf == NULL || outf == Py_None) {
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000094 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
95 return NULL;
96 }
Greg Steinceb9b7c2001-01-11 09:27:34 +000097 if (PyFile_WriteObject(o, outf, 0) != 0)
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +000098 return NULL;
Guido van Rossum79139b22007-02-09 23:20:19 +000099 if (PyFile_WriteString("\n", outf) != 0)
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000100 return NULL;
101 if (PyObject_SetAttrString(builtins, "_", o) != 0)
102 return NULL;
103 Py_INCREF(Py_None);
104 return Py_None;
105}
106
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000107PyDoc_STRVAR(displayhook_doc,
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000108"displayhook(object) -> None\n"
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000109"\n"
Georg Brandl1a3284e2007-12-02 09:40:06 +0000110"Print an object to sys.stdout and also save it in builtins.\n"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000111);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000112
113static PyObject *
114sys_excepthook(PyObject* self, PyObject* args)
115{
116 PyObject *exc, *value, *tb;
Fred Drakea7688822001-10-24 20:47:48 +0000117 if (!PyArg_UnpackTuple(args, "excepthook", 3, 3, &exc, &value, &tb))
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000118 return NULL;
119 PyErr_Display(exc, value, tb);
120 Py_INCREF(Py_None);
121 return Py_None;
122}
123
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000124PyDoc_STRVAR(excepthook_doc,
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000125"excepthook(exctype, value, traceback) -> None\n"
126"\n"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000127"Handle an exception by displaying it with a traceback on sys.stderr.\n"
128);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000129
130static PyObject *
Guido van Rossum46d3dc32003-03-01 03:20:41 +0000131sys_exc_info(PyObject *self, PyObject *noargs)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000132{
133 PyThreadState *tstate;
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000134 tstate = PyThreadState_GET();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000135 return Py_BuildValue(
136 "(OOO)",
137 tstate->exc_type != NULL ? tstate->exc_type : Py_None,
138 tstate->exc_value != NULL ? tstate->exc_value : Py_None,
139 tstate->exc_traceback != NULL ?
140 tstate->exc_traceback : Py_None);
141}
142
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000143PyDoc_STRVAR(exc_info_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000144"exc_info() -> (type, value, traceback)\n\
145\n\
Guido van Rossum46d3dc32003-03-01 03:20:41 +0000146Return information about the most recent exception caught by an except\n\
147clause in the current stack frame or in an older stack frame."
148);
149
150static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000151sys_exit(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000152{
Neal Norwitz0c766a02002-03-27 13:03:09 +0000153 PyObject *exit_code = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000154 if (!PyArg_UnpackTuple(args, "exit", 0, 1, &exit_code))
Neal Norwitz0c766a02002-03-27 13:03:09 +0000155 return NULL;
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000156 /* Raise SystemExit so callers may catch it or clean up. */
Neal Norwitz0c766a02002-03-27 13:03:09 +0000157 PyErr_SetObject(PyExc_SystemExit, exit_code);
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000158 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159}
160
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000161PyDoc_STRVAR(exit_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000162"exit([status])\n\
163\n\
164Exit the interpreter by raising SystemExit(status).\n\
165If the status is omitted or None, it defaults to zero (i.e., success).\n\
Neil Schemenauer0f2103f2002-03-23 20:46:35 +0000166If the status is numeric, it will be used as the system exit status.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000167If it is another kind of object, it will be printed and the system\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000168exit status will be one (i.e., failure)."
169);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000170
Martin v. Löwis107b7da2001-11-09 20:59:39 +0000171
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000172static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000173sys_getdefaultencoding(PyObject *self)
Fred Drake8b4d01d2000-05-09 19:57:01 +0000174{
Walter Dörwald360b01a2007-06-05 20:15:52 +0000175 return PyUnicode_FromString(PyUnicode_GetDefaultEncoding());
Fred Drake8b4d01d2000-05-09 19:57:01 +0000176}
177
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000178PyDoc_STRVAR(getdefaultencoding_doc,
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000179"getdefaultencoding() -> string\n\
Fred Drake8b4d01d2000-05-09 19:57:01 +0000180\n\
181Return the current default string encoding used by the Unicode \n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000182implementation."
183);
Fred Drake8b4d01d2000-05-09 19:57:01 +0000184
185static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000186sys_setdefaultencoding(PyObject *self, PyObject *args)
Fred Drake8b4d01d2000-05-09 19:57:01 +0000187{
188 char *encoding;
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000189 if (!PyArg_ParseTuple(args, "s:setdefaultencoding", &encoding))
Fred Drake8b4d01d2000-05-09 19:57:01 +0000190 return NULL;
191 if (PyUnicode_SetDefaultEncoding(encoding))
192 return NULL;
193 Py_INCREF(Py_None);
194 return Py_None;
195}
196
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000197PyDoc_STRVAR(setdefaultencoding_doc,
Marc-André Lemburg99964b82000-06-07 09:13:41 +0000198"setdefaultencoding(encoding)\n\
Fred Drake8b4d01d2000-05-09 19:57:01 +0000199\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000200Set the current default string encoding used by the Unicode implementation."
201);
Fred Drake8b4d01d2000-05-09 19:57:01 +0000202
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000203static PyObject *
204sys_getfilesystemencoding(PyObject *self)
205{
206 if (Py_FileSystemDefaultEncoding)
Walter Dörwald360b01a2007-06-05 20:15:52 +0000207 return PyUnicode_FromString(Py_FileSystemDefaultEncoding);
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000208 Py_INCREF(Py_None);
209 return Py_None;
210}
211
212PyDoc_STRVAR(getfilesystemencoding_doc,
213"getfilesystemencoding() -> string\n\
214\n\
215Return the encoding used to convert Unicode filenames in\n\
216operating system filenames."
217);
218
Martin v. Löwis04dc25c2008-10-03 16:09:28 +0000219static PyObject *
220sys_setfilesystemencoding(PyObject *self, PyObject *args)
221{
222 PyObject *new_encoding;
223 if (!PyArg_ParseTuple(args, "U:setfilesystemencoding", &new_encoding))
224 return NULL;
225 if (_Py_SetFileSystemEncoding(new_encoding))
226 return NULL;
227 Py_INCREF(Py_None);
228 return Py_None;
229}
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000230
Martin v. Löwis04dc25c2008-10-03 16:09:28 +0000231PyDoc_STRVAR(setfilesystemencoding_doc,
232"setfilesystemencoding(string) -> None\n\
233\n\
234Set the encoding used to convert Unicode filenames in\n\
235operating system filenames."
236);
Georg Brandl66a796e2006-12-19 20:50:34 +0000237
238static PyObject *
239sys_intern(PyObject *self, PyObject *args)
240{
241 PyObject *s;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000242 if (!PyArg_ParseTuple(args, "U:intern", &s))
Georg Brandl66a796e2006-12-19 20:50:34 +0000243 return NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000244 if (PyUnicode_CheckExact(s)) {
Walter Dörwald2a0c0812007-06-05 20:22:04 +0000245 Py_INCREF(s);
246 PyUnicode_InternInPlace(&s);
247 return s;
248 }
249 else {
250 PyErr_Format(PyExc_TypeError,
251 "can't intern %.400s", s->ob_type->tp_name);
Georg Brandl66a796e2006-12-19 20:50:34 +0000252 return NULL;
253 }
Georg Brandl66a796e2006-12-19 20:50:34 +0000254}
255
256PyDoc_STRVAR(intern_doc,
257"intern(string) -> string\n\
258\n\
259``Intern'' the given string. This enters the string in the (global)\n\
260table of interned strings whose purpose is to speed up dictionary lookups.\n\
261Return the string itself or the previously interned string object with the\n\
262same value.");
263
264
Fred Drake5755ce62001-06-27 19:19:46 +0000265/*
266 * Cached interned string objects used for calling the profile and
267 * trace functions. Initialized by trace_init().
268 */
Nicholas Bastinc69ebe82004-03-24 21:57:10 +0000269static PyObject *whatstrings[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
Fred Drake5755ce62001-06-27 19:19:46 +0000270
271static int
272trace_init(void)
273{
Nicholas Bastinc69ebe82004-03-24 21:57:10 +0000274 static char *whatnames[7] = {"call", "exception", "line", "return",
275 "c_call", "c_exception", "c_return"};
Fred Drake5755ce62001-06-27 19:19:46 +0000276 PyObject *name;
277 int i;
Nicholas Bastinc69ebe82004-03-24 21:57:10 +0000278 for (i = 0; i < 7; ++i) {
Fred Drake5755ce62001-06-27 19:19:46 +0000279 if (whatstrings[i] == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000280 name = PyUnicode_InternFromString(whatnames[i]);
Fred Drake5755ce62001-06-27 19:19:46 +0000281 if (name == NULL)
282 return -1;
283 whatstrings[i] = name;
284 }
285 }
286 return 0;
287}
288
289
290static PyObject *
291call_trampoline(PyThreadState *tstate, PyObject* callback,
292 PyFrameObject *frame, int what, PyObject *arg)
293{
294 PyObject *args = PyTuple_New(3);
295 PyObject *whatstr;
296 PyObject *result;
297
298 if (args == NULL)
299 return NULL;
300 Py_INCREF(frame);
301 whatstr = whatstrings[what];
302 Py_INCREF(whatstr);
303 if (arg == NULL)
304 arg = Py_None;
305 Py_INCREF(arg);
306 PyTuple_SET_ITEM(args, 0, (PyObject *)frame);
307 PyTuple_SET_ITEM(args, 1, whatstr);
308 PyTuple_SET_ITEM(args, 2, arg);
309
310 /* call the Python-level function */
311 PyFrame_FastToLocals(frame);
312 result = PyEval_CallObject(callback, args);
313 PyFrame_LocalsToFast(frame, 1);
314 if (result == NULL)
315 PyTraceBack_Here(frame);
316
317 /* cleanup */
318 Py_DECREF(args);
319 return result;
320}
321
322static int
323profile_trampoline(PyObject *self, PyFrameObject *frame,
324 int what, PyObject *arg)
325{
326 PyThreadState *tstate = frame->f_tstate;
327 PyObject *result;
328
Fred Drake8f51f542001-10-04 14:48:42 +0000329 if (arg == NULL)
330 arg = Py_None;
Fred Drake5755ce62001-06-27 19:19:46 +0000331 result = call_trampoline(tstate, self, frame, what, arg);
332 if (result == NULL) {
333 PyEval_SetProfile(NULL, NULL);
334 return -1;
335 }
336 Py_DECREF(result);
337 return 0;
338}
339
340static int
341trace_trampoline(PyObject *self, PyFrameObject *frame,
342 int what, PyObject *arg)
343{
344 PyThreadState *tstate = frame->f_tstate;
345 PyObject *callback;
346 PyObject *result;
347
348 if (what == PyTrace_CALL)
349 callback = self;
350 else
351 callback = frame->f_trace;
352 if (callback == NULL)
353 return 0;
354 result = call_trampoline(tstate, callback, frame, what, arg);
355 if (result == NULL) {
356 PyEval_SetTrace(NULL, NULL);
357 Py_XDECREF(frame->f_trace);
358 frame->f_trace = NULL;
359 return -1;
360 }
361 if (result != Py_None) {
362 PyObject *temp = frame->f_trace;
363 frame->f_trace = NULL;
364 Py_XDECREF(temp);
365 frame->f_trace = result;
366 }
367 else {
368 Py_DECREF(result);
369 }
370 return 0;
371}
Fred Draked0838392001-06-16 21:02:31 +0000372
Fred Drake8b4d01d2000-05-09 19:57:01 +0000373static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000374sys_settrace(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000375{
Fred Drake5755ce62001-06-27 19:19:46 +0000376 if (trace_init() == -1)
Fred Draked0838392001-06-16 21:02:31 +0000377 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000378 if (args == Py_None)
Fred Drake5755ce62001-06-27 19:19:46 +0000379 PyEval_SetTrace(NULL, NULL);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000380 else
Fred Drake5755ce62001-06-27 19:19:46 +0000381 PyEval_SetTrace(trace_trampoline, args);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000382 Py_INCREF(Py_None);
383 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000384}
385
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000386PyDoc_STRVAR(settrace_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000387"settrace(function)\n\
388\n\
389Set the global debug tracing function. It will be called on each\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000390function call. See the debugger chapter in the library manual."
391);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000392
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000393static PyObject *
Christian Heimes9bd667a2008-01-20 15:14:11 +0000394sys_gettrace(PyObject *self, PyObject *args)
395{
396 PyThreadState *tstate = PyThreadState_GET();
397 PyObject *temp = tstate->c_traceobj;
398
399 if (temp == NULL)
400 temp = Py_None;
401 Py_INCREF(temp);
402 return temp;
403}
404
405PyDoc_STRVAR(gettrace_doc,
406"gettrace()\n\
407\n\
408Return the global debug tracing function set with sys.settrace.\n\
409See the debugger chapter in the library manual."
410);
411
412static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000413sys_setprofile(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000414{
Fred Drake5755ce62001-06-27 19:19:46 +0000415 if (trace_init() == -1)
Fred Draked0838392001-06-16 21:02:31 +0000416 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000417 if (args == Py_None)
Fred Drake5755ce62001-06-27 19:19:46 +0000418 PyEval_SetProfile(NULL, NULL);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000419 else
Fred Drake5755ce62001-06-27 19:19:46 +0000420 PyEval_SetProfile(profile_trampoline, args);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000421 Py_INCREF(Py_None);
422 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000423}
424
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000425PyDoc_STRVAR(setprofile_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000426"setprofile(function)\n\
427\n\
428Set the profiling function. It will be called on each function call\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000429and return. See the profiler chapter in the library manual."
430);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000431
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000432static PyObject *
Christian Heimes9bd667a2008-01-20 15:14:11 +0000433sys_getprofile(PyObject *self, PyObject *args)
434{
435 PyThreadState *tstate = PyThreadState_GET();
436 PyObject *temp = tstate->c_profileobj;
437
438 if (temp == NULL)
439 temp = Py_None;
440 Py_INCREF(temp);
441 return temp;
442}
443
444PyDoc_STRVAR(getprofile_doc,
445"getprofile()\n\
446\n\
447Return the profiling function set with sys.setprofile.\n\
448See the profiler chapter in the library manual."
449);
450
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000451/* TODO: deprecate */
452static int _check_interval = 100;
453
Christian Heimes9bd667a2008-01-20 15:14:11 +0000454static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000455sys_setcheckinterval(PyObject *self, PyObject *args)
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000456{
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000457 if (PyErr_WarnEx(PyExc_DeprecationWarning,
458 "sys.getcheckinterval() and sys.setcheckinterval() "
459 "are deprecated. Use sys.setswitchinterval() "
460 "instead.", 1) < 0)
461 return NULL;
462 if (!PyArg_ParseTuple(args, "i:setcheckinterval", &_check_interval))
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000463 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000464 Py_INCREF(Py_None);
465 return Py_None;
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000466}
467
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000468PyDoc_STRVAR(setcheckinterval_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000469"setcheckinterval(n)\n\
470\n\
471Tell the Python interpreter to check for asynchronous events every\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000472n instructions. This also affects how often thread switches occur."
473);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000474
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000475static PyObject *
Tim Peterse5e065b2003-07-06 18:36:54 +0000476sys_getcheckinterval(PyObject *self, PyObject *args)
477{
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000478 if (PyErr_WarnEx(PyExc_DeprecationWarning,
479 "sys.getcheckinterval() and sys.setcheckinterval() "
480 "are deprecated. Use sys.getswitchinterval() "
481 "instead.", 1) < 0)
482 return NULL;
483 return PyLong_FromLong(_check_interval);
Tim Peterse5e065b2003-07-06 18:36:54 +0000484}
485
486PyDoc_STRVAR(getcheckinterval_doc,
487"getcheckinterval() -> current check interval; see setcheckinterval()."
488);
489
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000490#ifdef WITH_THREAD
491static PyObject *
492sys_setswitchinterval(PyObject *self, PyObject *args)
493{
494 double d;
495 if (!PyArg_ParseTuple(args, "d:setswitchinterval", &d))
496 return NULL;
497 if (d <= 0.0) {
498 PyErr_SetString(PyExc_ValueError,
499 "switch interval must be strictly positive");
500 return NULL;
501 }
502 _PyEval_SetSwitchInterval((unsigned long) (1e6 * d));
503 Py_INCREF(Py_None);
504 return Py_None;
505}
506
507PyDoc_STRVAR(setswitchinterval_doc,
508"setswitchinterval(n)\n\
509\n\
510Set the ideal thread switching delay inside the Python interpreter\n\
511The actual frequency of switching threads can be lower if the\n\
512interpreter executes long sequences of uninterruptible code\n\
513(this is implementation-specific and workload-dependent).\n\
514\n\
515The parameter must represent the desired switching delay in seconds\n\
516A typical value is 0.005 (5 milliseconds)."
517);
518
519static PyObject *
520sys_getswitchinterval(PyObject *self, PyObject *args)
521{
522 return PyFloat_FromDouble(1e-6 * _PyEval_GetSwitchInterval());
523}
524
525PyDoc_STRVAR(getswitchinterval_doc,
526"getswitchinterval() -> current thread switch interval; see setswitchinterval()."
527);
528
529#endif /* WITH_THREAD */
530
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000531#ifdef WITH_TSC
532static PyObject *
533sys_settscdump(PyObject *self, PyObject *args)
534{
535 int bool;
536 PyThreadState *tstate = PyThreadState_Get();
537
538 if (!PyArg_ParseTuple(args, "i:settscdump", &bool))
539 return NULL;
540 if (bool)
541 tstate->interp->tscdump = 1;
542 else
543 tstate->interp->tscdump = 0;
544 Py_INCREF(Py_None);
545 return Py_None;
Tim Peters216b78b2006-01-06 02:40:53 +0000546
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000547}
548
Tim Peters216b78b2006-01-06 02:40:53 +0000549PyDoc_STRVAR(settscdump_doc,
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000550"settscdump(bool)\n\
551\n\
552If true, tell the Python interpreter to dump VM measurements to\n\
553stderr. If false, turn off dump. The measurements are based on the\n\
Michael W. Hudson800ba232004-08-12 18:19:17 +0000554processor's time-stamp counter."
Tim Peters216b78b2006-01-06 02:40:53 +0000555);
Neal Norwitz0f5aed42004-06-13 20:32:17 +0000556#endif /* TSC */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000557
Tim Peterse5e065b2003-07-06 18:36:54 +0000558static PyObject *
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000559sys_setrecursionlimit(PyObject *self, PyObject *args)
560{
561 int new_limit;
562 if (!PyArg_ParseTuple(args, "i:setrecursionlimit", &new_limit))
563 return NULL;
564 if (new_limit <= 0) {
Tim Peters216b78b2006-01-06 02:40:53 +0000565 PyErr_SetString(PyExc_ValueError,
566 "recursion limit must be positive");
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000567 return NULL;
568 }
569 Py_SetRecursionLimit(new_limit);
570 Py_INCREF(Py_None);
571 return Py_None;
572}
573
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000574PyDoc_STRVAR(setrecursionlimit_doc,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000575"setrecursionlimit(n)\n\
576\n\
577Set the maximum depth of the Python interpreter stack to n. This\n\
578limit prevents infinite recursion from causing an overflow of the C\n\
579stack and crashing Python. The highest possible limit is platform-\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000580dependent."
581);
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000582
583static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000584sys_getrecursionlimit(PyObject *self)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000585{
Christian Heimes217cfd12007-12-02 14:31:20 +0000586 return PyLong_FromLong(Py_GetRecursionLimit());
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000587}
588
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000589PyDoc_STRVAR(getrecursionlimit_doc,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000590"getrecursionlimit()\n\
591\n\
592Return the current value of the recursion limit, the maximum depth\n\
593of the Python interpreter stack. This limit prevents infinite\n\
Jack Jansene739a0d2002-06-26 20:39:20 +0000594recursion from causing an overflow of the C stack and crashing Python."
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000595);
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000596
Mark Hammond8696ebc2002-10-08 02:44:31 +0000597#ifdef MS_WINDOWS
598PyDoc_STRVAR(getwindowsversion_doc,
599"getwindowsversion()\n\
600\n\
601Return information about the running version of Windows.\n\
602The result is a tuple of (major, minor, build, platform, text)\n\
603All elements are numbers, except text which is a string.\n\
604Platform may be 0 for win32s, 1 for Windows 9x/ME, 2 for Windows NT/2000/XP\n\
605"
606);
607
608static PyObject *
609sys_getwindowsversion(PyObject *self)
610{
611 OSVERSIONINFO ver;
612 ver.dwOSVersionInfoSize = sizeof(ver);
613 if (!GetVersionEx(&ver))
614 return PyErr_SetFromWindowsErr(0);
615 return Py_BuildValue("HHHHs",
616 ver.dwMajorVersion,
617 ver.dwMinorVersion,
618 ver.dwBuildNumber,
619 ver.dwPlatformId,
620 ver.szCSDVersion);
621}
622
623#endif /* MS_WINDOWS */
624
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000625#ifdef HAVE_DLOPEN
626static PyObject *
627sys_setdlopenflags(PyObject *self, PyObject *args)
628{
629 int new_val;
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000630 PyThreadState *tstate = PyThreadState_GET();
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000631 if (!PyArg_ParseTuple(args, "i:setdlopenflags", &new_val))
632 return NULL;
633 if (!tstate)
634 return NULL;
635 tstate->interp->dlopenflags = new_val;
636 Py_INCREF(Py_None);
637 return Py_None;
638}
639
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000640PyDoc_STRVAR(setdlopenflags_doc,
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000641"setdlopenflags(n) -> None\n\
642\n\
Alexandre Vassalotti260484d2009-07-17 11:43:26 +0000643Set the flags used by the interpreter for dlopen calls, such as when the\n\
644interpreter loads extension modules. Among other things, this will enable\n\
645a lazy resolving of symbols when importing a module, if called as\n\
646sys.setdlopenflags(0). To share symbols across extension modules, call as\n\
647sys.setdlopenflags(ctypes.RTLD_GLOBAL). Symbolic names for the flag modules\n\
648can be either found in the ctypes module, or in the DLFCN module. If DLFCN\n\
649is not available, it can be generated from /usr/include/dlfcn.h using the\n\
650h2py script.");
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000651
652static PyObject *
653sys_getdlopenflags(PyObject *self, PyObject *args)
654{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000655 PyThreadState *tstate = PyThreadState_GET();
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000656 if (!tstate)
657 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +0000658 return PyLong_FromLong(tstate->interp->dlopenflags);
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000659}
660
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000661PyDoc_STRVAR(getdlopenflags_doc,
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000662"getdlopenflags() -> int\n\
663\n\
Alexandre Vassalotti260484d2009-07-17 11:43:26 +0000664Return the current value of the flags that are used for dlopen calls.\n\
665The flag constants are defined in the ctypes and DLFCN modules.");
666
667#endif /* HAVE_DLOPEN */
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000668
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000669#ifdef USE_MALLOPT
670/* Link with -lmalloc (or -lmpc) on an SGI */
671#include <malloc.h>
672
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000673static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000674sys_mdebug(PyObject *self, PyObject *args)
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000675{
676 int flag;
Guido van Rossumffc0f4f2000-03-31 00:38:29 +0000677 if (!PyArg_ParseTuple(args, "i:mdebug", &flag))
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000678 return NULL;
679 mallopt(M_DEBUG, flag);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000680 Py_INCREF(Py_None);
681 return Py_None;
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000682}
683#endif /* USE_MALLOPT */
684
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000685static PyObject *
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +0000686sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis00709aa2008-06-04 14:18:43 +0000687{
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +0000688 PyObject *res = NULL;
Benjamin Petersona5758c02009-05-09 18:15:04 +0000689 static PyObject *str__sizeof__ = NULL, *gc_head_size = NULL;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +0000690 static char *kwlist[] = {"object", "default", 0};
691 PyObject *o, *dflt = NULL;
Thomas Hellerd88ddfa2008-07-15 17:14:51 +0000692 PyObject *method;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +0000693
694 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",
695 kwlist, &o, &dflt))
696 return NULL;
Martin v. Löwis00709aa2008-06-04 14:18:43 +0000697
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +0000698 /* Initialize static variable for GC head size */
699 if (gc_head_size == NULL) {
700 gc_head_size = PyLong_FromSsize_t(sizeof(PyGC_Head));
701 if (gc_head_size == NULL)
Martin v. Löwis00709aa2008-06-04 14:18:43 +0000702 return NULL;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +0000703 }
704
705 /* Make sure the type is initialized. float gets initialized late */
706 if (PyType_Ready(Py_TYPE(o)) < 0)
707 return NULL;
Benjamin Petersona5758c02009-05-09 18:15:04 +0000708
709 method = _PyObject_LookupSpecial(o, "__sizeof__",
710 &str__sizeof__);
Benjamin Peterson94c65d92009-05-25 03:10:48 +0000711 if (method == NULL) {
712 if (!PyErr_Occurred())
713 PyErr_Format(PyExc_TypeError,
714 "Type %.100s doesn't define __sizeof__",
715 Py_TYPE(o)->tp_name);
716 }
Benjamin Petersona5758c02009-05-09 18:15:04 +0000717 else {
718 res = PyObject_CallFunctionObjArgs(method, NULL);
719 Py_DECREF(method);
720 }
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +0000721
722 /* Has a default value been given */
723 if ((res == NULL) && (dflt != NULL) &&
724 PyErr_ExceptionMatches(PyExc_TypeError))
725 {
726 PyErr_Clear();
727 Py_INCREF(dflt);
728 return dflt;
729 }
730 else if (res == NULL)
731 return res;
732
733 /* add gc_head size */
734 if (PyObject_IS_GC(o)) {
735 PyObject *tmp = res;
736 res = PyNumber_Add(tmp, gc_head_size);
737 Py_DECREF(tmp);
738 }
739 return res;
Martin v. Löwis00709aa2008-06-04 14:18:43 +0000740}
741
742PyDoc_STRVAR(getsizeof_doc,
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +0000743"getsizeof(object, default) -> int\n\
Martin v. Löwis00709aa2008-06-04 14:18:43 +0000744\n\
745Return the size of object in bytes.");
746
747static PyObject *
Fred Drakea7688822001-10-24 20:47:48 +0000748sys_getrefcount(PyObject *self, PyObject *arg)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000749{
Christian Heimes217cfd12007-12-02 14:31:20 +0000750 return PyLong_FromSsize_t(arg->ob_refcnt);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000751}
752
Tim Peters4be93d02002-07-07 19:59:50 +0000753#ifdef Py_REF_DEBUG
Mark Hammond440d8982000-06-20 08:12:48 +0000754static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000755sys_gettotalrefcount(PyObject *self)
Mark Hammond440d8982000-06-20 08:12:48 +0000756{
Christian Heimes217cfd12007-12-02 14:31:20 +0000757 return PyLong_FromSsize_t(_Py_GetRefTotal());
Mark Hammond440d8982000-06-20 08:12:48 +0000758}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000759#endif /* Py_REF_DEBUG */
Mark Hammond440d8982000-06-20 08:12:48 +0000760
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000761PyDoc_STRVAR(getrefcount_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000762"getrefcount(object) -> integer\n\
763\n\
Fred Drakeba3ff1b2002-06-20 21:36:19 +0000764Return the reference count of object. The count returned is generally\n\
765one higher than you might expect, because it includes the (temporary)\n\
766reference as an argument to getrefcount()."
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000767);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000768
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000769#ifdef COUNT_ALLOCS
770static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000771sys_getcounts(PyObject *self)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000772{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000773 extern PyObject *get_counts(void);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000774
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000775 return get_counts();
776}
777#endif
778
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000779PyDoc_STRVAR(getframe_doc,
Barry Warsawb6a54d22000-12-06 21:47:46 +0000780"_getframe([depth]) -> frameobject\n\
781\n\
782Return a frame object from the call stack. If optional integer depth is\n\
783given, return the frame object that many calls below the top of the stack.\n\
784If that is deeper than the call stack, ValueError is raised. The default\n\
785for depth is zero, returning the frame at the top of the call stack.\n\
786\n\
787This function should be used for internal and specialized\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000788purposes only."
789);
Barry Warsawb6a54d22000-12-06 21:47:46 +0000790
791static PyObject *
792sys_getframe(PyObject *self, PyObject *args)
793{
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000794 PyFrameObject *f = PyThreadState_GET()->frame;
Barry Warsawb6a54d22000-12-06 21:47:46 +0000795 int depth = -1;
796
797 if (!PyArg_ParseTuple(args, "|i:_getframe", &depth))
798 return NULL;
799
800 while (depth > 0 && f != NULL) {
801 f = f->f_back;
802 --depth;
803 }
804 if (f == NULL) {
805 PyErr_SetString(PyExc_ValueError,
806 "call stack is not deep enough");
807 return NULL;
808 }
809 Py_INCREF(f);
810 return (PyObject*)f;
811}
812
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000813PyDoc_STRVAR(current_frames_doc,
814"_current_frames() -> dictionary\n\
815\n\
816Return a dictionary mapping each current thread T's thread id to T's\n\
817current stack frame.\n\
818\n\
819This function should be used for specialized purposes only."
820);
821
822static PyObject *
823sys_current_frames(PyObject *self, PyObject *noargs)
824{
825 return _PyThread_CurrentFrames();
826}
827
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000828PyDoc_STRVAR(call_tracing_doc,
829"call_tracing(func, args) -> object\n\
830\n\
831Call func(*args), while tracing is enabled. The tracing state is\n\
832saved, and restored afterwards. This is intended to be called from\n\
833a debugger from a checkpoint, to recursively debug some other code."
834);
835
836static PyObject *
837sys_call_tracing(PyObject *self, PyObject *args)
838{
839 PyObject *func, *funcargs;
Barry Warsawe94a37f2008-10-17 01:29:56 +0000840 if (!PyArg_ParseTuple(args, "OO!:call_tracing", &func, &PyTuple_Type, &funcargs))
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000841 return NULL;
842 return _PyEval_CallTracing(func, funcargs);
843}
844
Jeremy Hylton985eba52003-02-05 23:13:00 +0000845PyDoc_STRVAR(callstats_doc,
846"callstats() -> tuple of integers\n\
847\n\
848Return a tuple of function call statistics, if CALL_PROFILE was defined\n\
849when Python was built. Otherwise, return None.\n\
850\n\
851When enabled, this function returns detailed, implementation-specific\n\
852details about the number of function calls executed. The return value is\n\
853a 11-tuple where the entries in the tuple are counts of:\n\
8540. all function calls\n\
8551. calls to PyFunction_Type objects\n\
8562. PyFunction calls that do not create an argument tuple\n\
8573. PyFunction calls that do not create an argument tuple\n\
858 and bypass PyEval_EvalCodeEx()\n\
8594. PyMethod calls\n\
8605. PyMethod calls on bound methods\n\
8616. PyType calls\n\
8627. PyCFunction calls\n\
8638. generator calls\n\
8649. All other calls\n\
86510. Number of stack pops performed by call_function()"
866);
Barry Warsawb6a54d22000-12-06 21:47:46 +0000867
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000868#ifdef __cplusplus
869extern "C" {
870#endif
871
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000872#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000873/* Defined in objects.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000874extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000875#endif
Guido van Rossumded690f1996-05-24 20:48:31 +0000876
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000877#ifdef DYNAMIC_EXECUTION_PROFILE
878/* Defined in ceval.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +0000879extern PyObject *_Py_GetDXProfile(PyObject *, PyObject *);
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000880#endif
881
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000882#ifdef __cplusplus
883}
884#endif
885
Christian Heimes15ebc882008-02-04 18:48:49 +0000886static PyObject *
887sys_clear_type_cache(PyObject* self, PyObject* args)
888{
889 PyType_ClearCache();
890 Py_RETURN_NONE;
891}
892
893PyDoc_STRVAR(sys_clear_type_cache__doc__,
894"_clear_type_cache() -> None\n\
895Clear the internal type lookup cache.");
896
897
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000898static PyMethodDef sys_methods[] = {
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000899 /* Might as well keep this in alphabetic order */
Tim Peters216b78b2006-01-06 02:40:53 +0000900 {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS,
Jeremy Hylton985eba52003-02-05 23:13:00 +0000901 callstats_doc},
Christian Heimes15ebc882008-02-04 18:48:49 +0000902 {"_clear_type_cache", sys_clear_type_cache, METH_NOARGS,
903 sys_clear_type_cache__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000904 {"_current_frames", sys_current_frames, METH_NOARGS,
905 current_frames_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000906 {"displayhook", sys_displayhook, METH_O, displayhook_doc},
Guido van Rossum46d3dc32003-03-01 03:20:41 +0000907 {"exc_info", sys_exc_info, METH_NOARGS, exc_info_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000908 {"excepthook", sys_excepthook, METH_VARARGS, excepthook_doc},
Neal Norwitz0c766a02002-03-27 13:03:09 +0000909 {"exit", sys_exit, METH_VARARGS, exit_doc},
Tim Peters216b78b2006-01-06 02:40:53 +0000910 {"getdefaultencoding", (PyCFunction)sys_getdefaultencoding,
911 METH_NOARGS, getdefaultencoding_doc},
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000912#ifdef HAVE_DLOPEN
Tim Peters216b78b2006-01-06 02:40:53 +0000913 {"getdlopenflags", (PyCFunction)sys_getdlopenflags, METH_NOARGS,
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000914 getdlopenflags_doc},
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000915#endif
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000916#ifdef COUNT_ALLOCS
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000917 {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000918#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000919#ifdef DYNAMIC_EXECUTION_PROFILE
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000920 {"getdxp", _Py_GetDXProfile, METH_VARARGS},
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000921#endif
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000922 {"getfilesystemencoding", (PyCFunction)sys_getfilesystemencoding,
Tim Peters216b78b2006-01-06 02:40:53 +0000923 METH_NOARGS, getfilesystemencoding_doc},
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000924#ifdef Py_TRACE_REFS
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000925 {"getobjects", _Py_GetObjects, METH_VARARGS},
Tim Peters4be93d02002-07-07 19:59:50 +0000926#endif
927#ifdef Py_REF_DEBUG
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000928 {"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000929#endif
Fred Drakea7688822001-10-24 20:47:48 +0000930 {"getrefcount", (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000931 {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000932 getrecursionlimit_doc},
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +0000933 {"getsizeof", (PyCFunction)sys_getsizeof,
934 METH_VARARGS | METH_KEYWORDS, getsizeof_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000935 {"_getframe", sys_getframe, METH_VARARGS, getframe_doc},
Mark Hammond8696ebc2002-10-08 02:44:31 +0000936#ifdef MS_WINDOWS
937 {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS,
938 getwindowsversion_doc},
939#endif /* MS_WINDOWS */
Georg Brandl66a796e2006-12-19 20:50:34 +0000940 {"intern", sys_intern, METH_VARARGS, intern_doc},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000941#ifdef USE_MALLOPT
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000942 {"mdebug", sys_mdebug, METH_VARARGS},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000943#endif
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000944 {"setdefaultencoding", sys_setdefaultencoding, METH_VARARGS,
Tim Peters216b78b2006-01-06 02:40:53 +0000945 setdefaultencoding_doc},
Martin v. Löwis04dc25c2008-10-03 16:09:28 +0000946 {"setfilesystemencoding", sys_setfilesystemencoding, METH_VARARGS,
947 setfilesystemencoding_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000948 {"setcheckinterval", sys_setcheckinterval, METH_VARARGS,
Tim Peters216b78b2006-01-06 02:40:53 +0000949 setcheckinterval_doc},
Tim Peterse5e065b2003-07-06 18:36:54 +0000950 {"getcheckinterval", sys_getcheckinterval, METH_NOARGS,
Tim Peters216b78b2006-01-06 02:40:53 +0000951 getcheckinterval_doc},
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000952#ifdef WITH_THREAD
953 {"setswitchinterval", sys_setswitchinterval, METH_VARARGS,
954 setswitchinterval_doc},
955 {"getswitchinterval", sys_getswitchinterval, METH_NOARGS,
956 getswitchinterval_doc},
957#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000958#ifdef HAVE_DLOPEN
Tim Peters216b78b2006-01-06 02:40:53 +0000959 {"setdlopenflags", sys_setdlopenflags, METH_VARARGS,
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000960 setdlopenflags_doc},
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000961#endif
Neal Norwitz290d31e2002-03-03 15:12:58 +0000962 {"setprofile", sys_setprofile, METH_O, setprofile_doc},
Christian Heimes9bd667a2008-01-20 15:14:11 +0000963 {"getprofile", sys_getprofile, METH_NOARGS, getprofile_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000964 {"setrecursionlimit", sys_setrecursionlimit, METH_VARARGS,
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000965 setrecursionlimit_doc},
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000966#ifdef WITH_TSC
967 {"settscdump", sys_settscdump, METH_VARARGS, settscdump_doc},
968#endif
Neal Norwitz290d31e2002-03-03 15:12:58 +0000969 {"settrace", sys_settrace, METH_O, settrace_doc},
Christian Heimes9bd667a2008-01-20 15:14:11 +0000970 {"gettrace", sys_gettrace, METH_NOARGS, gettrace_doc},
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000971 {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000972 {NULL, NULL} /* sentinel */
973};
974
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000975static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000976list_builtin_module_names(void)
Guido van Rossum34679b71993-01-26 13:33:44 +0000977{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000978 PyObject *list = PyList_New(0);
Guido van Rossum34679b71993-01-26 13:33:44 +0000979 int i;
980 if (list == NULL)
981 return NULL;
Guido van Rossum25c649f1997-11-04 17:04:34 +0000982 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000983 PyObject *name = PyUnicode_FromString(
Guido van Rossum25c649f1997-11-04 17:04:34 +0000984 PyImport_Inittab[i].name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000985 if (name == NULL)
986 break;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000987 PyList_Append(list, name);
988 Py_DECREF(name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000989 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000990 if (PyList_Sort(list) != 0) {
991 Py_DECREF(list);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000992 list = NULL;
993 }
Guido van Rossum8f49e121997-01-06 22:55:54 +0000994 if (list) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000995 PyObject *v = PyList_AsTuple(list);
996 Py_DECREF(list);
Guido van Rossum8f49e121997-01-06 22:55:54 +0000997 list = v;
998 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000999 return list;
1000}
1001
Guido van Rossum23fff912000-12-15 22:02:05 +00001002static PyObject *warnoptions = NULL;
1003
1004void
1005PySys_ResetWarnOptions(void)
1006{
1007 if (warnoptions == NULL || !PyList_Check(warnoptions))
1008 return;
1009 PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
1010}
1011
1012void
Martin v. Löwis790465f2008-04-05 20:41:37 +00001013PySys_AddWarnOption(const wchar_t *s)
Guido van Rossum23fff912000-12-15 22:02:05 +00001014{
1015 PyObject *str;
1016
1017 if (warnoptions == NULL || !PyList_Check(warnoptions)) {
1018 Py_XDECREF(warnoptions);
1019 warnoptions = PyList_New(0);
1020 if (warnoptions == NULL)
1021 return;
1022 }
Martin v. Löwis790465f2008-04-05 20:41:37 +00001023 str = PyUnicode_FromWideChar(s, -1);
Guido van Rossum23fff912000-12-15 22:02:05 +00001024 if (str != NULL) {
1025 PyList_Append(warnoptions, str);
1026 Py_DECREF(str);
1027 }
1028}
1029
Christian Heimes33fe8092008-04-13 13:53:33 +00001030int
1031PySys_HasWarnOptions(void)
1032{
1033 return (warnoptions != NULL && (PyList_Size(warnoptions) > 0)) ? 1 : 0;
1034}
1035
Guido van Rossum40552d01998-08-06 03:34:39 +00001036/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
1037 Two literals concatenated works just fine. If you have a K&R compiler
1038 or other abomination that however *does* understand longer strings,
1039 get rid of the !!! comment in the middle and the quotes that surround it. */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001040PyDoc_VAR(sys_doc) =
1041PyDoc_STR(
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001042"This module provides access to some objects used or maintained by the\n\
1043interpreter and to functions that interact strongly with the interpreter.\n\
1044\n\
1045Dynamic objects:\n\
1046\n\
1047argv -- command line arguments; argv[0] is the script pathname if known\n\
1048path -- module search path; path[0] is the script directory, else ''\n\
1049modules -- dictionary of loaded modules\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001050\n\
1051displayhook -- called to show results in an interactive session\n\
1052excepthook -- called to handle any uncaught exception other than SystemExit\n\
1053 To customize printing in an interactive session or to install a custom\n\
1054 top-level exception handler, assign other functions to replace these.\n\
1055\n\
Benjamin Peterson06157a42008-07-15 00:28:36 +00001056stdin -- standard input file object; used by input()\n\
Georg Brandl88fc6642007-02-09 21:28:07 +00001057stdout -- standard output file object; used by print()\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001058stderr -- standard error object; used for error messages\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001059 By assigning other file objects (or objects that behave like files)\n\
1060 to these, it is possible to redirect all of the interpreter's I/O.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001061\n\
1062last_type -- type of last uncaught exception\n\
1063last_value -- value of last uncaught exception\n\
1064last_traceback -- traceback of last uncaught exception\n\
1065 These three are only available in an interactive session after a\n\
1066 traceback has been printed.\n\
Guido van Rossuma71b5f41999-01-14 19:07:00 +00001067"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001068)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001069/* concatenating string here */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001070PyDoc_STR(
Guido van Rossuma71b5f41999-01-14 19:07:00 +00001071"\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001072Static objects:\n\
1073\n\
Christian Heimes2d378ab2007-12-15 01:28:04 +00001074float_info -- a dict with information about the float implementation.\n\
Mark Dickinsonbd792642009-03-18 20:06:12 +00001075int_info -- a struct sequence with information about the int implementation.\n\
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001076maxsize -- the largest supported length of containers.\n\
Martin v. Löwisce9b5a52001-06-27 06:28:56 +00001077maxunicode -- the largest supported character\n\
Neal Norwitz2a47c0f2002-01-29 00:53:41 +00001078builtin_module_names -- tuple of module names built into this interpreter\n\
Christian Heimes2d378ab2007-12-15 01:28:04 +00001079subversion -- subversion information of the build as tuple\n\
Fred Drake801c08d2000-04-13 15:29:10 +00001080version -- the version of this interpreter as a string\n\
Eric Smith0e5b5622009-02-06 01:32:42 +00001081version_info -- version information as a named tuple\n\
Fred Drake801c08d2000-04-13 15:29:10 +00001082hexversion -- version information encoded as a single integer\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001083copyright -- copyright notice pertaining to this interpreter\n\
1084platform -- platform identifier\n\
1085executable -- pathname of this Python interpreter\n\
1086prefix -- prefix used to find the Python library\n\
1087exec_prefix -- prefix used to find the machine-specific Python library\n\
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00001088float_repr_style -- string indicating the style of repr() output for floats\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001089"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001090)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001091#ifdef MS_WINDOWS
1092/* concatenating string here */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001093PyDoc_STR(
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001094"dllhandle -- [Windows only] integer handle of the Python DLL\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001095winver -- [Windows only] version number of the Python DLL\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001096"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001097)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001098#endif /* MS_WINDOWS */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001099PyDoc_STR(
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001100"__stdin__ -- the original stdin; don't touch!\n\
1101__stdout__ -- the original stdout; don't touch!\n\
1102__stderr__ -- the original stderr; don't touch!\n\
1103__displayhook__ -- the original displayhook; don't touch!\n\
1104__excepthook__ -- the original excepthook; don't touch!\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001105\n\
1106Functions:\n\
1107\n\
Georg Brandl1a3284e2007-12-02 09:40:06 +00001108displayhook() -- print an object to the screen, and save it in builtins._\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001109excepthook() -- print an exception and its traceback to sys.stderr\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001110exc_info() -- return thread-safe information about the current exception\n\
1111exit() -- exit the interpreter by raising SystemExit\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001112getdlopenflags() -- returns flags to be used for dlopen() calls\n\
Christian Heimes9bd667a2008-01-20 15:14:11 +00001113getprofile() -- get the global profiling function\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001114getrefcount() -- return the reference count for an object (plus one :-)\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001115getrecursionlimit() -- return the max recursion depth for the interpreter\n\
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001116getsizeof() -- return the size of an object in bytes\n\
Christian Heimes9bd667a2008-01-20 15:14:11 +00001117gettrace() -- get the global debug tracing function\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001118setcheckinterval() -- control how often the interpreter checks for events\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001119setdlopenflags() -- set the flags to be used for dlopen() calls\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001120setprofile() -- set the global profiling function\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001121setrecursionlimit() -- set the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001122settrace() -- set the global debug tracing function\n\
Fred Drakeccede592000-08-14 20:59:57 +00001123"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001124)
Fred Drakeccede592000-08-14 20:59:57 +00001125/* end of sys_doc */ ;
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001126
Martin v. Löwis43b57802006-01-05 23:38:54 +00001127/* Subversion branch and revision management */
1128static const char _patchlevel_revision[] = PY_PATCHLEVEL_REVISION;
1129static const char headurl[] = "$HeadURL$";
1130static int svn_initialized;
1131static char patchlevel_revision[50]; /* Just the number */
1132static char branch[50];
1133static char shortbranch[50];
1134static const char *svn_revision;
1135
Tim Peterse86e7a52006-01-06 02:42:46 +00001136static void
1137svnversion_init(void)
Martin v. Löwis43b57802006-01-05 23:38:54 +00001138{
1139 const char *python, *br_start, *br_end, *br_end2, *svnversion;
Martin v. Löwisd96ee902006-02-16 14:37:16 +00001140 Py_ssize_t len;
Collin Winterd5a5f5d2007-08-22 19:45:07 +00001141 int istag = 0;
Martin v. Löwis43b57802006-01-05 23:38:54 +00001142
1143 if (svn_initialized)
1144 return;
1145
1146 python = strstr(headurl, "/python/");
Collin Winterd5a5f5d2007-08-22 19:45:07 +00001147 if (!python) {
1148 strcpy(branch, "unknown branch");
1149 strcpy(shortbranch, "unknown");
Tim Peters216b78b2006-01-06 02:40:53 +00001150 }
Martin v. Löwis43b57802006-01-05 23:38:54 +00001151 else {
Collin Winterd5a5f5d2007-08-22 19:45:07 +00001152 br_start = python + 8;
1153 br_end = strchr(br_start, '/');
1154 assert(br_end);
1155
1156 /* Works even for trunk,
1157 as we are in trunk/Python/sysmodule.c */
1158 br_end2 = strchr(br_end+1, '/');
1159
1160 istag = strncmp(br_start, "tags", 4) == 0;
1161 if (strncmp(br_start, "trunk", 5) == 0) {
1162 strcpy(branch, "trunk");
1163 strcpy(shortbranch, "trunk");
1164 }
1165 else if (istag || strncmp(br_start, "branches", 8) == 0) {
1166 len = br_end2 - br_start;
1167 strncpy(branch, br_start, len);
1168 branch[len] = '\0';
1169
1170 len = br_end2 - (br_end + 1);
1171 strncpy(shortbranch, br_end + 1, len);
1172 shortbranch[len] = '\0';
1173 }
1174 else {
1175 Py_FatalError("bad HeadURL");
1176 return;
1177 }
Martin v. Löwis43b57802006-01-05 23:38:54 +00001178 }
1179
1180
1181 svnversion = _Py_svnversion();
Benjamin Petersonf53eec82009-05-23 19:36:27 +00001182 if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0)
Martin v. Löwis43b57802006-01-05 23:38:54 +00001183 svn_revision = svnversion;
1184 else if (istag) {
1185 len = strlen(_patchlevel_revision);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001186 assert(len >= 13);
1187 assert(len < (sizeof(patchlevel_revision) + 13));
Martin v. Löwis43b57802006-01-05 23:38:54 +00001188 strncpy(patchlevel_revision, _patchlevel_revision + 11,
1189 len - 13);
1190 patchlevel_revision[len - 13] = '\0';
1191 svn_revision = patchlevel_revision;
1192 }
1193 else
1194 svn_revision = "";
Tim Peters216b78b2006-01-06 02:40:53 +00001195
Martin v. Löwis43b57802006-01-05 23:38:54 +00001196 svn_initialized = 1;
1197}
1198
1199/* Return svnversion output if available.
1200 Else return Revision of patchlevel.h if on branch.
1201 Else return empty string */
1202const char*
1203Py_SubversionRevision()
1204{
1205 svnversion_init();
1206 return svn_revision;
1207}
1208
1209const char*
1210Py_SubversionShortBranch()
1211{
1212 svnversion_init();
1213 return shortbranch;
1214}
1215
Christian Heimesd32ed6f2008-01-14 18:49:24 +00001216
1217PyDoc_STRVAR(flags__doc__,
1218"sys.flags\n\
1219\n\
1220Flags provided through command line arguments or environment vars.");
1221
1222static PyTypeObject FlagsType;
1223
1224static PyStructSequence_Field flags_fields[] = {
1225 {"debug", "-d"},
1226 {"division_warning", "-Q"},
1227 {"inspect", "-i"},
1228 {"interactive", "-i"},
1229 {"optimize", "-O or -OO"},
1230 {"dont_write_bytecode", "-B"},
Christian Heimes8dc226f2008-05-06 23:45:46 +00001231 {"no_user_site", "-s"},
Christian Heimesd32ed6f2008-01-14 18:49:24 +00001232 {"no_site", "-S"},
Guido van Rossum7736b5b2008-01-15 21:44:53 +00001233 {"ignore_environment", "-E"},
Christian Heimesd32ed6f2008-01-14 18:49:24 +00001234 {"verbose", "-v"},
1235#ifdef RISCOS
Guido van Rossum7736b5b2008-01-15 21:44:53 +00001236 {"riscos_wimp", "???"},
Christian Heimesd32ed6f2008-01-14 18:49:24 +00001237#endif
1238 /* {"unbuffered", "-u"}, */
1239 /* {"skip_first", "-x"}, */
Christian Heimes33fe8092008-04-13 13:53:33 +00001240 {"bytes_warning", "-b"},
Christian Heimesd32ed6f2008-01-14 18:49:24 +00001241 {0}
1242};
1243
1244static PyStructSequence_Desc flags_desc = {
1245 "sys.flags", /* name */
1246 flags__doc__, /* doc */
1247 flags_fields, /* fields */
1248#ifdef RISCOS
Georg Brandlc5e88d52008-06-06 09:02:07 +00001249 12
Georg Brandle1b5ac62008-06-04 13:06:58 +00001250#else
Georg Brandlc5e88d52008-06-06 09:02:07 +00001251 11
Christian Heimesd32ed6f2008-01-14 18:49:24 +00001252#endif
1253};
1254
1255static PyObject*
1256make_flags(void)
1257{
1258 int pos = 0;
1259 PyObject *seq;
1260
1261 seq = PyStructSequence_New(&FlagsType);
1262 if (seq == NULL)
1263 return NULL;
1264
1265#define SetFlag(flag) \
1266 PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag))
1267
1268 SetFlag(Py_DebugFlag);
1269 SetFlag(Py_DivisionWarningFlag);
1270 SetFlag(Py_InspectFlag);
1271 SetFlag(Py_InteractiveFlag);
1272 SetFlag(Py_OptimizeFlag);
1273 SetFlag(Py_DontWriteBytecodeFlag);
Christian Heimes8dc226f2008-05-06 23:45:46 +00001274 SetFlag(Py_NoUserSiteDirectory);
Christian Heimesd32ed6f2008-01-14 18:49:24 +00001275 SetFlag(Py_NoSiteFlag);
1276 SetFlag(Py_IgnoreEnvironmentFlag);
Christian Heimesd32ed6f2008-01-14 18:49:24 +00001277 SetFlag(Py_VerboseFlag);
1278#ifdef RISCOS
1279 SetFlag(Py_RISCOSWimpFlag);
1280#endif
1281 /* SetFlag(saw_unbuffered_flag); */
1282 /* SetFlag(skipfirstline); */
Christian Heimes33fe8092008-04-13 13:53:33 +00001283 SetFlag(Py_BytesWarningFlag);
Christian Heimesd32ed6f2008-01-14 18:49:24 +00001284#undef SetFlag
1285
1286 if (PyErr_Occurred()) {
1287 return NULL;
1288 }
Christian Heimesd32ed6f2008-01-14 18:49:24 +00001289 return seq;
1290}
1291
Eric Smith0e5b5622009-02-06 01:32:42 +00001292PyDoc_STRVAR(version_info__doc__,
1293"sys.version_info\n\
1294\n\
1295Version information as a named tuple.");
1296
1297static PyTypeObject VersionInfoType;
1298
1299static PyStructSequence_Field version_info_fields[] = {
1300 {"major", "Major release number"},
1301 {"minor", "Minor release number"},
1302 {"micro", "Patch release number"},
1303 {"releaselevel", "'alpha', 'beta', 'candidate', or 'release'"},
1304 {"serial", "Serial release number"},
1305 {0}
1306};
1307
1308static PyStructSequence_Desc version_info_desc = {
1309 "sys.version_info", /* name */
1310 version_info__doc__, /* doc */
1311 version_info_fields, /* fields */
1312 5
1313};
1314
1315static PyObject *
1316make_version_info(void)
1317{
1318 PyObject *version_info;
1319 char *s;
1320 int pos = 0;
1321
1322 version_info = PyStructSequence_New(&VersionInfoType);
1323 if (version_info == NULL) {
1324 return NULL;
1325 }
1326
1327 /*
1328 * These release level checks are mutually exclusive and cover
1329 * the field, so don't get too fancy with the pre-processor!
1330 */
1331#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
1332 s = "alpha";
1333#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
1334 s = "beta";
1335#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
1336 s = "candidate";
1337#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
1338 s = "final";
1339#endif
1340
1341#define SetIntItem(flag) \
1342 PyStructSequence_SET_ITEM(version_info, pos++, PyLong_FromLong(flag))
1343#define SetStrItem(flag) \
1344 PyStructSequence_SET_ITEM(version_info, pos++, PyUnicode_FromString(flag))
1345
1346 SetIntItem(PY_MAJOR_VERSION);
1347 SetIntItem(PY_MINOR_VERSION);
1348 SetIntItem(PY_MICRO_VERSION);
1349 SetStrItem(s);
1350 SetIntItem(PY_RELEASE_SERIAL);
1351#undef SetIntItem
1352#undef SetStrItem
1353
1354 if (PyErr_Occurred()) {
1355 Py_CLEAR(version_info);
1356 return NULL;
1357 }
1358 return version_info;
1359}
1360
Martin v. Löwis1a214512008-06-11 05:26:20 +00001361static struct PyModuleDef sysmodule = {
1362 PyModuleDef_HEAD_INIT,
1363 "sys",
1364 sys_doc,
Christian Heimes6a27efa2008-10-30 21:48:26 +00001365 -1, /* multiple "initialization" just copies the module dict. */
Martin v. Löwis1a214512008-06-11 05:26:20 +00001366 sys_methods,
1367 NULL,
1368 NULL,
1369 NULL,
1370 NULL
1371};
1372
Guido van Rossum25ce5661997-08-02 03:10:38 +00001373PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001374_PySys_Init(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001375{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001376 PyObject *m, *v, *sysdict;
Fred Drake6d27c1e2000-04-13 20:03:20 +00001377 char *s;
Guido van Rossum25ce5661997-08-02 03:10:38 +00001378
Martin v. Löwis1a214512008-06-11 05:26:20 +00001379 m = PyModule_Create(&sysmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001380 if (m == NULL)
1381 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001382 sysdict = PyModule_GetDict(m);
Christian Heimes7b3ce6a2008-01-31 14:31:45 +00001383#define SET_SYS_FROM_STRING(key, value) \
1384 v = value; \
1385 if (v != NULL) \
1386 PyDict_SetItemString(sysdict, key, v); \
1387 Py_XDECREF(v)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001388
Martin v. Löwisec59d042009-01-12 07:59:10 +00001389 /* Check that stdin is not a directory
1390 Using shell redirection, you can redirect stdin to a directory,
1391 crashing the Python interpreter. Catch this common mistake here
1392 and output a useful error message. Note that under MS Windows,
1393 the shell already prevents that. */
1394#if !defined(MS_WINDOWS)
Neal Norwitz11bd1192005-10-03 00:54:56 +00001395 {
Neal Norwitz11bd1192005-10-03 00:54:56 +00001396 struct stat sb;
1397 if (fstat(fileno(stdin), &sb) == 0 &&
1398 S_ISDIR(sb.st_mode)) {
Neal Norwitz72c2c062006-03-09 05:58:11 +00001399 /* There's nothing more we can do. */
1400 /* Py_FatalError() will core dump, so just exit. */
1401 PySys_WriteStderr("Python error: <stdin> is a directory, cannot continue\n");
1402 exit(EXIT_FAILURE);
Neal Norwitz11bd1192005-10-03 00:54:56 +00001403 }
1404 }
Martin v. Löwisec59d042009-01-12 07:59:10 +00001405#endif
Neal Norwitz11bd1192005-10-03 00:54:56 +00001406
Nick Coghlane7837002007-12-21 07:31:17 +00001407 /* stdin/stdout/stderr are now set by pythonrun.c */
Martin v. Löwis5467d4c2003-05-10 07:10:12 +00001408
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001409 PyDict_SetItemString(sysdict, "__displayhook__",
Christian Heimesdae2a892008-04-19 00:55:37 +00001410 PyDict_GetItemString(sysdict, "displayhook"));
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001411 PyDict_SetItemString(sysdict, "__excepthook__",
Christian Heimesdae2a892008-04-19 00:55:37 +00001412 PyDict_GetItemString(sysdict, "excepthook"));
Christian Heimes7b3ce6a2008-01-31 14:31:45 +00001413 SET_SYS_FROM_STRING("version",
1414 PyUnicode_FromString(Py_GetVersion()));
1415 SET_SYS_FROM_STRING("hexversion",
1416 PyLong_FromLong(PY_VERSION_HEX));
Martin v. Löwis43b57802006-01-05 23:38:54 +00001417 svnversion_init();
Christian Heimes7b3ce6a2008-01-31 14:31:45 +00001418 SET_SYS_FROM_STRING("subversion",
1419 Py_BuildValue("(UUU)", "CPython", branch,
1420 svn_revision));
1421 SET_SYS_FROM_STRING("dont_write_bytecode",
Christian Heimesdae2a892008-04-19 00:55:37 +00001422 PyBool_FromLong(Py_DontWriteBytecodeFlag));
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001423 SET_SYS_FROM_STRING("api_version",
Christian Heimes217cfd12007-12-02 14:31:20 +00001424 PyLong_FromLong(PYTHON_API_VERSION));
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001425 SET_SYS_FROM_STRING("copyright",
Walter Dörwald94093ff2007-06-07 18:41:59 +00001426 PyUnicode_FromString(Py_GetCopyright()));
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001427 SET_SYS_FROM_STRING("platform",
Walter Dörwald94093ff2007-06-07 18:41:59 +00001428 PyUnicode_FromString(Py_GetPlatform()));
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001429 SET_SYS_FROM_STRING("executable",
Martin v. Löwis790465f2008-04-05 20:41:37 +00001430 PyUnicode_FromWideChar(
1431 Py_GetProgramFullPath(), -1));
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001432 SET_SYS_FROM_STRING("prefix",
Martin v. Löwis790465f2008-04-05 20:41:37 +00001433 PyUnicode_FromWideChar(Py_GetPrefix(), -1));
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001434 SET_SYS_FROM_STRING("exec_prefix",
Martin v. Löwis790465f2008-04-05 20:41:37 +00001435 PyUnicode_FromWideChar(Py_GetExecPrefix(), -1));
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001436 SET_SYS_FROM_STRING("maxsize",
Christian Heimes217cfd12007-12-02 14:31:20 +00001437 PyLong_FromSsize_t(PY_SSIZE_T_MAX));
Christian Heimes93852662007-12-01 12:22:32 +00001438 SET_SYS_FROM_STRING("float_info",
1439 PyFloat_GetInfo());
Mark Dickinsonbd792642009-03-18 20:06:12 +00001440 SET_SYS_FROM_STRING("int_info",
1441 PyLong_GetInfo());
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001442 SET_SYS_FROM_STRING("maxunicode",
Christian Heimes217cfd12007-12-02 14:31:20 +00001443 PyLong_FromLong(PyUnicode_GetMax()));
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001444 SET_SYS_FROM_STRING("builtin_module_names",
1445 list_builtin_module_names());
Fred Drake099325e2000-08-14 15:47:03 +00001446 {
1447 /* Assumes that longs are at least 2 bytes long.
1448 Should be safe! */
1449 unsigned long number = 1;
Fred Drakea2b6ad62000-08-15 04:24:43 +00001450 char *value;
Fred Drake099325e2000-08-14 15:47:03 +00001451
1452 s = (char *) &number;
1453 if (s[0] == 0)
Fred Drakea2b6ad62000-08-15 04:24:43 +00001454 value = "big";
Fred Drake099325e2000-08-14 15:47:03 +00001455 else
Fred Drakea2b6ad62000-08-15 04:24:43 +00001456 value = "little";
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001457 SET_SYS_FROM_STRING("byteorder",
Walter Dörwald94093ff2007-06-07 18:41:59 +00001458 PyUnicode_FromString(value));
Fred Drake099325e2000-08-14 15:47:03 +00001459 }
Guido van Rossum8b9ea871996-08-23 18:14:47 +00001460#ifdef MS_COREDLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001461 SET_SYS_FROM_STRING("dllhandle",
1462 PyLong_FromVoidPtr(PyWin_DLLhModule));
1463 SET_SYS_FROM_STRING("winver",
Walter Dörwald94093ff2007-06-07 18:41:59 +00001464 PyUnicode_FromString(PyWin_DLLVersionString));
Guido van Rossumc606fe11996-04-09 02:37:57 +00001465#endif
Guido van Rossum23fff912000-12-15 22:02:05 +00001466 if (warnoptions == NULL) {
1467 warnoptions = PyList_New(0);
1468 }
1469 else {
1470 Py_INCREF(warnoptions);
1471 }
1472 if (warnoptions != NULL) {
Guido van Rossum03df3b32001-01-13 22:06:05 +00001473 PyDict_SetItemString(sysdict, "warnoptions", warnoptions);
Guido van Rossum23fff912000-12-15 22:02:05 +00001474 }
Tim Peters216b78b2006-01-06 02:40:53 +00001475
Eric Smith0e5b5622009-02-06 01:32:42 +00001476 /* version_info */
1477 if (VersionInfoType.tp_name == 0)
1478 PyStructSequence_InitType(&VersionInfoType, &version_info_desc);
1479 SET_SYS_FROM_STRING("version_info", make_version_info());
1480 /* prevent user from creating new instances */
1481 VersionInfoType.tp_init = NULL;
1482 VersionInfoType.tp_new = NULL;
1483
1484 /* flags */
Christian Heimes7b3ce6a2008-01-31 14:31:45 +00001485 if (FlagsType.tp_name == 0)
1486 PyStructSequence_InitType(&FlagsType, &flags_desc);
1487 SET_SYS_FROM_STRING("flags", make_flags());
Christian Heimesd32ed6f2008-01-14 18:49:24 +00001488 /* prevent user from creating new instances */
1489 FlagsType.tp_init = NULL;
1490 FlagsType.tp_new = NULL;
1491
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00001492 /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
1493#ifndef PY_NO_SHORT_FLOAT_REPR
1494 SET_SYS_FROM_STRING("float_repr_style",
1495 PyUnicode_FromString("short"));
1496#else
1497 SET_SYS_FROM_STRING("float_repr_style",
1498 PyUnicode_FromString("legacy"));
1499#endif
1500
Christian Heimes7b3ce6a2008-01-31 14:31:45 +00001501#undef SET_SYS_FROM_STRING
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001502 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +00001503 return NULL;
1504 return m;
Guido van Rossum5b3138b1990-11-18 17:41:40 +00001505}
1506
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001507static PyObject *
Martin v. Löwis790465f2008-04-05 20:41:37 +00001508makepathobject(const wchar_t *path, wchar_t delim)
Guido van Rossum5b3138b1990-11-18 17:41:40 +00001509{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001510 int i, n;
Martin v. Löwis790465f2008-04-05 20:41:37 +00001511 const wchar_t *p;
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001512 PyObject *v, *w;
Tim Peters216b78b2006-01-06 02:40:53 +00001513
Guido van Rossum3f5da241990-12-20 15:06:42 +00001514 n = 1;
1515 p = path;
Martin v. Löwis790465f2008-04-05 20:41:37 +00001516 while ((p = wcschr(p, delim)) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001517 n++;
1518 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +00001519 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001520 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001521 if (v == NULL)
1522 return NULL;
1523 for (i = 0; ; i++) {
Martin v. Löwis790465f2008-04-05 20:41:37 +00001524 p = wcschr(path, delim);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001525 if (p == NULL)
Barry Warsaw460ce2a2008-10-17 01:15:29 +00001526 p = path + wcslen(path); /* End of string */
Martin v. Löwis790465f2008-04-05 20:41:37 +00001527 w = PyUnicode_FromWideChar(path, (Py_ssize_t)(p - path));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001528 if (w == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001529 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001530 return NULL;
1531 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001532 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001533 if (*p == '\0')
1534 break;
1535 path = p+1;
1536 }
1537 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001538}
1539
1540void
Martin v. Löwis790465f2008-04-05 20:41:37 +00001541PySys_SetPath(const wchar_t *path)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001542{
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001543 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001544 if ((v = makepathobject(path, DELIM)) == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001545 Py_FatalError("can't create sys.path");
1546 if (PySys_SetObject("path", v) != 0)
1547 Py_FatalError("can't assign sys.path");
1548 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001549}
1550
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001551static PyObject *
Martin v. Löwis790465f2008-04-05 20:41:37 +00001552makeargvobject(int argc, wchar_t **argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001553{
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001554 PyObject *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +00001555 if (argc <= 0 || argv == NULL) {
1556 /* Ensure at least one (empty) argument is seen */
Martin v. Löwis790465f2008-04-05 20:41:37 +00001557 static wchar_t *empty_argv[1] = {L""};
Guido van Rossumee3a2991992-01-14 18:42:53 +00001558 argv = empty_argv;
1559 argc = 1;
1560 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001561 av = PyList_New(argc);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001562 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +00001563 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001564 for (i = 0; i < argc; i++) {
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00001565#ifdef __VMS
1566 PyObject *v;
1567
1568 /* argv[0] is the script pathname if known */
1569 if (i == 0) {
1570 char* fn = decc$translate_vms(argv[0]);
1571 if ((fn == (char *)0) || fn == (char *)-1)
Guido van Rossum96ca6912007-06-15 03:49:03 +00001572 v = PyUnicode_FromString(argv[0]);
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00001573 else
Guido van Rossum96ca6912007-06-15 03:49:03 +00001574 v = PyUnicode_FromString(
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00001575 decc$translate_vms(argv[0]));
1576 } else
Guido van Rossum96ca6912007-06-15 03:49:03 +00001577 v = PyUnicode_FromString(argv[i]);
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00001578#else
Martin v. Löwis790465f2008-04-05 20:41:37 +00001579 PyObject *v = PyUnicode_FromWideChar(argv[i], -1);
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00001580#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +00001581 if (v == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001582 Py_DECREF(av);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001583 av = NULL;
1584 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +00001585 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001586 PyList_SetItem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +00001587 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +00001588 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001589 return av;
1590}
1591
Martin v. Löwis790465f2008-04-05 20:41:37 +00001592#ifdef HAVE_REALPATH
1593static wchar_t*
1594_wrealpath(const wchar_t *path, wchar_t *resolved_path)
1595{
1596 char cpath[PATH_MAX];
1597 char cresolved_path[PATH_MAX];
1598 char *res;
1599 size_t r;
1600 r = wcstombs(cpath, path, PATH_MAX);
1601 if (r == (size_t)-1 || r >= PATH_MAX) {
1602 errno = EINVAL;
1603 return NULL;
1604 }
1605 res = realpath(cpath, cresolved_path);
1606 if (res == NULL)
1607 return NULL;
1608 r = mbstowcs(resolved_path, cresolved_path, PATH_MAX);
1609 if (r == (size_t)-1 || r >= PATH_MAX) {
1610 errno = EINVAL;
1611 return NULL;
1612 }
1613 return resolved_path;
1614}
1615#endif
1616
Guido van Rossum3f5da241990-12-20 15:06:42 +00001617void
Martin v. Löwis790465f2008-04-05 20:41:37 +00001618PySys_SetArgv(int argc, wchar_t **argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001619{
Guido van Rossum162e38c2003-02-19 15:25:10 +00001620#if defined(HAVE_REALPATH)
Martin v. Löwis790465f2008-04-05 20:41:37 +00001621 wchar_t fullpath[MAXPATHLEN];
Martin v. Löwisec59d042009-01-12 07:59:10 +00001622#elif defined(MS_WINDOWS) && !defined(MS_WINCE)
Martin v. Löwis790465f2008-04-05 20:41:37 +00001623 wchar_t fullpath[MAX_PATH];
Thomas Heller27bb71e2003-01-08 14:33:48 +00001624#endif
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001625 PyObject *av = makeargvobject(argc, argv);
1626 PyObject *path = PySys_GetObject("path");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001627 if (av == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001628 Py_FatalError("no mem for sys.argv");
1629 if (PySys_SetObject("argv", av) != 0)
1630 Py_FatalError("can't assign sys.argv");
Guido van Rossum94a96671996-07-30 20:35:50 +00001631 if (path != NULL) {
Martin v. Löwis790465f2008-04-05 20:41:37 +00001632 wchar_t *argv0 = argv[0];
1633 wchar_t *p = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001634 Py_ssize_t n = 0;
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001635 PyObject *a;
Martin v. Löwis790465f2008-04-05 20:41:37 +00001636 extern int _Py_wreadlink(const wchar_t *, wchar_t *, size_t);
Guido van Rossumc474dea1997-04-25 15:38:31 +00001637#ifdef HAVE_READLINK
Martin v. Löwis790465f2008-04-05 20:41:37 +00001638 wchar_t link[MAXPATHLEN+1];
1639 wchar_t argv0copy[2*MAXPATHLEN+1];
Guido van Rossumc474dea1997-04-25 15:38:31 +00001640 int nr = 0;
Martin v. Löwis790465f2008-04-05 20:41:37 +00001641 if (argc > 0 && argv0 != NULL && wcscmp(argv0, L"-c") != 0)
1642 nr = _Py_wreadlink(argv0, link, MAXPATHLEN);
Guido van Rossumc474dea1997-04-25 15:38:31 +00001643 if (nr > 0) {
1644 /* It's a symlink */
1645 link[nr] = '\0';
1646 if (link[0] == SEP)
1647 argv0 = link; /* Link to absolute path */
Martin v. Löwis790465f2008-04-05 20:41:37 +00001648 else if (wcschr(link, SEP) == NULL)
Guido van Rossumc474dea1997-04-25 15:38:31 +00001649 ; /* Link without path */
1650 else {
1651 /* Must join(dirname(argv0), link) */
Martin v. Löwis790465f2008-04-05 20:41:37 +00001652 wchar_t *q = wcsrchr(argv0, SEP);
Guido van Rossumc474dea1997-04-25 15:38:31 +00001653 if (q == NULL)
1654 argv0 = link; /* argv0 without path */
1655 else {
1656 /* Must make a copy */
Martin v. Löwis790465f2008-04-05 20:41:37 +00001657 wcscpy(argv0copy, argv0);
1658 q = wcsrchr(argv0copy, SEP);
1659 wcscpy(q+1, link);
Guido van Rossumc474dea1997-04-25 15:38:31 +00001660 argv0 = argv0copy;
1661 }
1662 }
1663 }
1664#endif /* HAVE_READLINK */
Guido van Rossumcc883411996-09-10 14:44:21 +00001665#if SEP == '\\' /* Special case for MS filename syntax */
Martin v. Löwis790465f2008-04-05 20:41:37 +00001666 if (argc > 0 && argv0 != NULL && wcscmp(argv0, L"-c") != 0) {
1667 wchar_t *q;
Martin v. Löwisec59d042009-01-12 07:59:10 +00001668#if defined(MS_WINDOWS) && !defined(MS_WINCE)
1669 /* This code here replaces the first element in argv with the full
1670 path that it represents. Under CE, there are no relative paths so
1671 the argument must be the full path anyway. */
Martin v. Löwis790465f2008-04-05 20:41:37 +00001672 wchar_t *ptemp;
1673 if (GetFullPathNameW(argv0,
1674 sizeof(fullpath)/sizeof(fullpath[0]),
Thomas Heller27bb71e2003-01-08 14:33:48 +00001675 fullpath,
1676 &ptemp)) {
1677 argv0 = fullpath;
1678 }
1679#endif
Martin v. Löwis790465f2008-04-05 20:41:37 +00001680 p = wcsrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +00001681 /* Test for alternate separator */
Martin v. Löwis790465f2008-04-05 20:41:37 +00001682 q = wcsrchr(p ? p : argv0, '/');
Guido van Rossumcc883411996-09-10 14:44:21 +00001683 if (q != NULL)
1684 p = q;
1685 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +00001686 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +00001687 if (n > 1 && p[-1] != ':')
1688 n--; /* Drop trailing separator */
1689 }
1690 }
1691#else /* All other filename syntaxes */
Martin v. Löwis790465f2008-04-05 20:41:37 +00001692 if (argc > 0 && argv0 != NULL && wcscmp(argv0, L"-c") != 0) {
Guido van Rossum162e38c2003-02-19 15:25:10 +00001693#if defined(HAVE_REALPATH)
Martin v. Löwis790465f2008-04-05 20:41:37 +00001694 if (_wrealpath(argv0, fullpath)) {
Guido van Rossum162e38c2003-02-19 15:25:10 +00001695 argv0 = fullpath;
1696 }
1697#endif
Martin v. Löwis790465f2008-04-05 20:41:37 +00001698 p = wcsrchr(argv0, SEP);
Guido van Rossum162e38c2003-02-19 15:25:10 +00001699 }
Guido van Rossumcc883411996-09-10 14:44:21 +00001700 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +00001701 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +00001702#if SEP == '/' /* Special case for Unix filename syntax */
1703 if (n > 1)
1704 n--; /* Drop trailing separator */
1705#endif /* Unix */
1706 }
1707#endif /* All others */
Martin v. Löwis790465f2008-04-05 20:41:37 +00001708 a = PyUnicode_FromWideChar(argv0, n);
Guido van Rossum94a96671996-07-30 20:35:50 +00001709 if (a == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001710 Py_FatalError("no mem for sys.path insertion");
1711 if (PyList_Insert(path, 0, a) < 0)
1712 Py_FatalError("sys.path.insert(0) failed");
1713 Py_DECREF(a);
Guido van Rossuma63d9f41996-07-24 01:31:37 +00001714 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001715 Py_DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001716}
Guido van Rossuma890e681998-05-12 14:59:24 +00001717
1718
1719/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
1720 Adapted from code submitted by Just van Rossum.
1721
1722 PySys_WriteStdout(format, ...)
1723 PySys_WriteStderr(format, ...)
1724
1725 The first function writes to sys.stdout; the second to sys.stderr. When
1726 there is a problem, they write to the real (C level) stdout or stderr;
Guido van Rossum8442af31998-10-12 18:22:10 +00001727 no exceptions are raised.
Guido van Rossuma890e681998-05-12 14:59:24 +00001728
1729 Both take a printf-style format string as their first argument followed
1730 by a variable length argument list determined by the format string.
1731
1732 *** WARNING ***
1733
1734 The format should limit the total size of the formatted output string to
1735 1000 bytes. In particular, this means that no unrestricted "%s" formats
1736 should occur; these should be limited using "%.<N>s where <N> is a
1737 decimal number calculated so that <N> plus the maximum size of other
1738 formatted text does not exceed 1000 bytes. Also watch out for "%f",
1739 which can print hundreds of digits for very large numbers.
1740
1741 */
1742
1743static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001744mywrite(char *name, FILE *fp, const char *format, va_list va)
Guido van Rossuma890e681998-05-12 14:59:24 +00001745{
1746 PyObject *file;
Guido van Rossum8442af31998-10-12 18:22:10 +00001747 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001748 char buffer[1001];
1749 int written;
Guido van Rossuma890e681998-05-12 14:59:24 +00001750
Guido van Rossum8442af31998-10-12 18:22:10 +00001751 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +00001752 file = PySys_GetObject(name);
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001753 written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
1754 if (PyFile_WriteString(buffer, file) != 0) {
1755 PyErr_Clear();
1756 fputs(buffer, fp);
1757 }
1758 if (written < 0 || (size_t)written >= sizeof(buffer)) {
1759 const char *truncated = "... truncated";
1760 if (PyFile_WriteString(truncated, file) != 0) {
Guido van Rossuma890e681998-05-12 14:59:24 +00001761 PyErr_Clear();
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001762 fputs(truncated, fp);
Jeremy Hylton5d3d1342001-11-28 21:44:53 +00001763 }
Guido van Rossuma890e681998-05-12 14:59:24 +00001764 }
Guido van Rossum8442af31998-10-12 18:22:10 +00001765 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +00001766}
1767
1768void
Guido van Rossuma890e681998-05-12 14:59:24 +00001769PySys_WriteStdout(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00001770{
1771 va_list va;
1772
Guido van Rossuma890e681998-05-12 14:59:24 +00001773 va_start(va, format);
Guido van Rossuma890e681998-05-12 14:59:24 +00001774 mywrite("stdout", stdout, format, va);
1775 va_end(va);
1776}
1777
1778void
Guido van Rossuma890e681998-05-12 14:59:24 +00001779PySys_WriteStderr(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00001780{
1781 va_list va;
1782
Guido van Rossuma890e681998-05-12 14:59:24 +00001783 va_start(va, format);
Guido van Rossuma890e681998-05-12 14:59:24 +00001784 mywrite("stderr", stderr, format, va);
1785 va_end(va);
1786}