blob: 5175158a3b001955e2d091d57e1657f6f3d8b9bd [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"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018#include "code.h"
Barry Warsawb6a54d22000-12-06 21:47:46 +000019#include "frameobject.h"
Victor Stinner331a6a52019-05-27 16:39:22 +020020#include "pycore_initconfig.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010021#include "pycore_pylifecycle.h"
22#include "pycore_pymem.h"
Victor Stinnera1c249c2018-11-01 03:15:58 +010023#include "pycore_pathconfig.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010024#include "pycore_pystate.h"
Steve Dowerb82e17e2019-05-23 08:45:22 -070025#include "pycore_tupleobject.h"
Victor Stinnerd5c355c2011-04-30 14:53:09 +020026#include "pythread.h"
Steve Dowerb82e17e2019-05-23 08:45:22 -070027#include "pydtrace.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028
Guido van Rossume2437a11992-03-23 18:20:18 +000029#include "osdefs.h"
Stefan Krah1845d142016-04-25 21:38:53 +020030#include <locale.h>
Guido van Rossum3f5da241990-12-20 15:06:42 +000031
Mark Hammond8696ebc2002-10-08 02:44:31 +000032#ifdef MS_WINDOWS
33#define WIN32_LEAN_AND_MEAN
Amaury Forgeot d'Arc06cfe952007-11-10 13:55:44 +000034#include <windows.h>
Mark Hammond8696ebc2002-10-08 02:44:31 +000035#endif /* MS_WINDOWS */
36
Guido van Rossum9b38a141996-09-11 23:12:24 +000037#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000038extern void *PyWin_DLLhModule;
Guido van Rossum6c1e5f21997-09-29 23:34:23 +000039/* A string loaded from the DLL at startup: */
40extern const char *PyWin_DLLVersionString;
Guido van Rossumc606fe11996-04-09 02:37:57 +000041#endif
42
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -080043/*[clinic input]
44module sys
45[clinic start generated code]*/
46/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3726b388feee8cea]*/
47
48#include "clinic/sysmodule.c.h"
49
Victor Stinnerbd303c12013-11-07 23:07:29 +010050_Py_IDENTIFIER(_);
51_Py_IDENTIFIER(__sizeof__);
Eric Snowdae02762017-09-14 00:35:58 -070052_Py_IDENTIFIER(_xoptions);
Victor Stinnerbd303c12013-11-07 23:07:29 +010053_Py_IDENTIFIER(buffer);
54_Py_IDENTIFIER(builtins);
55_Py_IDENTIFIER(encoding);
56_Py_IDENTIFIER(path);
57_Py_IDENTIFIER(stdout);
58_Py_IDENTIFIER(stderr);
Eric Snowdae02762017-09-14 00:35:58 -070059_Py_IDENTIFIER(warnoptions);
Victor Stinnerbd303c12013-11-07 23:07:29 +010060_Py_IDENTIFIER(write);
61
Guido van Rossum65bf9f21997-04-29 18:33:38 +000062PyObject *
Victor Stinnerd67bd452013-11-06 22:36:40 +010063_PySys_GetObjectId(_Py_Identifier *key)
64{
Victor Stinnercaba55b2018-08-03 15:33:52 +020065 PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict;
66 if (sd == NULL) {
Victor Stinnerd67bd452013-11-06 22:36:40 +010067 return NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +020068 }
Victor Stinnerd67bd452013-11-06 22:36:40 +010069 return _PyDict_GetItemId(sd, key);
70}
71
72PyObject *
Neal Norwitzf3081322007-08-25 00:32:45 +000073PySys_GetObject(const char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074{
Victor Stinnercaba55b2018-08-03 15:33:52 +020075 PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict;
76 if (sd == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 return NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +020078 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 return PyDict_GetItemString(sd, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000080}
81
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082int
Victor Stinnerd67bd452013-11-06 22:36:40 +010083_PySys_SetObjectId(_Py_Identifier *key, PyObject *v)
84{
Victor Stinnercaba55b2018-08-03 15:33:52 +020085 PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict;
Victor Stinnerd67bd452013-11-06 22:36:40 +010086 if (v == NULL) {
Victor Stinnercaba55b2018-08-03 15:33:52 +020087 if (_PyDict_GetItemId(sd, key) == NULL) {
Victor Stinnerd67bd452013-11-06 22:36:40 +010088 return 0;
Victor Stinnercaba55b2018-08-03 15:33:52 +020089 }
90 else {
Victor Stinnerd67bd452013-11-06 22:36:40 +010091 return _PyDict_DelItemId(sd, key);
Victor Stinnercaba55b2018-08-03 15:33:52 +020092 }
Victor Stinnerd67bd452013-11-06 22:36:40 +010093 }
Victor Stinnercaba55b2018-08-03 15:33:52 +020094 else {
Victor Stinnerd67bd452013-11-06 22:36:40 +010095 return _PyDict_SetItemId(sd, key, v);
Victor Stinnercaba55b2018-08-03 15:33:52 +020096 }
Victor Stinnerd67bd452013-11-06 22:36:40 +010097}
98
99int
Neal Norwitzf3081322007-08-25 00:32:45 +0000100PySys_SetObject(const char *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101{
Victor Stinnercaba55b2018-08-03 15:33:52 +0200102 PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 if (v == NULL) {
Victor Stinnercaba55b2018-08-03 15:33:52 +0200104 if (PyDict_GetItemString(sd, name) == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 return 0;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200106 }
107 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 return PyDict_DelItemString(sd, name);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200109 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 }
Victor Stinnercaba55b2018-08-03 15:33:52 +0200111 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 return PyDict_SetItemString(sd, name, v);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200113 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114}
115
Steve Dowerb82e17e2019-05-23 08:45:22 -0700116static int
117should_audit(void)
118{
119 PyThreadState *ts = _PyThreadState_GET();
120 if (!ts) {
121 return 0;
122 }
Victor Stinner0fd2c302019-06-04 03:15:09 +0200123 PyInterpreterState *is = ts ? ts->interp : NULL;
124 return _PyRuntime.audit_hook_head
Steve Dowerb82e17e2019-05-23 08:45:22 -0700125 || (is && is->audit_hooks)
126 || PyDTrace_AUDIT_ENABLED();
127}
128
129int
130PySys_Audit(const char *event, const char *argFormat, ...)
131{
132 PyObject *eventName = NULL;
133 PyObject *eventArgs = NULL;
134 PyObject *hooks = NULL;
135 PyObject *hook = NULL;
136 int res = -1;
137
138 /* N format is inappropriate, because you do not know
139 whether the reference is consumed by the call.
140 Assert rather than exception for perf reasons */
141 assert(!argFormat || !strchr(argFormat, 'N'));
142
143 /* Early exit when no hooks are registered */
144 if (!should_audit()) {
145 return 0;
146 }
147
148 _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head;
149 PyThreadState *ts = _PyThreadState_GET();
150 PyInterpreterState *is = ts ? ts->interp : NULL;
151 int dtrace = PyDTrace_AUDIT_ENABLED();
152
153 PyObject *exc_type, *exc_value, *exc_tb;
154 if (ts) {
155 PyErr_Fetch(&exc_type, &exc_value, &exc_tb);
156 }
157
158 /* Initialize event args now */
159 if (argFormat && argFormat[0]) {
160 va_list args;
161 va_start(args, argFormat);
162 eventArgs = Py_VaBuildValue(argFormat, args);
Steve Dower6c794772019-06-21 09:45:13 -0700163 va_end(args);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700164 if (eventArgs && !PyTuple_Check(eventArgs)) {
165 PyObject *argTuple = PyTuple_Pack(1, eventArgs);
166 Py_DECREF(eventArgs);
167 eventArgs = argTuple;
168 }
169 } else {
170 eventArgs = PyTuple_New(0);
171 }
172 if (!eventArgs) {
173 goto exit;
174 }
175
176 /* Call global hooks */
177 for (; e; e = e->next) {
178 if (e->hookCFunction(event, eventArgs, e->userData) < 0) {
179 goto exit;
180 }
181 }
182
183 /* Dtrace USDT point */
184 if (dtrace) {
185 PyDTrace_AUDIT(event, (void *)eventArgs);
186 }
187
188 /* Call interpreter hooks */
189 if (is && is->audit_hooks) {
190 eventName = PyUnicode_FromString(event);
191 if (!eventName) {
192 goto exit;
193 }
194
195 hooks = PyObject_GetIter(is->audit_hooks);
196 if (!hooks) {
197 goto exit;
198 }
199
200 /* Disallow tracing in hooks unless explicitly enabled */
201 ts->tracing++;
202 ts->use_tracing = 0;
203 while ((hook = PyIter_Next(hooks)) != NULL) {
Serhiy Storchaka353053d2019-09-01 14:01:05 +0300204 _Py_IDENTIFIER(__cantrace__);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700205 PyObject *o;
Serhiy Storchaka353053d2019-09-01 14:01:05 +0300206 int canTrace = _PyObject_LookupAttrId(hook, &PyId___cantrace__, &o);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700207 if (o) {
208 canTrace = PyObject_IsTrue(o);
209 Py_DECREF(o);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700210 }
211 if (canTrace < 0) {
212 break;
213 }
214 if (canTrace) {
215 ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc);
216 ts->tracing--;
217 }
218 o = PyObject_CallFunctionObjArgs(hook, eventName,
219 eventArgs, NULL);
220 if (canTrace) {
221 ts->tracing++;
222 ts->use_tracing = 0;
223 }
224 if (!o) {
225 break;
226 }
227 Py_DECREF(o);
228 Py_CLEAR(hook);
229 }
230 ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc);
231 ts->tracing--;
232 if (PyErr_Occurred()) {
233 goto exit;
234 }
235 }
236
237 res = 0;
238
239exit:
240 Py_XDECREF(hook);
241 Py_XDECREF(hooks);
242 Py_XDECREF(eventName);
243 Py_XDECREF(eventArgs);
244
245 if (ts) {
246 if (!res) {
247 PyErr_Restore(exc_type, exc_value, exc_tb);
248 } else {
249 assert(PyErr_Occurred());
250 Py_XDECREF(exc_type);
251 Py_XDECREF(exc_value);
252 Py_XDECREF(exc_tb);
253 }
254 }
255
256 return res;
257}
258
259/* We expose this function primarily for our own cleanup during
260 * finalization. In general, it should not need to be called,
261 * and as such it is not defined in any header files.
262 */
263void _PySys_ClearAuditHooks(void) {
264 /* Must be finalizing to clear hooks */
265 _PyRuntimeState *runtime = &_PyRuntime;
266 PyThreadState *ts = _PyRuntimeState_GetThreadState(runtime);
267 assert(!ts || _Py_CURRENTLY_FINALIZING(runtime, ts));
268 if (!ts || !_Py_CURRENTLY_FINALIZING(runtime, ts))
269 return;
270
271 if (Py_VerboseFlag) {
272 PySys_WriteStderr("# clear sys.audit hooks\n");
273 }
274
275 /* Hooks can abort later hooks for this event, but cannot
276 abort the clear operation itself. */
277 PySys_Audit("cpython._PySys_ClearAuditHooks", NULL);
278 PyErr_Clear();
279
Victor Stinner0fd2c302019-06-04 03:15:09 +0200280 _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head, *n;
281 _PyRuntime.audit_hook_head = NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700282 while (e) {
283 n = e->next;
284 PyMem_RawFree(e);
285 e = n;
286 }
287}
288
289int
290PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)
291{
292 /* Invoke existing audit hooks to allow them an opportunity to abort. */
293 /* Cannot invoke hooks until we are initialized */
294 if (Py_IsInitialized()) {
295 if (PySys_Audit("sys.addaudithook", NULL) < 0) {
296 if (PyErr_ExceptionMatches(PyExc_Exception)) {
297 /* We do not report errors derived from Exception */
298 PyErr_Clear();
299 return 0;
300 }
301 return -1;
302 }
303 }
304
Victor Stinner0fd2c302019-06-04 03:15:09 +0200305 _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700306 if (!e) {
307 e = (_Py_AuditHookEntry*)PyMem_RawMalloc(sizeof(_Py_AuditHookEntry));
Victor Stinner0fd2c302019-06-04 03:15:09 +0200308 _PyRuntime.audit_hook_head = e;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700309 } else {
310 while (e->next)
311 e = e->next;
312 e = e->next = (_Py_AuditHookEntry*)PyMem_RawMalloc(
313 sizeof(_Py_AuditHookEntry));
314 }
315
316 if (!e) {
317 if (Py_IsInitialized())
318 PyErr_NoMemory();
319 return -1;
320 }
321
322 e->next = NULL;
323 e->hookCFunction = (Py_AuditHookFunction)hook;
324 e->userData = userData;
325
326 return 0;
327}
328
329/*[clinic input]
330sys.addaudithook
331
332 hook: object
333
334Adds a new audit hook callback.
335[clinic start generated code]*/
336
337static PyObject *
338sys_addaudithook_impl(PyObject *module, PyObject *hook)
339/*[clinic end generated code: output=4f9c17aaeb02f44e input=0f3e191217a45e34]*/
340{
341 /* Invoke existing audit hooks to allow them an opportunity to abort. */
342 if (PySys_Audit("sys.addaudithook", NULL) < 0) {
343 if (PyErr_ExceptionMatches(PyExc_Exception)) {
344 /* We do not report errors derived from Exception */
345 PyErr_Clear();
346 Py_RETURN_NONE;
347 }
348 return NULL;
349 }
350
351 PyInterpreterState *is = _PyInterpreterState_Get();
352
353 if (is->audit_hooks == NULL) {
354 is->audit_hooks = PyList_New(0);
355 if (is->audit_hooks == NULL) {
356 return NULL;
357 }
358 }
359
360 if (PyList_Append(is->audit_hooks, hook) < 0) {
361 return NULL;
362 }
363
364 Py_RETURN_NONE;
365}
366
367PyDoc_STRVAR(audit_doc,
368"audit(event, *args)\n\
369\n\
370Passes the event to any audit hooks that are attached.");
371
372static PyObject *
373sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc)
374{
375 if (argc == 0) {
376 PyErr_SetString(PyExc_TypeError, "audit() missing 1 required positional argument: 'event'");
377 return NULL;
378 }
379
380 if (!should_audit()) {
381 Py_RETURN_NONE;
382 }
383
384 PyObject *auditEvent = args[0];
385 if (!auditEvent) {
386 PyErr_SetString(PyExc_TypeError, "expected str for argument 'event'");
387 return NULL;
388 }
389 if (!PyUnicode_Check(auditEvent)) {
390 PyErr_Format(PyExc_TypeError, "expected str for argument 'event', not %.200s",
391 Py_TYPE(auditEvent)->tp_name);
392 return NULL;
393 }
394 const char *event = PyUnicode_AsUTF8(auditEvent);
395 if (!event) {
396 return NULL;
397 }
398
399 PyObject *auditArgs = _PyTuple_FromArray(args + 1, argc - 1);
400 if (!auditArgs) {
401 return NULL;
402 }
403
404 int res = PySys_Audit(event, "O", auditArgs);
405 Py_DECREF(auditArgs);
406
407 if (res < 0) {
408 return NULL;
409 }
410
411 Py_RETURN_NONE;
412}
413
414
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400415static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200416sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400417{
418 assert(!PyErr_Occurred());
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300419 char *envar = Py_GETENV("PYTHONBREAKPOINT");
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400420
421 if (envar == NULL || strlen(envar) == 0) {
422 envar = "pdb.set_trace";
423 }
424 else if (!strcmp(envar, "0")) {
425 /* The breakpoint is explicitly no-op'd. */
426 Py_RETURN_NONE;
427 }
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300428 /* According to POSIX the string returned by getenv() might be invalidated
429 * or the string content might be overwritten by a subsequent call to
430 * getenv(). Since importing a module can performs the getenv() calls,
431 * we need to save a copy of envar. */
432 envar = _PyMem_RawStrdup(envar);
433 if (envar == NULL) {
434 PyErr_NoMemory();
435 return NULL;
436 }
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200437 const char *last_dot = strrchr(envar, '.');
438 const char *attrname = NULL;
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400439 PyObject *modulepath = NULL;
440
441 if (last_dot == NULL) {
442 /* The breakpoint is a built-in, e.g. PYTHONBREAKPOINT=int */
443 modulepath = PyUnicode_FromString("builtins");
444 attrname = envar;
445 }
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200446 else if (last_dot != envar) {
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400447 /* Split on the last dot; */
448 modulepath = PyUnicode_FromStringAndSize(envar, last_dot - envar);
449 attrname = last_dot + 1;
450 }
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200451 else {
452 goto warn;
453 }
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400454 if (modulepath == NULL) {
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300455 PyMem_RawFree(envar);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400456 return NULL;
457 }
458
Anthony Sottiledce345c2018-11-01 10:25:05 -0700459 PyObject *module = PyImport_Import(modulepath);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400460 Py_DECREF(modulepath);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400461
462 if (module == NULL) {
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200463 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
464 goto warn;
465 }
466 PyMem_RawFree(envar);
467 return NULL;
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400468 }
469
470 PyObject *hook = PyObject_GetAttrString(module, attrname);
471 Py_DECREF(module);
472
473 if (hook == NULL) {
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200474 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
475 goto warn;
476 }
477 PyMem_RawFree(envar);
478 return NULL;
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400479 }
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300480 PyMem_RawFree(envar);
Jeroen Demeyeraacc77f2019-05-29 20:31:52 +0200481 PyObject *retval = _PyObject_Vectorcall(hook, args, nargs, keywords);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400482 Py_DECREF(hook);
483 return retval;
484
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200485 warn:
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400486 /* If any of the imports went wrong, then warn and ignore. */
487 PyErr_Clear();
488 int status = PyErr_WarnFormat(
489 PyExc_RuntimeWarning, 0,
490 "Ignoring unimportable $PYTHONBREAKPOINT: \"%s\"", envar);
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300491 PyMem_RawFree(envar);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400492 if (status < 0) {
493 /* Printing the warning raised an exception. */
494 return NULL;
495 }
496 /* The warning was (probably) issued. */
497 Py_RETURN_NONE;
498}
499
500PyDoc_STRVAR(breakpointhook_doc,
501"breakpointhook(*args, **kws)\n"
502"\n"
503"This hook function is called by built-in breakpoint().\n"
504);
505
Victor Stinner13d49ee2010-12-04 17:24:33 +0000506/* Write repr(o) to sys.stdout using sys.stdout.encoding and 'backslashreplace'
507 error handler. If sys.stdout has a buffer attribute, use
508 sys.stdout.buffer.write(encoded), otherwise redecode the string and use
509 sys.stdout.write(redecoded).
510
511 Helper function for sys_displayhook(). */
512static int
513sys_displayhook_unencodable(PyObject *outf, PyObject *o)
514{
515 PyObject *stdout_encoding = NULL;
516 PyObject *encoded, *escaped_str, *repr_str, *buffer, *result;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +0200517 const char *stdout_encoding_str;
Victor Stinner13d49ee2010-12-04 17:24:33 +0000518 int ret;
519
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200520 stdout_encoding = _PyObject_GetAttrId(outf, &PyId_encoding);
Victor Stinner13d49ee2010-12-04 17:24:33 +0000521 if (stdout_encoding == NULL)
522 goto error;
Serhiy Storchaka06515832016-11-20 09:13:07 +0200523 stdout_encoding_str = PyUnicode_AsUTF8(stdout_encoding);
Victor Stinner13d49ee2010-12-04 17:24:33 +0000524 if (stdout_encoding_str == NULL)
525 goto error;
526
527 repr_str = PyObject_Repr(o);
528 if (repr_str == NULL)
529 goto error;
530 encoded = PyUnicode_AsEncodedString(repr_str,
531 stdout_encoding_str,
532 "backslashreplace");
533 Py_DECREF(repr_str);
534 if (encoded == NULL)
535 goto error;
536
Serhiy Storchaka353053d2019-09-01 14:01:05 +0300537 if (_PyObject_LookupAttrId(outf, &PyId_buffer, &buffer) < 0) {
538 Py_DECREF(encoded);
539 goto error;
540 }
Victor Stinner13d49ee2010-12-04 17:24:33 +0000541 if (buffer) {
Victor Stinner7e425412016-12-09 00:36:19 +0100542 result = _PyObject_CallMethodIdObjArgs(buffer, &PyId_write, encoded, NULL);
Victor Stinner13d49ee2010-12-04 17:24:33 +0000543 Py_DECREF(buffer);
544 Py_DECREF(encoded);
545 if (result == NULL)
546 goto error;
547 Py_DECREF(result);
548 }
549 else {
Victor Stinner13d49ee2010-12-04 17:24:33 +0000550 escaped_str = PyUnicode_FromEncodedObject(encoded,
551 stdout_encoding_str,
552 "strict");
553 Py_DECREF(encoded);
554 if (PyFile_WriteObject(escaped_str, outf, Py_PRINT_RAW) != 0) {
555 Py_DECREF(escaped_str);
556 goto error;
557 }
558 Py_DECREF(escaped_str);
559 }
560 ret = 0;
561 goto finally;
562
563error:
564 ret = -1;
565finally:
566 Py_XDECREF(stdout_encoding);
567 return ret;
568}
569
Tal Einatede0b6f2018-12-31 17:12:08 +0200570/*[clinic input]
571sys.displayhook
572
573 object as o: object
574 /
575
576Print an object to sys.stdout and also save it in builtins._
577[clinic start generated code]*/
578
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000579static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200580sys_displayhook(PyObject *module, PyObject *o)
581/*[clinic end generated code: output=347477d006df92ed input=08ba730166d7ef72]*/
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000582{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 PyObject *outf;
Victor Stinnerd02fbb82013-11-06 18:27:13 +0100584 PyObject *builtins;
585 static PyObject *newline = NULL;
Victor Stinner13d49ee2010-12-04 17:24:33 +0000586 int err;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000587
Eric Snow3f9eee62017-09-15 16:35:20 -0600588 builtins = _PyImport_GetModuleId(&PyId_builtins);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 if (builtins == NULL) {
Stefan Krah027b09c2019-03-25 21:50:58 +0100590 if (!PyErr_Occurred()) {
591 PyErr_SetString(PyExc_RuntimeError, "lost builtins module");
592 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 return NULL;
594 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600595 Py_DECREF(builtins);
Moshe Zadka03897ea2001-07-23 13:32:43 +0000596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 /* Print value except if None */
598 /* After printing, also assign to '_' */
599 /* Before, set '_' to None to avoid recursion */
600 if (o == Py_None) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200601 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200603 if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 return NULL;
Victor Stinnerbd303c12013-11-07 23:07:29 +0100605 outf = _PySys_GetObjectId(&PyId_stdout);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 if (outf == NULL || outf == Py_None) {
607 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
608 return NULL;
609 }
Victor Stinner13d49ee2010-12-04 17:24:33 +0000610 if (PyFile_WriteObject(o, outf, 0) != 0) {
611 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) {
612 /* repr(o) is not encodable to sys.stdout.encoding with
613 * sys.stdout.errors error handler (which is probably 'strict') */
614 PyErr_Clear();
615 err = sys_displayhook_unencodable(outf, o);
616 if (err)
617 return NULL;
618 }
619 else {
620 return NULL;
621 }
622 }
Victor Stinnerd02fbb82013-11-06 18:27:13 +0100623 if (newline == NULL) {
624 newline = PyUnicode_FromString("\n");
625 if (newline == NULL)
626 return NULL;
627 }
628 if (PyFile_WriteObject(newline, outf, Py_PRINT_RAW) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 return NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200630 if (_PyObject_SetAttrId(builtins, &PyId__, o) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 return NULL;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200632 Py_RETURN_NONE;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000633}
634
Tal Einatede0b6f2018-12-31 17:12:08 +0200635
636/*[clinic input]
637sys.excepthook
638
639 exctype: object
640 value: object
641 traceback: object
642 /
643
644Handle an exception by displaying it with a traceback on sys.stderr.
645[clinic start generated code]*/
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000646
647static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200648sys_excepthook_impl(PyObject *module, PyObject *exctype, PyObject *value,
649 PyObject *traceback)
650/*[clinic end generated code: output=18d99fdda21b6b5e input=ecf606fa826f19d9]*/
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000651{
Tal Einatede0b6f2018-12-31 17:12:08 +0200652 PyErr_Display(exctype, value, traceback);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200653 Py_RETURN_NONE;
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000654}
655
Tal Einatede0b6f2018-12-31 17:12:08 +0200656
657/*[clinic input]
658sys.exc_info
659
660Return current exception information: (type, value, traceback).
661
662Return information about the most recent exception caught by an except
663clause in the current stack frame or in an older stack frame.
664[clinic start generated code]*/
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000665
666static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200667sys_exc_info_impl(PyObject *module)
668/*[clinic end generated code: output=3afd0940cf3a4d30 input=b5c5bf077788a3e5]*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000669{
Victor Stinner50b48572018-11-01 01:51:40 +0100670 _PyErr_StackItem *err_info = _PyErr_GetTopmostException(_PyThreadState_GET());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 return Py_BuildValue(
672 "(OOO)",
Mark Shannonae3087c2017-10-22 22:41:51 +0100673 err_info->exc_type != NULL ? err_info->exc_type : Py_None,
674 err_info->exc_value != NULL ? err_info->exc_value : Py_None,
675 err_info->exc_traceback != NULL ?
676 err_info->exc_traceback : Py_None);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000677}
678
Tal Einatede0b6f2018-12-31 17:12:08 +0200679
680/*[clinic input]
Victor Stinneref9d9b62019-05-22 11:28:22 +0200681sys.unraisablehook
682
683 unraisable: object
684 /
685
686Handle an unraisable exception.
687
688The unraisable argument has the following attributes:
689
690* exc_type: Exception type.
Victor Stinner71c52e32019-05-27 08:57:14 +0200691* exc_value: Exception value, can be None.
692* exc_traceback: Exception traceback, can be None.
693* err_msg: Error message, can be None.
694* object: Object causing the exception, can be None.
Victor Stinneref9d9b62019-05-22 11:28:22 +0200695[clinic start generated code]*/
696
697static PyObject *
698sys_unraisablehook(PyObject *module, PyObject *unraisable)
Victor Stinner71c52e32019-05-27 08:57:14 +0200699/*[clinic end generated code: output=bb92838b32abaa14 input=ec3af148294af8d3]*/
Victor Stinneref9d9b62019-05-22 11:28:22 +0200700{
701 return _PyErr_WriteUnraisableDefaultHook(unraisable);
702}
703
704
705/*[clinic input]
Tal Einatede0b6f2018-12-31 17:12:08 +0200706sys.exit
707
Serhiy Storchakad322abb2019-09-14 13:31:50 +0300708 status: object = None
Tal Einatede0b6f2018-12-31 17:12:08 +0200709 /
710
711Exit the interpreter by raising SystemExit(status).
712
713If the status is omitted or None, it defaults to zero (i.e., success).
714If the status is an integer, it will be used as the system exit status.
715If it is another kind of object, it will be printed and the system
716exit status will be one (i.e., failure).
717[clinic start generated code]*/
Guido van Rossum46d3dc32003-03-01 03:20:41 +0000718
719static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200720sys_exit_impl(PyObject *module, PyObject *status)
Serhiy Storchakad322abb2019-09-14 13:31:50 +0300721/*[clinic end generated code: output=13870986c1ab2ec0 input=b86ca9497baa94f2]*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 /* Raise SystemExit so callers may catch it or clean up. */
Tal Einatede0b6f2018-12-31 17:12:08 +0200724 PyErr_SetObject(PyExc_SystemExit, status);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000726}
727
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000728
Martin v. Löwis107b7da2001-11-09 20:59:39 +0000729
Tal Einatede0b6f2018-12-31 17:12:08 +0200730/*[clinic input]
731sys.getdefaultencoding
732
733Return the current default encoding used by the Unicode implementation.
734[clinic start generated code]*/
735
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000736static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200737sys_getdefaultencoding_impl(PyObject *module)
738/*[clinic end generated code: output=256d19dfcc0711e6 input=d416856ddbef6909]*/
Fred Drake8b4d01d2000-05-09 19:57:01 +0000739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 return PyUnicode_FromString(PyUnicode_GetDefaultEncoding());
Fred Drake8b4d01d2000-05-09 19:57:01 +0000741}
742
Tal Einatede0b6f2018-12-31 17:12:08 +0200743/*[clinic input]
744sys.getfilesystemencoding
745
746Return the encoding used to convert Unicode filenames to OS filenames.
747[clinic start generated code]*/
Fred Drake8b4d01d2000-05-09 19:57:01 +0000748
749static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200750sys_getfilesystemencoding_impl(PyObject *module)
751/*[clinic end generated code: output=1dc4bdbe9be44aa7 input=8475f8649b8c7d8c]*/
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000752{
Victor Stinnerb2457ef2018-08-29 13:25:36 +0200753 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Victor Stinner331a6a52019-05-27 16:39:22 +0200754 const PyConfig *config = &interp->config;
Victor Stinner709d23d2019-05-02 14:56:30 -0400755 return PyUnicode_FromWideChar(config->filesystem_encoding, -1);
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000756}
757
Tal Einatede0b6f2018-12-31 17:12:08 +0200758/*[clinic input]
759sys.getfilesystemencodeerrors
760
761Return the error mode used Unicode to OS filename conversion.
762[clinic start generated code]*/
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000763
Martin v. Löwis04dc25c2008-10-03 16:09:28 +0000764static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200765sys_getfilesystemencodeerrors_impl(PyObject *module)
766/*[clinic end generated code: output=ba77b36bbf7c96f5 input=22a1e8365566f1e5]*/
Steve Dowercc16be82016-09-08 10:35:16 -0700767{
Victor Stinnerb2457ef2018-08-29 13:25:36 +0200768 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Victor Stinner331a6a52019-05-27 16:39:22 +0200769 const PyConfig *config = &interp->config;
Victor Stinner709d23d2019-05-02 14:56:30 -0400770 return PyUnicode_FromWideChar(config->filesystem_errors, -1);
Steve Dowercc16be82016-09-08 10:35:16 -0700771}
772
Tal Einatede0b6f2018-12-31 17:12:08 +0200773/*[clinic input]
774sys.intern
775
776 string as s: unicode
777 /
778
779``Intern'' the given string.
780
781This enters the string in the (global) table of interned strings whose
782purpose is to speed up dictionary lookups. Return the string itself or
783the previously interned string object with the same value.
784[clinic start generated code]*/
Steve Dowercc16be82016-09-08 10:35:16 -0700785
786static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200787sys_intern_impl(PyObject *module, PyObject *s)
788/*[clinic end generated code: output=be680c24f5c9e5d6 input=849483c006924e2f]*/
Georg Brandl66a796e2006-12-19 20:50:34 +0000789{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 if (PyUnicode_CheckExact(s)) {
791 Py_INCREF(s);
792 PyUnicode_InternInPlace(&s);
793 return s;
794 }
795 else {
796 PyErr_Format(PyExc_TypeError,
Tal Einatede0b6f2018-12-31 17:12:08 +0200797 "can't intern %.400s", s->ob_type->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 return NULL;
799 }
Georg Brandl66a796e2006-12-19 20:50:34 +0000800}
801
Georg Brandl66a796e2006-12-19 20:50:34 +0000802
Fred Drake5755ce62001-06-27 19:19:46 +0000803/*
804 * Cached interned string objects used for calling the profile and
805 * trace functions. Initialized by trace_init().
806 */
Nick Coghlan5a851672017-09-08 10:14:16 +1000807static PyObject *whatstrings[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
Fred Drake5755ce62001-06-27 19:19:46 +0000808
809static int
810trace_init(void)
811{
Nick Coghlan5a851672017-09-08 10:14:16 +1000812 static const char * const whatnames[8] = {
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200813 "call", "exception", "line", "return",
Nick Coghlan5a851672017-09-08 10:14:16 +1000814 "c_call", "c_exception", "c_return",
815 "opcode"
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200816 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 PyObject *name;
818 int i;
Nick Coghlan5a851672017-09-08 10:14:16 +1000819 for (i = 0; i < 8; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 if (whatstrings[i] == NULL) {
821 name = PyUnicode_InternFromString(whatnames[i]);
822 if (name == NULL)
823 return -1;
824 whatstrings[i] = name;
825 }
826 }
827 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +0000828}
829
830
831static PyObject *
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +0100832call_trampoline(PyObject* callback,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 PyFrameObject *frame, int what, PyObject *arg)
Fred Drake5755ce62001-06-27 19:19:46 +0000834{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 PyObject *result;
Victor Stinner78da82b2016-08-20 01:22:57 +0200836 PyObject *stack[3];
Fred Drake5755ce62001-06-27 19:19:46 +0000837
Victor Stinner78da82b2016-08-20 01:22:57 +0200838 if (PyFrame_FastToLocalsWithError(frame) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 return NULL;
Victor Stinner78da82b2016-08-20 01:22:57 +0200840 }
Victor Stinner41bb43a2013-10-29 01:19:37 +0100841
Victor Stinner78da82b2016-08-20 01:22:57 +0200842 stack[0] = (PyObject *)frame;
843 stack[1] = whatstrings[what];
844 stack[2] = (arg != NULL) ? arg : Py_None;
Fred Drake5755ce62001-06-27 19:19:46 +0000845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 /* call the Python-level function */
Victor Stinner559bb6a2016-08-22 22:48:54 +0200847 result = _PyObject_FastCall(callback, stack, 3);
Fred Drake5755ce62001-06-27 19:19:46 +0000848
Victor Stinner78da82b2016-08-20 01:22:57 +0200849 PyFrame_LocalsToFast(frame, 1);
850 if (result == NULL) {
851 PyTraceBack_Here(frame);
852 }
853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 return result;
Fred Drake5755ce62001-06-27 19:19:46 +0000855}
856
857static int
858profile_trampoline(PyObject *self, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 int what, PyObject *arg)
Fred Drake5755ce62001-06-27 19:19:46 +0000860{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 PyObject *result;
Fred Drake5755ce62001-06-27 19:19:46 +0000862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 if (arg == NULL)
864 arg = Py_None;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +0100865 result = call_trampoline(self, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 if (result == NULL) {
867 PyEval_SetProfile(NULL, NULL);
868 return -1;
869 }
870 Py_DECREF(result);
871 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +0000872}
873
874static int
875trace_trampoline(PyObject *self, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 int what, PyObject *arg)
Fred Drake5755ce62001-06-27 19:19:46 +0000877{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 PyObject *callback;
879 PyObject *result;
Fred Drake5755ce62001-06-27 19:19:46 +0000880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 if (what == PyTrace_CALL)
882 callback = self;
883 else
884 callback = frame->f_trace;
885 if (callback == NULL)
886 return 0;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +0100887 result = call_trampoline(callback, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 if (result == NULL) {
889 PyEval_SetTrace(NULL, NULL);
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200890 Py_CLEAR(frame->f_trace);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 return -1;
892 }
893 if (result != Py_None) {
Serhiy Storchakaec397562016-04-06 09:50:03 +0300894 Py_XSETREF(frame->f_trace, result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 }
896 else {
897 Py_DECREF(result);
898 }
899 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +0000900}
Fred Draked0838392001-06-16 21:02:31 +0000901
Fred Drake8b4d01d2000-05-09 19:57:01 +0000902static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000903sys_settrace(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000904{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 if (trace_init() == -1)
906 return NULL;
907 if (args == Py_None)
908 PyEval_SetTrace(NULL, NULL);
909 else
910 PyEval_SetTrace(trace_trampoline, args);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200911 Py_RETURN_NONE;
Guido van Rossume2437a11992-03-23 18:20:18 +0000912}
913
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000914PyDoc_STRVAR(settrace_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000915"settrace(function)\n\
916\n\
917Set the global debug tracing function. It will be called on each\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000918function call. See the debugger chapter in the library manual."
919);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000920
Tal Einatede0b6f2018-12-31 17:12:08 +0200921/*[clinic input]
922sys.gettrace
923
924Return the global debug tracing function set with sys.settrace.
925
926See the debugger chapter in the library manual.
927[clinic start generated code]*/
928
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000929static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200930sys_gettrace_impl(PyObject *module)
931/*[clinic end generated code: output=e97e3a4d8c971b6e input=373b51bb2147f4d8]*/
Christian Heimes9bd667a2008-01-20 15:14:11 +0000932{
Victor Stinner50b48572018-11-01 01:51:40 +0100933 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 PyObject *temp = tstate->c_traceobj;
Christian Heimes9bd667a2008-01-20 15:14:11 +0000935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 if (temp == NULL)
937 temp = Py_None;
938 Py_INCREF(temp);
939 return temp;
Christian Heimes9bd667a2008-01-20 15:14:11 +0000940}
941
Christian Heimes9bd667a2008-01-20 15:14:11 +0000942static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000943sys_setprofile(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 if (trace_init() == -1)
946 return NULL;
947 if (args == Py_None)
948 PyEval_SetProfile(NULL, NULL);
949 else
950 PyEval_SetProfile(profile_trampoline, args);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200951 Py_RETURN_NONE;
Guido van Rossume2437a11992-03-23 18:20:18 +0000952}
953
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000954PyDoc_STRVAR(setprofile_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000955"setprofile(function)\n\
956\n\
957Set the profiling function. It will be called on each function call\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000958and return. See the profiler chapter in the library manual."
959);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000960
Tal Einatede0b6f2018-12-31 17:12:08 +0200961/*[clinic input]
962sys.getprofile
963
964Return the profiling function set with sys.setprofile.
965
966See the profiler chapter in the library manual.
967[clinic start generated code]*/
968
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000969static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200970sys_getprofile_impl(PyObject *module)
971/*[clinic end generated code: output=579b96b373448188 input=1b3209d89a32965d]*/
Christian Heimes9bd667a2008-01-20 15:14:11 +0000972{
Victor Stinner50b48572018-11-01 01:51:40 +0100973 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 PyObject *temp = tstate->c_profileobj;
Christian Heimes9bd667a2008-01-20 15:14:11 +0000975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 if (temp == NULL)
977 temp = Py_None;
978 Py_INCREF(temp);
979 return temp;
Christian Heimes9bd667a2008-01-20 15:14:11 +0000980}
981
Tal Einatede0b6f2018-12-31 17:12:08 +0200982/*[clinic input]
983sys.setcheckinterval
984
985 n: int
986 /
987
988Set the async event check interval to n instructions.
989
990This tells the Python interpreter to check for asynchronous events
991every n instructions.
992
993This also affects how often thread switches occur.
994[clinic start generated code]*/
Christian Heimes9bd667a2008-01-20 15:14:11 +0000995
996static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200997sys_setcheckinterval_impl(PyObject *module, int n)
998/*[clinic end generated code: output=3f686cef07e6e178 input=7a35b17bf22a6227]*/
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000999{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 if (PyErr_WarnEx(PyExc_DeprecationWarning,
1001 "sys.getcheckinterval() and sys.setcheckinterval() "
1002 "are deprecated. Use sys.setswitchinterval() "
1003 "instead.", 1) < 0)
1004 return NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +02001005
Victor Stinnercaba55b2018-08-03 15:33:52 +02001006 PyInterpreterState *interp = _PyInterpreterState_Get();
Tal Einatede0b6f2018-12-31 17:12:08 +02001007 interp->check_interval = n;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001008 Py_RETURN_NONE;
Guido van Rossuma0d7a231995-01-09 17:46:13 +00001009}
1010
Tal Einatede0b6f2018-12-31 17:12:08 +02001011/*[clinic input]
1012sys.getcheckinterval
1013
1014Return the current check interval; see sys.setcheckinterval().
1015[clinic start generated code]*/
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001016
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001017static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001018sys_getcheckinterval_impl(PyObject *module)
1019/*[clinic end generated code: output=1b5060bf2b23a47c input=4b6589cbcca1db4e]*/
Tim Peterse5e065b2003-07-06 18:36:54 +00001020{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 if (PyErr_WarnEx(PyExc_DeprecationWarning,
1022 "sys.getcheckinterval() and sys.setcheckinterval() "
1023 "are deprecated. Use sys.getswitchinterval() "
1024 "instead.", 1) < 0)
1025 return NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +02001026 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001027 return PyLong_FromLong(interp->check_interval);
Tim Peterse5e065b2003-07-06 18:36:54 +00001028}
1029
Tal Einatede0b6f2018-12-31 17:12:08 +02001030/*[clinic input]
1031sys.setswitchinterval
1032
1033 interval: double
1034 /
1035
1036Set the ideal thread switching delay inside the Python interpreter.
1037
1038The actual frequency of switching threads can be lower if the
1039interpreter executes long sequences of uninterruptible code
1040(this is implementation-specific and workload-dependent).
1041
1042The parameter must represent the desired switching delay in seconds
1043A typical value is 0.005 (5 milliseconds).
1044[clinic start generated code]*/
Tim Peterse5e065b2003-07-06 18:36:54 +00001045
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001046static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001047sys_setswitchinterval_impl(PyObject *module, double interval)
1048/*[clinic end generated code: output=65a19629e5153983 input=561b477134df91d9]*/
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001049{
Tal Einatede0b6f2018-12-31 17:12:08 +02001050 if (interval <= 0.0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 PyErr_SetString(PyExc_ValueError,
1052 "switch interval must be strictly positive");
1053 return NULL;
1054 }
Tal Einatede0b6f2018-12-31 17:12:08 +02001055 _PyEval_SetSwitchInterval((unsigned long) (1e6 * interval));
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001056 Py_RETURN_NONE;
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001057}
1058
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001059
Tal Einatede0b6f2018-12-31 17:12:08 +02001060/*[clinic input]
1061sys.getswitchinterval -> double
1062
1063Return the current thread switch interval; see sys.setswitchinterval().
1064[clinic start generated code]*/
1065
1066static double
1067sys_getswitchinterval_impl(PyObject *module)
1068/*[clinic end generated code: output=a38c277c85b5096d input=bdf9d39c0ebbbb6f]*/
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001069{
Tal Einatede0b6f2018-12-31 17:12:08 +02001070 return 1e-6 * _PyEval_GetSwitchInterval();
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001071}
1072
Tal Einatede0b6f2018-12-31 17:12:08 +02001073/*[clinic input]
1074sys.setrecursionlimit
1075
1076 limit as new_limit: int
1077 /
1078
1079Set the maximum depth of the Python interpreter stack to n.
1080
1081This limit prevents infinite recursion from causing an overflow of the C
1082stack and crashing Python. The highest possible limit is platform-
1083dependent.
1084[clinic start generated code]*/
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001085
Tim Peterse5e065b2003-07-06 18:36:54 +00001086static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001087sys_setrecursionlimit_impl(PyObject *module, int new_limit)
1088/*[clinic end generated code: output=35e1c64754800ace input=b0f7a23393924af3]*/
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001089{
Tal Einatede0b6f2018-12-31 17:12:08 +02001090 int mark;
Victor Stinner50856d52015-10-13 00:11:21 +02001091 PyThreadState *tstate;
1092
Victor Stinner50856d52015-10-13 00:11:21 +02001093 if (new_limit < 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 PyErr_SetString(PyExc_ValueError,
Victor Stinner50856d52015-10-13 00:11:21 +02001095 "recursion limit must be greater or equal than 1");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 return NULL;
1097 }
Victor Stinner50856d52015-10-13 00:11:21 +02001098
1099 /* Issue #25274: When the recursion depth hits the recursion limit in
1100 _Py_CheckRecursiveCall(), the overflowed flag of the thread state is
1101 set to 1 and a RecursionError is raised. The overflowed flag is reset
1102 to 0 when the recursion depth goes below the low-water mark: see
1103 Py_LeaveRecursiveCall().
1104
1105 Reject too low new limit if the current recursion depth is higher than
1106 the new low-water mark. Otherwise it may not be possible anymore to
1107 reset the overflowed flag to 0. */
1108 mark = _Py_RecursionLimitLowerWaterMark(new_limit);
Victor Stinner50b48572018-11-01 01:51:40 +01001109 tstate = _PyThreadState_GET();
Victor Stinner50856d52015-10-13 00:11:21 +02001110 if (tstate->recursion_depth >= mark) {
1111 PyErr_Format(PyExc_RecursionError,
1112 "cannot set the recursion limit to %i at "
1113 "the recursion depth %i: the limit is too low",
1114 new_limit, tstate->recursion_depth);
1115 return NULL;
1116 }
1117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 Py_SetRecursionLimit(new_limit);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001119 Py_RETURN_NONE;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001120}
1121
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001122/*[clinic input]
1123sys.set_coroutine_origin_tracking_depth
1124
1125 depth: int
1126
1127Enable or disable origin tracking for coroutine objects in this thread.
1128
Tal Einatede0b6f2018-12-31 17:12:08 +02001129Coroutine objects will track 'depth' frames of traceback information
1130about where they came from, available in their cr_origin attribute.
1131
1132Set a depth of 0 to disable.
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001133[clinic start generated code]*/
1134
1135static PyObject *
1136sys_set_coroutine_origin_tracking_depth_impl(PyObject *module, int depth)
Tal Einatede0b6f2018-12-31 17:12:08 +02001137/*[clinic end generated code: output=0a2123c1cc6759c5 input=a1d0a05f89d2c426]*/
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001138{
1139 if (depth < 0) {
1140 PyErr_SetString(PyExc_ValueError, "depth must be >= 0");
1141 return NULL;
1142 }
1143 _PyEval_SetCoroutineOriginTrackingDepth(depth);
1144 Py_RETURN_NONE;
1145}
1146
1147/*[clinic input]
1148sys.get_coroutine_origin_tracking_depth -> int
1149
1150Check status of origin tracking for coroutine objects in this thread.
1151[clinic start generated code]*/
1152
1153static int
1154sys_get_coroutine_origin_tracking_depth_impl(PyObject *module)
1155/*[clinic end generated code: output=3699f7be95a3afb8 input=335266a71205b61a]*/
1156{
1157 return _PyEval_GetCoroutineOriginTrackingDepth();
1158}
1159
Yury Selivanoveb636452016-09-08 22:01:51 -07001160static PyTypeObject AsyncGenHooksType;
1161
1162PyDoc_STRVAR(asyncgen_hooks_doc,
1163"asyncgen_hooks\n\
1164\n\
Paul Ganssle2bb6bf02019-09-12 03:50:29 +01001165A named tuple providing information about asynchronous\n\
Yury Selivanoveb636452016-09-08 22:01:51 -07001166generators hooks. The attributes are read only.");
1167
1168static PyStructSequence_Field asyncgen_hooks_fields[] = {
1169 {"firstiter", "Hook to intercept first iteration"},
1170 {"finalizer", "Hook to intercept finalization"},
1171 {0}
1172};
1173
1174static PyStructSequence_Desc asyncgen_hooks_desc = {
1175 "asyncgen_hooks", /* name */
1176 asyncgen_hooks_doc, /* doc */
1177 asyncgen_hooks_fields , /* fields */
1178 2
1179};
1180
Yury Selivanoveb636452016-09-08 22:01:51 -07001181static PyObject *
1182sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
1183{
1184 static char *keywords[] = {"firstiter", "finalizer", NULL};
1185 PyObject *firstiter = NULL;
1186 PyObject *finalizer = NULL;
1187
1188 if (!PyArg_ParseTupleAndKeywords(
1189 args, kw, "|OO", keywords,
1190 &firstiter, &finalizer)) {
1191 return NULL;
1192 }
1193
1194 if (finalizer && finalizer != Py_None) {
1195 if (!PyCallable_Check(finalizer)) {
1196 PyErr_Format(PyExc_TypeError,
1197 "callable finalizer expected, got %.50s",
1198 Py_TYPE(finalizer)->tp_name);
1199 return NULL;
1200 }
1201 _PyEval_SetAsyncGenFinalizer(finalizer);
1202 }
1203 else if (finalizer == Py_None) {
1204 _PyEval_SetAsyncGenFinalizer(NULL);
1205 }
1206
1207 if (firstiter && firstiter != Py_None) {
1208 if (!PyCallable_Check(firstiter)) {
1209 PyErr_Format(PyExc_TypeError,
1210 "callable firstiter expected, got %.50s",
1211 Py_TYPE(firstiter)->tp_name);
1212 return NULL;
1213 }
1214 _PyEval_SetAsyncGenFirstiter(firstiter);
1215 }
1216 else if (firstiter == Py_None) {
1217 _PyEval_SetAsyncGenFirstiter(NULL);
1218 }
1219
1220 Py_RETURN_NONE;
1221}
1222
1223PyDoc_STRVAR(set_asyncgen_hooks_doc,
Tal Einatede0b6f2018-12-31 17:12:08 +02001224"set_asyncgen_hooks(* [, firstiter] [, finalizer])\n\
Yury Selivanoveb636452016-09-08 22:01:51 -07001225\n\
1226Set a finalizer for async generators objects."
1227);
1228
Tal Einatede0b6f2018-12-31 17:12:08 +02001229/*[clinic input]
1230sys.get_asyncgen_hooks
1231
1232Return the installed asynchronous generators hooks.
1233
1234This returns a namedtuple of the form (firstiter, finalizer).
1235[clinic start generated code]*/
1236
Yury Selivanoveb636452016-09-08 22:01:51 -07001237static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001238sys_get_asyncgen_hooks_impl(PyObject *module)
1239/*[clinic end generated code: output=53a253707146f6cf input=3676b9ea62b14625]*/
Yury Selivanoveb636452016-09-08 22:01:51 -07001240{
1241 PyObject *res;
1242 PyObject *firstiter = _PyEval_GetAsyncGenFirstiter();
1243 PyObject *finalizer = _PyEval_GetAsyncGenFinalizer();
1244
1245 res = PyStructSequence_New(&AsyncGenHooksType);
1246 if (res == NULL) {
1247 return NULL;
1248 }
1249
1250 if (firstiter == NULL) {
1251 firstiter = Py_None;
1252 }
1253
1254 if (finalizer == NULL) {
1255 finalizer = Py_None;
1256 }
1257
1258 Py_INCREF(firstiter);
1259 PyStructSequence_SET_ITEM(res, 0, firstiter);
1260
1261 Py_INCREF(finalizer);
1262 PyStructSequence_SET_ITEM(res, 1, finalizer);
1263
1264 return res;
1265}
1266
Yury Selivanoveb636452016-09-08 22:01:51 -07001267
Mark Dickinsondc787d22010-05-23 13:33:13 +00001268static PyTypeObject Hash_InfoType;
1269
1270PyDoc_STRVAR(hash_info_doc,
1271"hash_info\n\
1272\n\
Paul Ganssle2bb6bf02019-09-12 03:50:29 +01001273A named tuple providing parameters used for computing\n\
Christian Heimes985ecdc2013-11-20 11:46:18 +01001274hashes. The attributes are read only.");
Mark Dickinsondc787d22010-05-23 13:33:13 +00001275
1276static PyStructSequence_Field hash_info_fields[] = {
1277 {"width", "width of the type used for hashing, in bits"},
1278 {"modulus", "prime number giving the modulus on which the hash "
1279 "function is based"},
1280 {"inf", "value to be used for hash of a positive infinity"},
1281 {"nan", "value to be used for hash of a nan"},
1282 {"imag", "multiplier used for the imaginary part of a complex number"},
Christian Heimes985ecdc2013-11-20 11:46:18 +01001283 {"algorithm", "name of the algorithm for hashing of str, bytes and "
1284 "memoryviews"},
1285 {"hash_bits", "internal output size of hash algorithm"},
1286 {"seed_bits", "seed size of hash algorithm"},
1287 {"cutoff", "small string optimization cutoff"},
Mark Dickinsondc787d22010-05-23 13:33:13 +00001288 {NULL, NULL}
1289};
1290
1291static PyStructSequence_Desc hash_info_desc = {
1292 "sys.hash_info",
1293 hash_info_doc,
1294 hash_info_fields,
Christian Heimes985ecdc2013-11-20 11:46:18 +01001295 9,
Mark Dickinsondc787d22010-05-23 13:33:13 +00001296};
1297
Matthias Klosed885e952010-07-06 10:53:30 +00001298static PyObject *
Mark Dickinsondc787d22010-05-23 13:33:13 +00001299get_hash_info(void)
1300{
1301 PyObject *hash_info;
1302 int field = 0;
Christian Heimes985ecdc2013-11-20 11:46:18 +01001303 PyHash_FuncDef *hashfunc;
Mark Dickinsondc787d22010-05-23 13:33:13 +00001304 hash_info = PyStructSequence_New(&Hash_InfoType);
1305 if (hash_info == NULL)
1306 return NULL;
Christian Heimes985ecdc2013-11-20 11:46:18 +01001307 hashfunc = PyHash_GetFuncDef();
Mark Dickinsondc787d22010-05-23 13:33:13 +00001308 PyStructSequence_SET_ITEM(hash_info, field++,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001309 PyLong_FromLong(8*sizeof(Py_hash_t)));
Mark Dickinsondc787d22010-05-23 13:33:13 +00001310 PyStructSequence_SET_ITEM(hash_info, field++,
Benjamin Peterson8035bc52010-10-23 16:20:50 +00001311 PyLong_FromSsize_t(_PyHASH_MODULUS));
Mark Dickinsondc787d22010-05-23 13:33:13 +00001312 PyStructSequence_SET_ITEM(hash_info, field++,
1313 PyLong_FromLong(_PyHASH_INF));
1314 PyStructSequence_SET_ITEM(hash_info, field++,
1315 PyLong_FromLong(_PyHASH_NAN));
1316 PyStructSequence_SET_ITEM(hash_info, field++,
1317 PyLong_FromLong(_PyHASH_IMAG));
Christian Heimes985ecdc2013-11-20 11:46:18 +01001318 PyStructSequence_SET_ITEM(hash_info, field++,
1319 PyUnicode_FromString(hashfunc->name));
1320 PyStructSequence_SET_ITEM(hash_info, field++,
1321 PyLong_FromLong(hashfunc->hash_bits));
1322 PyStructSequence_SET_ITEM(hash_info, field++,
1323 PyLong_FromLong(hashfunc->seed_bits));
1324 PyStructSequence_SET_ITEM(hash_info, field++,
1325 PyLong_FromLong(Py_HASH_CUTOFF));
Mark Dickinsondc787d22010-05-23 13:33:13 +00001326 if (PyErr_Occurred()) {
1327 Py_CLEAR(hash_info);
1328 return NULL;
1329 }
1330 return hash_info;
1331}
Tal Einatede0b6f2018-12-31 17:12:08 +02001332/*[clinic input]
1333sys.getrecursionlimit
Mark Dickinsondc787d22010-05-23 13:33:13 +00001334
Tal Einatede0b6f2018-12-31 17:12:08 +02001335Return the current value of the recursion limit.
Mark Dickinsondc787d22010-05-23 13:33:13 +00001336
Tal Einatede0b6f2018-12-31 17:12:08 +02001337The recursion limit is the maximum depth of the Python interpreter
1338stack. This limit prevents infinite recursion from causing an overflow
1339of the C stack and crashing Python.
1340[clinic start generated code]*/
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001341
1342static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001343sys_getrecursionlimit_impl(PyObject *module)
1344/*[clinic end generated code: output=d571fb6b4549ef2e input=1c6129fd2efaeea8]*/
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 return PyLong_FromLong(Py_GetRecursionLimit());
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001347}
1348
Mark Hammond8696ebc2002-10-08 02:44:31 +00001349#ifdef MS_WINDOWS
Mark Hammond8696ebc2002-10-08 02:44:31 +00001350
Eric Smithf7bb5782010-01-27 00:44:57 +00001351static PyTypeObject WindowsVersionType = {0, 0, 0, 0, 0, 0};
1352
1353static PyStructSequence_Field windows_version_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 {"major", "Major version number"},
1355 {"minor", "Minor version number"},
1356 {"build", "Build number"},
1357 {"platform", "Operating system platform"},
1358 {"service_pack", "Latest Service Pack installed on the system"},
1359 {"service_pack_major", "Service Pack major version number"},
1360 {"service_pack_minor", "Service Pack minor version number"},
1361 {"suite_mask", "Bit mask identifying available product suites"},
1362 {"product_type", "System product type"},
Steve Dower74f4af72016-09-17 17:27:48 -07001363 {"platform_version", "Diagnostic version number"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 {0}
Eric Smithf7bb5782010-01-27 00:44:57 +00001365};
1366
1367static PyStructSequence_Desc windows_version_desc = {
Tal Einatede0b6f2018-12-31 17:12:08 +02001368 "sys.getwindowsversion", /* name */
1369 sys_getwindowsversion__doc__, /* doc */
1370 windows_version_fields, /* fields */
1371 5 /* For backward compatibility,
1372 only the first 5 items are accessible
1373 via indexing, the rest are name only */
Eric Smithf7bb5782010-01-27 00:44:57 +00001374};
1375
Steve Dower3e96f322015-03-02 08:01:10 -08001376/* Disable deprecation warnings about GetVersionEx as the result is
1377 being passed straight through to the caller, who is responsible for
1378 using it correctly. */
1379#pragma warning(push)
1380#pragma warning(disable:4996)
1381
Tal Einatede0b6f2018-12-31 17:12:08 +02001382/*[clinic input]
1383sys.getwindowsversion
1384
1385Return info about the running version of Windows as a named tuple.
1386
1387The members are named: major, minor, build, platform, service_pack,
1388service_pack_major, service_pack_minor, suite_mask, product_type and
1389platform_version. For backward compatibility, only the first 5 items
1390are available by indexing. All elements are numbers, except
1391service_pack and platform_type which are strings, and platform_version
1392which is a 3-tuple. Platform is always 2. Product_type may be 1 for a
1393workstation, 2 for a domain controller, 3 for a server.
1394Platform_version is a 3-tuple containing a version number that is
1395intended for identifying the OS rather than feature detection.
1396[clinic start generated code]*/
1397
Mark Hammond8696ebc2002-10-08 02:44:31 +00001398static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001399sys_getwindowsversion_impl(PyObject *module)
1400/*[clinic end generated code: output=1ec063280b932857 input=73a228a328fee63a]*/
Mark Hammond8696ebc2002-10-08 02:44:31 +00001401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 PyObject *version;
1403 int pos = 0;
Minmin Gong8ebc6452019-02-02 20:26:55 -08001404 OSVERSIONINFOEXW ver;
Steve Dower74f4af72016-09-17 17:27:48 -07001405 DWORD realMajor, realMinor, realBuild;
1406 HANDLE hKernel32;
1407 wchar_t kernel32_path[MAX_PATH];
1408 LPVOID verblock;
1409 DWORD verblock_size;
1410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 ver.dwOSVersionInfoSize = sizeof(ver);
Minmin Gong8ebc6452019-02-02 20:26:55 -08001412 if (!GetVersionExW((OSVERSIONINFOW*) &ver))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 return PyErr_SetFromWindowsErr(0);
Eric Smithf7bb5782010-01-27 00:44:57 +00001414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 version = PyStructSequence_New(&WindowsVersionType);
1416 if (version == NULL)
1417 return NULL;
Eric Smithf7bb5782010-01-27 00:44:57 +00001418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMajorVersion));
1420 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMinorVersion));
1421 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwBuildNumber));
1422 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwPlatformId));
Minmin Gong8ebc6452019-02-02 20:26:55 -08001423 PyStructSequence_SET_ITEM(version, pos++, PyUnicode_FromWideChar(ver.szCSDVersion, -1));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMajor));
1425 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMinor));
1426 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wSuiteMask));
1427 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wProductType));
Eric Smithf7bb5782010-01-27 00:44:57 +00001428
Steve Dower74f4af72016-09-17 17:27:48 -07001429 realMajor = ver.dwMajorVersion;
1430 realMinor = ver.dwMinorVersion;
1431 realBuild = ver.dwBuildNumber;
1432
1433 // GetVersion will lie if we are running in a compatibility mode.
1434 // We need to read the version info from a system file resource
1435 // to accurately identify the OS version. If we fail for any reason,
1436 // just return whatever GetVersion said.
Tony Roberts4860f012019-02-02 18:16:42 +01001437 Py_BEGIN_ALLOW_THREADS
Steve Dower74f4af72016-09-17 17:27:48 -07001438 hKernel32 = GetModuleHandleW(L"kernel32.dll");
Tony Roberts4860f012019-02-02 18:16:42 +01001439 Py_END_ALLOW_THREADS
Steve Dower74f4af72016-09-17 17:27:48 -07001440 if (hKernel32 && GetModuleFileNameW(hKernel32, kernel32_path, MAX_PATH) &&
1441 (verblock_size = GetFileVersionInfoSizeW(kernel32_path, NULL)) &&
1442 (verblock = PyMem_RawMalloc(verblock_size))) {
1443 VS_FIXEDFILEINFO *ffi;
1444 UINT ffi_len;
1445
1446 if (GetFileVersionInfoW(kernel32_path, 0, verblock_size, verblock) &&
1447 VerQueryValueW(verblock, L"", (LPVOID)&ffi, &ffi_len)) {
1448 realMajor = HIWORD(ffi->dwProductVersionMS);
1449 realMinor = LOWORD(ffi->dwProductVersionMS);
1450 realBuild = HIWORD(ffi->dwProductVersionLS);
1451 }
1452 PyMem_RawFree(verblock);
1453 }
Segev Finer48fb7662017-06-04 20:52:27 +03001454 PyStructSequence_SET_ITEM(version, pos++, Py_BuildValue("(kkk)",
1455 realMajor,
1456 realMinor,
1457 realBuild
Steve Dower74f4af72016-09-17 17:27:48 -07001458 ));
1459
Serhiy Storchaka48d761e2013-12-17 15:11:24 +02001460 if (PyErr_Occurred()) {
1461 Py_DECREF(version);
1462 return NULL;
1463 }
Steve Dower74f4af72016-09-17 17:27:48 -07001464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 return version;
Mark Hammond8696ebc2002-10-08 02:44:31 +00001466}
1467
Steve Dower3e96f322015-03-02 08:01:10 -08001468#pragma warning(pop)
1469
Tal Einatede0b6f2018-12-31 17:12:08 +02001470/*[clinic input]
1471sys._enablelegacywindowsfsencoding
1472
1473Changes the default filesystem encoding to mbcs:replace.
1474
1475This is done for consistency with earlier versions of Python. See PEP
1476529 for more information.
1477
1478This is equivalent to defining the PYTHONLEGACYWINDOWSFSENCODING
1479environment variable before launching Python.
1480[clinic start generated code]*/
Steve Dowercc16be82016-09-08 10:35:16 -07001481
1482static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001483sys__enablelegacywindowsfsencoding_impl(PyObject *module)
1484/*[clinic end generated code: output=f5c3855b45e24fe9 input=2bfa931a20704492]*/
Steve Dowercc16be82016-09-08 10:35:16 -07001485{
Victor Stinner709d23d2019-05-02 14:56:30 -04001486 if (_PyUnicode_EnableLegacyWindowsFSEncoding() < 0) {
Victor Stinnerb2457ef2018-08-29 13:25:36 +02001487 return NULL;
1488 }
Steve Dowercc16be82016-09-08 10:35:16 -07001489 Py_RETURN_NONE;
1490}
1491
Mark Hammond8696ebc2002-10-08 02:44:31 +00001492#endif /* MS_WINDOWS */
1493
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001494#ifdef HAVE_DLOPEN
Tal Einatede0b6f2018-12-31 17:12:08 +02001495
1496/*[clinic input]
1497sys.setdlopenflags
1498
1499 flags as new_val: int
1500 /
1501
1502Set the flags used by the interpreter for dlopen calls.
1503
1504This is used, for example, when the interpreter loads extension
1505modules. Among other things, this will enable a lazy resolving of
1506symbols when importing a module, if called as sys.setdlopenflags(0).
1507To share symbols across extension modules, call as
1508sys.setdlopenflags(os.RTLD_GLOBAL). Symbolic names for the flag
1509modules can be found in the os module (RTLD_xxx constants, e.g.
1510os.RTLD_LAZY).
1511[clinic start generated code]*/
1512
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001513static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001514sys_setdlopenflags_impl(PyObject *module, int new_val)
1515/*[clinic end generated code: output=ec918b7fe0a37281 input=4c838211e857a77f]*/
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001516{
Victor Stinnercaba55b2018-08-03 15:33:52 +02001517 PyInterpreterState *interp = _PyInterpreterState_Get();
1518 interp->dlopenflags = new_val;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001519 Py_RETURN_NONE;
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001520}
1521
Tal Einatede0b6f2018-12-31 17:12:08 +02001522
1523/*[clinic input]
1524sys.getdlopenflags
1525
1526Return the current value of the flags that are used for dlopen calls.
1527
1528The flag constants are defined in the os module.
1529[clinic start generated code]*/
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001530
1531static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001532sys_getdlopenflags_impl(PyObject *module)
1533/*[clinic end generated code: output=e92cd1bc5005da6e input=dc4ea0899c53b4b6]*/
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001534{
Victor Stinnercaba55b2018-08-03 15:33:52 +02001535 PyInterpreterState *interp = _PyInterpreterState_Get();
1536 return PyLong_FromLong(interp->dlopenflags);
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001537}
1538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539#endif /* HAVE_DLOPEN */
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001540
Guido van Rossum14b4adb1992-09-03 20:25:30 +00001541#ifdef USE_MALLOPT
1542/* Link with -lmalloc (or -lmpc) on an SGI */
1543#include <malloc.h>
1544
Tal Einatede0b6f2018-12-31 17:12:08 +02001545/*[clinic input]
1546sys.mdebug
1547
1548 flag: int
1549 /
1550[clinic start generated code]*/
1551
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001552static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001553sys_mdebug_impl(PyObject *module, int flag)
1554/*[clinic end generated code: output=5431d545847c3637 input=151d150ae1636f8a]*/
Guido van Rossum14b4adb1992-09-03 20:25:30 +00001555{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 int flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 mallopt(M_DEBUG, flag);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001558 Py_RETURN_NONE;
Guido van Rossum14b4adb1992-09-03 20:25:30 +00001559}
1560#endif /* USE_MALLOPT */
1561
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001562size_t
1563_PySys_GetSizeOf(PyObject *o)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 PyObject *res = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 PyObject *method;
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001567 Py_ssize_t size;
Benjamin Petersona5758c02009-05-09 18:15:04 +00001568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 /* Make sure the type is initialized. float gets initialized late */
1570 if (PyType_Ready(Py_TYPE(o)) < 0)
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001571 return (size_t)-1;
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00001572
Benjamin Petersonce798522012-01-22 11:24:29 -05001573 method = _PyObject_LookupSpecial(o, &PyId___sizeof__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 if (method == NULL) {
1575 if (!PyErr_Occurred())
1576 PyErr_Format(PyExc_TypeError,
1577 "Type %.100s doesn't define __sizeof__",
1578 Py_TYPE(o)->tp_name);
1579 }
1580 else {
Victor Stinnerf17c3de2016-12-06 18:46:19 +01001581 res = _PyObject_CallNoArg(method);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 Py_DECREF(method);
1583 }
1584
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001585 if (res == NULL)
1586 return (size_t)-1;
1587
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001588 size = PyLong_AsSsize_t(res);
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001589 Py_DECREF(res);
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001590 if (size == -1 && PyErr_Occurred())
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001591 return (size_t)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001593 if (size < 0) {
1594 PyErr_SetString(PyExc_ValueError, "__sizeof__() should return >= 0");
1595 return (size_t)-1;
1596 }
1597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 /* add gc_head size */
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001599 if (PyObject_IS_GC(o))
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001600 return ((size_t)size) + sizeof(PyGC_Head);
1601 return (size_t)size;
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001602}
1603
1604static PyObject *
1605sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
1606{
1607 static char *kwlist[] = {"object", "default", 0};
1608 size_t size;
1609 PyObject *o, *dflt = NULL;
1610
1611 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",
1612 kwlist, &o, &dflt))
1613 return NULL;
1614
1615 size = _PySys_GetSizeOf(o);
1616
1617 if (size == (size_t)-1 && PyErr_Occurred()) {
1618 /* Has a default value been given */
1619 if (dflt != NULL && PyErr_ExceptionMatches(PyExc_TypeError)) {
1620 PyErr_Clear();
1621 Py_INCREF(dflt);
1622 return dflt;
1623 }
1624 else
1625 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 }
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001627
1628 return PyLong_FromSize_t(size);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001629}
1630
1631PyDoc_STRVAR(getsizeof_doc,
Tal Einatede0b6f2018-12-31 17:12:08 +02001632"getsizeof(object [, default]) -> int\n\
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001633\n\
1634Return the size of object in bytes.");
1635
Tal Einatede0b6f2018-12-31 17:12:08 +02001636/*[clinic input]
1637sys.getrefcount -> Py_ssize_t
1638
1639 object: object
1640 /
1641
1642Return the reference count of object.
1643
1644The count returned is generally one higher than you might expect,
1645because it includes the (temporary) reference as an argument to
1646getrefcount().
1647[clinic start generated code]*/
1648
1649static Py_ssize_t
1650sys_getrefcount_impl(PyObject *module, PyObject *object)
1651/*[clinic end generated code: output=5fd477f2264b85b2 input=bf474efd50a21535]*/
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001652{
Tal Einatede0b6f2018-12-31 17:12:08 +02001653 return object->ob_refcnt;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001654}
1655
Tim Peters4be93d02002-07-07 19:59:50 +00001656#ifdef Py_REF_DEBUG
Tal Einatede0b6f2018-12-31 17:12:08 +02001657/*[clinic input]
1658sys.gettotalrefcount -> Py_ssize_t
1659[clinic start generated code]*/
1660
1661static Py_ssize_t
1662sys_gettotalrefcount_impl(PyObject *module)
1663/*[clinic end generated code: output=4103886cf17c25bc input=53b744faa5d2e4f6]*/
Mark Hammond440d8982000-06-20 08:12:48 +00001664{
Tal Einatede0b6f2018-12-31 17:12:08 +02001665 return _Py_GetRefTotal();
Mark Hammond440d8982000-06-20 08:12:48 +00001666}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001667#endif /* Py_REF_DEBUG */
Mark Hammond440d8982000-06-20 08:12:48 +00001668
Tal Einatede0b6f2018-12-31 17:12:08 +02001669/*[clinic input]
1670sys.getallocatedblocks -> Py_ssize_t
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001671
Tal Einatede0b6f2018-12-31 17:12:08 +02001672Return the number of memory blocks currently allocated.
1673[clinic start generated code]*/
1674
1675static Py_ssize_t
1676sys_getallocatedblocks_impl(PyObject *module)
1677/*[clinic end generated code: output=f0c4e873f0b6dcf7 input=dab13ee346a0673e]*/
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001678{
Tal Einatede0b6f2018-12-31 17:12:08 +02001679 return _Py_GetAllocatedBlocks();
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001680}
1681
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001682#ifdef COUNT_ALLOCS
Tal Einatede0b6f2018-12-31 17:12:08 +02001683/*[clinic input]
1684sys.getcounts
1685[clinic start generated code]*/
1686
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001687static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001688sys_getcounts_impl(PyObject *module)
1689/*[clinic end generated code: output=20df00bc164f43cb input=ad2ec7bda5424953]*/
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001690{
Pablo Galindo49c75a82018-10-28 15:02:17 +00001691 extern PyObject *_Py_get_counts(void);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001692
Pablo Galindo49c75a82018-10-28 15:02:17 +00001693 return _Py_get_counts();
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001694}
1695#endif
1696
Tal Einatede0b6f2018-12-31 17:12:08 +02001697/*[clinic input]
1698sys._getframe
1699
1700 depth: int = 0
1701 /
1702
1703Return a frame object from the call stack.
1704
1705If optional integer depth is given, return the frame object that many
1706calls below the top of the stack. If that is deeper than the call
1707stack, ValueError is raised. The default for depth is zero, returning
1708the frame at the top of the call stack.
1709
1710This function should be used for internal and specialized purposes
1711only.
1712[clinic start generated code]*/
Barry Warsawb6a54d22000-12-06 21:47:46 +00001713
1714static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001715sys__getframe_impl(PyObject *module, int depth)
1716/*[clinic end generated code: output=d438776c04d59804 input=c1be8a6464b11ee5]*/
Barry Warsawb6a54d22000-12-06 21:47:46 +00001717{
Victor Stinner50b48572018-11-01 01:51:40 +01001718 PyFrameObject *f = _PyThreadState_GET()->frame;
Barry Warsawb6a54d22000-12-06 21:47:46 +00001719
Steve Dowerb82e17e2019-05-23 08:45:22 -07001720 if (PySys_Audit("sys._getframe", "O", f) < 0) {
1721 return NULL;
1722 }
1723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 while (depth > 0 && f != NULL) {
1725 f = f->f_back;
1726 --depth;
1727 }
1728 if (f == NULL) {
1729 PyErr_SetString(PyExc_ValueError,
1730 "call stack is not deep enough");
1731 return NULL;
1732 }
1733 Py_INCREF(f);
1734 return (PyObject*)f;
Barry Warsawb6a54d22000-12-06 21:47:46 +00001735}
1736
Tal Einatede0b6f2018-12-31 17:12:08 +02001737/*[clinic input]
1738sys._current_frames
1739
1740Return a dict mapping each thread's thread id to its current stack frame.
1741
1742This function should be used for specialized purposes only.
1743[clinic start generated code]*/
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001744
1745static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001746sys__current_frames_impl(PyObject *module)
1747/*[clinic end generated code: output=d2a41ac0a0a3809a input=2a9049c5f5033691]*/
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 return _PyThread_CurrentFrames();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001750}
1751
Tal Einatede0b6f2018-12-31 17:12:08 +02001752/*[clinic input]
1753sys.call_tracing
1754
1755 func: object
1756 args as funcargs: object(subclass_of='&PyTuple_Type')
1757 /
1758
1759Call func(*args), while tracing is enabled.
1760
1761The tracing state is saved, and restored afterwards. This is intended
1762to be called from a debugger from a checkpoint, to recursively debug
1763some other code.
1764[clinic start generated code]*/
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001765
1766static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001767sys_call_tracing_impl(PyObject *module, PyObject *func, PyObject *funcargs)
1768/*[clinic end generated code: output=7e4999853cd4e5a6 input=5102e8b11049f92f]*/
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 return _PyEval_CallTracing(func, funcargs);
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001771}
1772
Tal Einatede0b6f2018-12-31 17:12:08 +02001773/*[clinic input]
1774sys.callstats
1775
1776Return a tuple of function call statistics.
1777
1778A tuple is returned only if CALL_PROFILE was defined when Python was
1779built. Otherwise, this returns None.
1780
1781When enabled, this function returns detailed, implementation-specific
1782details about the number of function calls executed. The return value
1783is a 11-tuple where the entries in the tuple are counts of:
17840. all function calls
17851. calls to PyFunction_Type objects
17862. PyFunction calls that do not create an argument tuple
17873. PyFunction calls that do not create an argument tuple
1788 and bypass PyEval_EvalCodeEx()
17894. PyMethod calls
17905. PyMethod calls on bound methods
17916. PyType calls
17927. PyCFunction calls
17938. generator calls
17949. All other calls
179510. Number of stack pops performed by call_function()
1796[clinic start generated code]*/
Barry Warsawb6a54d22000-12-06 21:47:46 +00001797
Victor Stinner048afd92016-11-28 11:59:04 +01001798static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001799sys_callstats_impl(PyObject *module)
1800/*[clinic end generated code: output=edc4a74957fa8def input=d447d8d224d5d175]*/
Victor Stinner048afd92016-11-28 11:59:04 +01001801{
1802 if (PyErr_WarnEx(PyExc_DeprecationWarning,
1803 "sys.callstats() has been deprecated in Python 3.7 "
1804 "and will be removed in the future", 1) < 0) {
1805 return NULL;
1806 }
1807
1808 Py_RETURN_NONE;
1809}
1810
1811
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001812#ifdef __cplusplus
1813extern "C" {
1814#endif
1815
Tal Einatede0b6f2018-12-31 17:12:08 +02001816/*[clinic input]
1817sys._debugmallocstats
1818
1819Print summary info to stderr about the state of pymalloc's structures.
1820
1821In Py_DEBUG mode, also perform some expensive internal consistency
1822checks.
1823[clinic start generated code]*/
1824
David Malcolm49526f42012-06-22 14:55:41 -04001825static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001826sys__debugmallocstats_impl(PyObject *module)
1827/*[clinic end generated code: output=ec3565f8c7cee46a input=33c0c9c416f98424]*/
David Malcolm49526f42012-06-22 14:55:41 -04001828{
1829#ifdef WITH_PYMALLOC
Victor Stinner6bf992a2017-12-06 17:26:10 +01001830 if (_PyObject_DebugMallocStats(stderr)) {
Victor Stinner34be8072016-03-14 12:04:26 +01001831 fputc('\n', stderr);
1832 }
David Malcolm49526f42012-06-22 14:55:41 -04001833#endif
1834 _PyObject_DebugTypeStats(stderr);
1835
1836 Py_RETURN_NONE;
1837}
David Malcolm49526f42012-06-22 14:55:41 -04001838
Guido van Rossum7f3f2c11996-05-23 22:45:41 +00001839#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +00001840/* Defined in objects.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001841extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001842#endif
Guido van Rossumded690f1996-05-24 20:48:31 +00001843
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001844#ifdef DYNAMIC_EXECUTION_PROFILE
1845/* Defined in ceval.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001846extern PyObject *_Py_GetDXProfile(PyObject *, PyObject *);
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001847#endif
1848
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001849#ifdef __cplusplus
1850}
1851#endif
1852
Tal Einatede0b6f2018-12-31 17:12:08 +02001853
1854/*[clinic input]
1855sys._clear_type_cache
1856
1857Clear the internal type lookup cache.
1858[clinic start generated code]*/
1859
Christian Heimes15ebc882008-02-04 18:48:49 +00001860static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001861sys__clear_type_cache_impl(PyObject *module)
1862/*[clinic end generated code: output=20e48ca54a6f6971 input=127f3e04a8d9b555]*/
Christian Heimes15ebc882008-02-04 18:48:49 +00001863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 PyType_ClearCache();
1865 Py_RETURN_NONE;
Christian Heimes15ebc882008-02-04 18:48:49 +00001866}
1867
Tal Einatede0b6f2018-12-31 17:12:08 +02001868/*[clinic input]
1869sys.is_finalizing
1870
1871Return True if Python is exiting.
1872[clinic start generated code]*/
1873
Antoine Pitrou5db1bb82014-12-07 01:28:27 +01001874static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001875sys_is_finalizing_impl(PyObject *module)
1876/*[clinic end generated code: output=735b5ff7962ab281 input=f0df747a039948a5]*/
Antoine Pitrou5db1bb82014-12-07 01:28:27 +01001877{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001878 return PyBool_FromLong(_Py_IsFinalizing());
Antoine Pitrou5db1bb82014-12-07 01:28:27 +01001879}
1880
Victor Stinnerd6958ac2016-12-02 01:13:46 +01001881#ifdef ANDROID_API_LEVEL
Tal Einatede0b6f2018-12-31 17:12:08 +02001882/*[clinic input]
1883sys.getandroidapilevel
1884
1885Return the build time API version of Android as an integer.
1886[clinic start generated code]*/
Victor Stinnerd6958ac2016-12-02 01:13:46 +01001887
1888static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001889sys_getandroidapilevel_impl(PyObject *module)
1890/*[clinic end generated code: output=214abf183a1c70c1 input=3e6d6c9fcdd24ac6]*/
Victor Stinnerd6958ac2016-12-02 01:13:46 +01001891{
1892 return PyLong_FromLong(ANDROID_API_LEVEL);
1893}
1894#endif /* ANDROID_API_LEVEL */
1895
1896
Steve Dowerb82e17e2019-05-23 08:45:22 -07001897
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001898static PyMethodDef sys_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 /* Might as well keep this in alphabetic order */
Steve Dowerb82e17e2019-05-23 08:45:22 -07001900 SYS_ADDAUDITHOOK_METHODDEF
1901 {"audit", (PyCFunction)(void(*)(void))sys_audit, METH_FASTCALL, audit_doc },
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001902 {"breakpointhook", (PyCFunction)(void(*)(void))sys_breakpointhook,
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001903 METH_FASTCALL | METH_KEYWORDS, breakpointhook_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001904 SYS_CALLSTATS_METHODDEF
1905 SYS__CLEAR_TYPE_CACHE_METHODDEF
1906 SYS__CURRENT_FRAMES_METHODDEF
1907 SYS_DISPLAYHOOK_METHODDEF
1908 SYS_EXC_INFO_METHODDEF
1909 SYS_EXCEPTHOOK_METHODDEF
1910 SYS_EXIT_METHODDEF
1911 SYS_GETDEFAULTENCODING_METHODDEF
1912 SYS_GETDLOPENFLAGS_METHODDEF
1913 SYS_GETALLOCATEDBLOCKS_METHODDEF
1914 SYS_GETCOUNTS_METHODDEF
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001915#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 {"getdxp", _Py_GetDXProfile, METH_VARARGS},
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001917#endif
Tal Einatede0b6f2018-12-31 17:12:08 +02001918 SYS_GETFILESYSTEMENCODING_METHODDEF
1919 SYS_GETFILESYSTEMENCODEERRORS_METHODDEF
Guido van Rossum7f3f2c11996-05-23 22:45:41 +00001920#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 {"getobjects", _Py_GetObjects, METH_VARARGS},
Tim Peters4be93d02002-07-07 19:59:50 +00001922#endif
Tal Einatede0b6f2018-12-31 17:12:08 +02001923 SYS_GETTOTALREFCOUNT_METHODDEF
1924 SYS_GETREFCOUNT_METHODDEF
1925 SYS_GETRECURSIONLIMIT_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001926 {"getsizeof", (PyCFunction)(void(*)(void))sys_getsizeof,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 METH_VARARGS | METH_KEYWORDS, getsizeof_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001928 SYS__GETFRAME_METHODDEF
1929 SYS_GETWINDOWSVERSION_METHODDEF
1930 SYS__ENABLELEGACYWINDOWSFSENCODING_METHODDEF
1931 SYS_INTERN_METHODDEF
1932 SYS_IS_FINALIZING_METHODDEF
1933 SYS_MDEBUG_METHODDEF
1934 SYS_SETCHECKINTERVAL_METHODDEF
1935 SYS_GETCHECKINTERVAL_METHODDEF
1936 SYS_SETSWITCHINTERVAL_METHODDEF
1937 SYS_GETSWITCHINTERVAL_METHODDEF
1938 SYS_SETDLOPENFLAGS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 {"setprofile", sys_setprofile, METH_O, setprofile_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001940 SYS_GETPROFILE_METHODDEF
1941 SYS_SETRECURSIONLIMIT_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 {"settrace", sys_settrace, METH_O, settrace_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001943 SYS_GETTRACE_METHODDEF
1944 SYS_CALL_TRACING_METHODDEF
1945 SYS__DEBUGMALLOCSTATS_METHODDEF
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001946 SYS_SET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF
1947 SYS_GET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001948 {"set_asyncgen_hooks", (PyCFunction)(void(*)(void))sys_set_asyncgen_hooks,
Yury Selivanoveb636452016-09-08 22:01:51 -07001949 METH_VARARGS | METH_KEYWORDS, set_asyncgen_hooks_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001950 SYS_GET_ASYNCGEN_HOOKS_METHODDEF
1951 SYS_GETANDROIDAPILEVEL_METHODDEF
Victor Stinneref9d9b62019-05-22 11:28:22 +02001952 SYS_UNRAISABLEHOOK_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 {NULL, NULL} /* sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001954};
1955
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001956static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001957list_builtin_module_names(void)
Guido van Rossum34679b71993-01-26 13:33:44 +00001958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 PyObject *list = PyList_New(0);
1960 int i;
1961 if (list == NULL)
1962 return NULL;
1963 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1964 PyObject *name = PyUnicode_FromString(
1965 PyImport_Inittab[i].name);
1966 if (name == NULL)
1967 break;
1968 PyList_Append(list, name);
1969 Py_DECREF(name);
1970 }
1971 if (PyList_Sort(list) != 0) {
1972 Py_DECREF(list);
1973 list = NULL;
1974 }
1975 if (list) {
1976 PyObject *v = PyList_AsTuple(list);
1977 Py_DECREF(list);
1978 list = v;
1979 }
1980 return list;
Guido van Rossum34679b71993-01-26 13:33:44 +00001981}
1982
Nick Coghlanbc77eff2018-03-25 20:44:30 +10001983/* Pre-initialization support for sys.warnoptions and sys._xoptions
1984 *
1985 * Modern internal code paths:
1986 * These APIs get called after _Py_InitializeCore and get to use the
1987 * regular CPython list, dict, and unicode APIs.
1988 *
1989 * Legacy embedding code paths:
1990 * The multi-phase initialization API isn't public yet, so embedding
1991 * apps still need to be able configure sys.warnoptions and sys._xoptions
1992 * before they call Py_Initialize. To support this, we stash copies of
1993 * the supplied wchar * sequences in linked lists, and then migrate the
1994 * contents of those lists to the sys module in _PyInitializeCore.
1995 *
1996 */
1997
1998struct _preinit_entry {
1999 wchar_t *value;
2000 struct _preinit_entry *next;
2001};
2002
2003typedef struct _preinit_entry *_Py_PreInitEntry;
2004
2005static _Py_PreInitEntry _preinit_warnoptions = NULL;
2006static _Py_PreInitEntry _preinit_xoptions = NULL;
2007
2008static _Py_PreInitEntry
2009_alloc_preinit_entry(const wchar_t *value)
2010{
2011 /* To get this to work, we have to initialize the runtime implicitly */
2012 _PyRuntime_Initialize();
2013
2014 /* Force default allocator, so we can ensure that it also gets used to
2015 * destroy the linked list in _clear_preinit_entries.
2016 */
2017 PyMemAllocatorEx old_alloc;
2018 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2019
2020 _Py_PreInitEntry node = PyMem_RawCalloc(1, sizeof(*node));
2021 if (node != NULL) {
2022 node->value = _PyMem_RawWcsdup(value);
2023 if (node->value == NULL) {
2024 PyMem_RawFree(node);
2025 node = NULL;
2026 };
2027 };
2028
2029 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2030 return node;
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002031}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002032
2033static int
2034_append_preinit_entry(_Py_PreInitEntry *optionlist, const wchar_t *value)
2035{
2036 _Py_PreInitEntry new_entry = _alloc_preinit_entry(value);
2037 if (new_entry == NULL) {
2038 return -1;
2039 }
2040 /* We maintain the linked list in this order so it's easy to play back
2041 * the add commands in the same order later on in _Py_InitializeCore
2042 */
2043 _Py_PreInitEntry last_entry = *optionlist;
2044 if (last_entry == NULL) {
2045 *optionlist = new_entry;
2046 } else {
2047 while (last_entry->next != NULL) {
2048 last_entry = last_entry->next;
2049 }
2050 last_entry->next = new_entry;
2051 }
2052 return 0;
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002053}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002054
2055static void
2056_clear_preinit_entries(_Py_PreInitEntry *optionlist)
2057{
2058 _Py_PreInitEntry current = *optionlist;
2059 *optionlist = NULL;
2060 /* Deallocate the nodes and their contents using the default allocator */
2061 PyMemAllocatorEx old_alloc;
2062 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2063 while (current != NULL) {
2064 _Py_PreInitEntry next = current->next;
2065 PyMem_RawFree(current->value);
2066 PyMem_RawFree(current);
2067 current = next;
2068 }
2069 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002070}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002071
Victor Stinneraf84a882019-08-23 21:16:51 +02002072
2073PyStatus
2074_PySys_ReadPreinitWarnOptions(PyConfig *config)
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002075{
Victor Stinneraf84a882019-08-23 21:16:51 +02002076 PyStatus status;
2077 _Py_PreInitEntry entry;
2078
2079 for (entry = _preinit_warnoptions; entry != NULL; entry = entry->next) {
2080 status = PyWideStringList_Append(&config->warnoptions, entry->value);
2081 if (_PyStatus_EXCEPTION(status)) {
2082 return status;
2083 }
2084 }
2085
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002086 _clear_preinit_entries(&_preinit_warnoptions);
Victor Stinneraf84a882019-08-23 21:16:51 +02002087 return _PyStatus_OK();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002088}
2089
Victor Stinneraf84a882019-08-23 21:16:51 +02002090
2091PyStatus
2092_PySys_ReadPreinitXOptions(PyConfig *config)
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002093{
Victor Stinneraf84a882019-08-23 21:16:51 +02002094 PyStatus status;
2095 _Py_PreInitEntry entry;
2096
2097 for (entry = _preinit_xoptions; entry != NULL; entry = entry->next) {
2098 status = PyWideStringList_Append(&config->xoptions, entry->value);
2099 if (_PyStatus_EXCEPTION(status)) {
2100 return status;
2101 }
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002102 }
2103
Victor Stinneraf84a882019-08-23 21:16:51 +02002104 _clear_preinit_entries(&_preinit_xoptions);
2105 return _PyStatus_OK();
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002106}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002107
Victor Stinneraf84a882019-08-23 21:16:51 +02002108
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002109static PyObject *
2110get_warnoptions(void)
2111{
Eric Snowdae02762017-09-14 00:35:58 -07002112 PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002113 if (warnoptions == NULL || !PyList_Check(warnoptions)) {
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002114 /* PEP432 TODO: we can reach this if warnoptions is NULL in the main
2115 * interpreter config. When that happens, we need to properly set
2116 * the `warnoptions` reference in the main interpreter config as well.
2117 *
2118 * For Python 3.7, we shouldn't be able to get here due to the
2119 * combination of how _PyMainInterpreter_ReadConfig and _PySys_EndInit
2120 * work, but we expect 3.8+ to make the _PyMainInterpreter_ReadConfig
2121 * call optional for embedding applications, thus making this
2122 * reachable again.
2123 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002124 warnoptions = PyList_New(0);
2125 if (warnoptions == NULL)
2126 return NULL;
Eric Snowdae02762017-09-14 00:35:58 -07002127 if (_PySys_SetObjectId(&PyId_warnoptions, warnoptions)) {
2128 Py_DECREF(warnoptions);
2129 return NULL;
2130 }
2131 Py_DECREF(warnoptions);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002132 }
2133 return warnoptions;
2134}
Guido van Rossum23fff912000-12-15 22:02:05 +00002135
2136void
2137PySys_ResetWarnOptions(void)
2138{
Victor Stinner50b48572018-11-01 01:51:40 +01002139 PyThreadState *tstate = _PyThreadState_GET();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002140 if (tstate == NULL) {
2141 _clear_preinit_entries(&_preinit_warnoptions);
2142 return;
2143 }
2144
Eric Snowdae02762017-09-14 00:35:58 -07002145 PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 if (warnoptions == NULL || !PyList_Check(warnoptions))
2147 return;
2148 PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
Guido van Rossum23fff912000-12-15 22:02:05 +00002149}
2150
Victor Stinnere1b29952018-10-30 14:31:42 +01002151static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002152_PySys_AddWarnOptionWithError(PyObject *option)
Guido van Rossum23fff912000-12-15 22:02:05 +00002153{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002154 PyObject *warnoptions = get_warnoptions();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002155 if (warnoptions == NULL) {
2156 return -1;
2157 }
2158 if (PyList_Append(warnoptions, option)) {
2159 return -1;
2160 }
2161 return 0;
2162}
2163
2164void
2165PySys_AddWarnOptionUnicode(PyObject *option)
2166{
Victor Stinnere1b29952018-10-30 14:31:42 +01002167 if (_PySys_AddWarnOptionWithError(option) < 0) {
2168 /* No return value, therefore clear error state if possible */
2169 if (_PyThreadState_UncheckedGet()) {
2170 PyErr_Clear();
2171 }
2172 }
Victor Stinner9ca9c252010-05-19 16:53:30 +00002173}
2174
2175void
2176PySys_AddWarnOption(const wchar_t *s)
2177{
Victor Stinner50b48572018-11-01 01:51:40 +01002178 PyThreadState *tstate = _PyThreadState_GET();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002179 if (tstate == NULL) {
2180 _append_preinit_entry(&_preinit_warnoptions, s);
2181 return;
2182 }
Victor Stinner9ca9c252010-05-19 16:53:30 +00002183 PyObject *unicode;
2184 unicode = PyUnicode_FromWideChar(s, -1);
2185 if (unicode == NULL)
2186 return;
2187 PySys_AddWarnOptionUnicode(unicode);
2188 Py_DECREF(unicode);
Guido van Rossum23fff912000-12-15 22:02:05 +00002189}
2190
Christian Heimes33fe8092008-04-13 13:53:33 +00002191int
2192PySys_HasWarnOptions(void)
2193{
Eric Snowdae02762017-09-14 00:35:58 -07002194 PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions);
Serhiy Storchakadffccc62018-12-10 13:50:22 +02002195 return (warnoptions != NULL && PyList_Check(warnoptions)
2196 && PyList_GET_SIZE(warnoptions) > 0);
Christian Heimes33fe8092008-04-13 13:53:33 +00002197}
2198
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002199static PyObject *
2200get_xoptions(void)
2201{
Eric Snowdae02762017-09-14 00:35:58 -07002202 PyObject *xoptions = _PySys_GetObjectId(&PyId__xoptions);
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002203 if (xoptions == NULL || !PyDict_Check(xoptions)) {
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002204 /* PEP432 TODO: we can reach this if xoptions is NULL in the main
2205 * interpreter config. When that happens, we need to properly set
2206 * the `xoptions` reference in the main interpreter config as well.
2207 *
2208 * For Python 3.7, we shouldn't be able to get here due to the
2209 * combination of how _PyMainInterpreter_ReadConfig and _PySys_EndInit
2210 * work, but we expect 3.8+ to make the _PyMainInterpreter_ReadConfig
2211 * call optional for embedding applications, thus making this
2212 * reachable again.
2213 */
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002214 xoptions = PyDict_New();
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002215 if (xoptions == NULL)
2216 return NULL;
Eric Snowdae02762017-09-14 00:35:58 -07002217 if (_PySys_SetObjectId(&PyId__xoptions, xoptions)) {
2218 Py_DECREF(xoptions);
2219 return NULL;
2220 }
2221 Py_DECREF(xoptions);
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002222 }
2223 return xoptions;
2224}
2225
Victor Stinnere1b29952018-10-30 14:31:42 +01002226static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002227_PySys_AddXOptionWithError(const wchar_t *s)
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002228{
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002229 PyObject *name = NULL, *value = NULL;
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002230
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002231 PyObject *opts = get_xoptions();
2232 if (opts == NULL) {
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002233 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002234 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002235
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002236 const wchar_t *name_end = wcschr(s, L'=');
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002237 if (!name_end) {
2238 name = PyUnicode_FromWideChar(s, -1);
2239 value = Py_True;
2240 Py_INCREF(value);
2241 }
2242 else {
2243 name = PyUnicode_FromWideChar(s, name_end - s);
2244 value = PyUnicode_FromWideChar(name_end + 1, -1);
2245 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002246 if (name == NULL || value == NULL) {
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002247 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002248 }
2249 if (PyDict_SetItem(opts, name, value) < 0) {
2250 goto error;
2251 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002252 Py_DECREF(name);
2253 Py_DECREF(value);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002254 return 0;
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002255
2256error:
2257 Py_XDECREF(name);
2258 Py_XDECREF(value);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002259 return -1;
2260}
2261
2262void
2263PySys_AddXOption(const wchar_t *s)
2264{
Victor Stinner50b48572018-11-01 01:51:40 +01002265 PyThreadState *tstate = _PyThreadState_GET();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002266 if (tstate == NULL) {
2267 _append_preinit_entry(&_preinit_xoptions, s);
2268 return;
2269 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002270 if (_PySys_AddXOptionWithError(s) < 0) {
2271 /* No return value, therefore clear error state if possible */
Victor Stinneraf84a882019-08-23 21:16:51 +02002272 PyErr_Clear();
Victor Stinner0cae6092016-11-11 01:43:56 +01002273 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002274}
2275
2276PyObject *
2277PySys_GetXOptions(void)
2278{
2279 return get_xoptions();
2280}
2281
Guido van Rossum40552d01998-08-06 03:34:39 +00002282/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
2283 Two literals concatenated works just fine. If you have a K&R compiler
2284 or other abomination that however *does* understand longer strings,
2285 get rid of the !!! comment in the middle and the quotes that surround it. */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002286PyDoc_VAR(sys_doc) =
2287PyDoc_STR(
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002288"This module provides access to some objects used or maintained by the\n\
2289interpreter and to functions that interact strongly with the interpreter.\n\
2290\n\
2291Dynamic objects:\n\
2292\n\
2293argv -- command line arguments; argv[0] is the script pathname if known\n\
2294path -- module search path; path[0] is the script directory, else ''\n\
2295modules -- dictionary of loaded modules\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002296\n\
2297displayhook -- called to show results in an interactive session\n\
2298excepthook -- called to handle any uncaught exception other than SystemExit\n\
2299 To customize printing in an interactive session or to install a custom\n\
2300 top-level exception handler, assign other functions to replace these.\n\
2301\n\
Benjamin Peterson06157a42008-07-15 00:28:36 +00002302stdin -- standard input file object; used by input()\n\
Georg Brandl88fc6642007-02-09 21:28:07 +00002303stdout -- standard output file object; used by print()\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002304stderr -- standard error object; used for error messages\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002305 By assigning other file objects (or objects that behave like files)\n\
2306 to these, it is possible to redirect all of the interpreter's I/O.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002307\n\
2308last_type -- type of last uncaught exception\n\
2309last_value -- value of last uncaught exception\n\
2310last_traceback -- traceback of last uncaught exception\n\
2311 These three are only available in an interactive session after a\n\
2312 traceback has been printed.\n\
Guido van Rossuma71b5f41999-01-14 19:07:00 +00002313"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002314)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002315/* concatenating string here */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002316PyDoc_STR(
Guido van Rossuma71b5f41999-01-14 19:07:00 +00002317"\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002318Static objects:\n\
2319\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002320builtin_module_names -- tuple of module names built into this interpreter\n\
2321copyright -- copyright notice pertaining to this interpreter\n\
2322exec_prefix -- prefix used to find the machine-specific Python library\n\
Petri Lehtinen4b0eab62012-02-02 21:23:15 +02002323executable -- absolute path of the executable binary of the Python interpreter\n\
Paul Ganssle2bb6bf02019-09-12 03:50:29 +01002324float_info -- a named tuple with information about the float implementation.\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002325float_repr_style -- string indicating the style of repr() output for floats\n\
Paul Ganssle2bb6bf02019-09-12 03:50:29 +01002326hash_info -- a named tuple with information about the hash algorithm.\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002327hexversion -- version information encoded as a single integer\n\
Barry Warsaw409da152012-06-03 16:18:47 -04002328implementation -- Python implementation information.\n\
Paul Ganssle2bb6bf02019-09-12 03:50:29 +01002329int_info -- a named tuple with information about the int implementation.\n\
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002330maxsize -- the largest supported length of containers.\n\
Serhiy Storchakad3faf432015-01-18 11:28:37 +02002331maxunicode -- the value of the largest Unicode code point\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002332platform -- platform identifier\n\
2333prefix -- prefix used to find the Python library\n\
Paul Ganssle2bb6bf02019-09-12 03:50:29 +01002334thread_info -- a named tuple with information about the thread implementation.\n\
Fred Drake801c08d2000-04-13 15:29:10 +00002335version -- the version of this interpreter as a string\n\
Eric Smith0e5b5622009-02-06 01:32:42 +00002336version_info -- version information as a named tuple\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002337"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002338)
Steve Dowercc16be82016-09-08 10:35:16 -07002339#ifdef MS_COREDLL
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002340/* concatenating string here */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002341PyDoc_STR(
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002342"dllhandle -- [Windows only] integer handle of the Python DLL\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002343winver -- [Windows only] version number of the Python DLL\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002344"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002345)
Steve Dowercc16be82016-09-08 10:35:16 -07002346#endif /* MS_COREDLL */
2347#ifdef MS_WINDOWS
2348/* concatenating string here */
2349PyDoc_STR(
oldkaa0735f2018-02-02 16:52:55 +08002350"_enablelegacywindowsfsencoding -- [Windows only]\n\
Steve Dowercc16be82016-09-08 10:35:16 -07002351"
2352)
2353#endif
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002354PyDoc_STR(
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002355"__stdin__ -- the original stdin; don't touch!\n\
2356__stdout__ -- the original stdout; don't touch!\n\
2357__stderr__ -- the original stderr; don't touch!\n\
2358__displayhook__ -- the original displayhook; don't touch!\n\
2359__excepthook__ -- the original excepthook; don't touch!\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002360\n\
2361Functions:\n\
2362\n\
Georg Brandl1a3284e2007-12-02 09:40:06 +00002363displayhook() -- print an object to the screen, and save it in builtins._\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002364excepthook() -- print an exception and its traceback to sys.stderr\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002365exc_info() -- return thread-safe information about the current exception\n\
2366exit() -- exit the interpreter by raising SystemExit\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +00002367getdlopenflags() -- returns flags to be used for dlopen() calls\n\
Christian Heimes9bd667a2008-01-20 15:14:11 +00002368getprofile() -- get the global profiling function\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002369getrefcount() -- return the reference count for an object (plus one :-)\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00002370getrecursionlimit() -- return the max recursion depth for the interpreter\n\
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002371getsizeof() -- return the size of an object in bytes\n\
Christian Heimes9bd667a2008-01-20 15:14:11 +00002372gettrace() -- get the global debug tracing function\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002373setcheckinterval() -- control how often the interpreter checks for events\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +00002374setdlopenflags() -- set the flags to be used for dlopen() calls\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002375setprofile() -- set the global profiling function\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00002376setrecursionlimit() -- set the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002377settrace() -- set the global debug tracing function\n\
Fred Drakeccede592000-08-14 20:59:57 +00002378"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002379)
Fred Drakeccede592000-08-14 20:59:57 +00002380/* end of sys_doc */ ;
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002381
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002382
2383PyDoc_STRVAR(flags__doc__,
2384"sys.flags\n\
2385\n\
2386Flags provided through command line arguments or environment vars.");
2387
2388static PyTypeObject FlagsType;
2389
2390static PyStructSequence_Field flags_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 {"debug", "-d"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 {"inspect", "-i"},
2393 {"interactive", "-i"},
2394 {"optimize", "-O or -OO"},
2395 {"dont_write_bytecode", "-B"},
2396 {"no_user_site", "-s"},
2397 {"no_site", "-S"},
2398 {"ignore_environment", "-E"},
2399 {"verbose", "-v"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 /* {"unbuffered", "-u"}, */
2401 /* {"skip_first", "-x"}, */
Georg Brandl8aa7e992010-12-28 18:30:18 +00002402 {"bytes_warning", "-b"},
2403 {"quiet", "-q"},
Georg Brandl09a7c722012-02-20 21:31:46 +01002404 {"hash_randomization", "-R"},
Christian Heimesad73a9c2013-08-10 16:36:18 +02002405 {"isolated", "-I"},
Victor Stinner5e3806f2017-11-30 11:40:24 +01002406 {"dev_mode", "-X dev"},
Victor Stinner91106cd2017-12-13 12:29:09 +01002407 {"utf8_mode", "-X utf8"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002408 {0}
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002409};
2410
2411static PyStructSequence_Desc flags_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 "sys.flags", /* name */
2413 flags__doc__, /* doc */
2414 flags_fields, /* fields */
Victor Stinner91106cd2017-12-13 12:29:09 +01002415 15
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002416};
2417
2418static PyObject*
Victor Stinner0fd2c302019-06-04 03:15:09 +02002419make_flags(_PyRuntimeState *runtime, PyInterpreterState *interp)
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 int pos = 0;
2422 PyObject *seq;
Victor Stinner331a6a52019-05-27 16:39:22 +02002423 const PyPreConfig *preconfig = &runtime->preconfig;
2424 const PyConfig *config = &interp->config;
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 seq = PyStructSequence_New(&FlagsType);
2427 if (seq == NULL)
2428 return NULL;
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002429
2430#define SetFlag(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag))
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002432
Victor Stinnerfbca9082018-08-30 00:50:45 +02002433 SetFlag(config->parser_debug);
2434 SetFlag(config->inspect);
2435 SetFlag(config->interactive);
2436 SetFlag(config->optimization_level);
2437 SetFlag(!config->write_bytecode);
2438 SetFlag(!config->user_site_directory);
2439 SetFlag(!config->site_import);
Victor Stinner20004952019-03-26 02:31:11 +01002440 SetFlag(!config->use_environment);
Victor Stinnerfbca9082018-08-30 00:50:45 +02002441 SetFlag(config->verbose);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 /* SetFlag(saw_unbuffered_flag); */
2443 /* SetFlag(skipfirstline); */
Victor Stinnerfbca9082018-08-30 00:50:45 +02002444 SetFlag(config->bytes_warning);
2445 SetFlag(config->quiet);
2446 SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0);
Victor Stinner20004952019-03-26 02:31:11 +01002447 SetFlag(config->isolated);
2448 PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode));
2449 SetFlag(preconfig->utf8_mode);
Victor Stinner91106cd2017-12-13 12:29:09 +01002450#undef SetFlag
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 if (PyErr_Occurred()) {
Serhiy Storchaka87a854d2013-12-17 14:59:42 +02002453 Py_DECREF(seq);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 return NULL;
2455 }
2456 return seq;
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002457}
2458
Eric Smith0e5b5622009-02-06 01:32:42 +00002459PyDoc_STRVAR(version_info__doc__,
2460"sys.version_info\n\
2461\n\
2462Version information as a named tuple.");
2463
2464static PyTypeObject VersionInfoType;
2465
2466static PyStructSequence_Field version_info_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 {"major", "Major release number"},
2468 {"minor", "Minor release number"},
2469 {"micro", "Patch release number"},
Ned Deilyda4887a2016-11-04 17:03:34 -04002470 {"releaselevel", "'alpha', 'beta', 'candidate', or 'final'"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 {"serial", "Serial release number"},
2472 {0}
Eric Smith0e5b5622009-02-06 01:32:42 +00002473};
2474
2475static PyStructSequence_Desc version_info_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 "sys.version_info", /* name */
2477 version_info__doc__, /* doc */
2478 version_info_fields, /* fields */
2479 5
Eric Smith0e5b5622009-02-06 01:32:42 +00002480};
2481
2482static PyObject *
2483make_version_info(void)
2484{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 PyObject *version_info;
2486 char *s;
2487 int pos = 0;
Eric Smith0e5b5622009-02-06 01:32:42 +00002488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 version_info = PyStructSequence_New(&VersionInfoType);
2490 if (version_info == NULL) {
2491 return NULL;
2492 }
Eric Smith0e5b5622009-02-06 01:32:42 +00002493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 /*
2495 * These release level checks are mutually exclusive and cover
2496 * the field, so don't get too fancy with the pre-processor!
2497 */
Eric Smith0e5b5622009-02-06 01:32:42 +00002498#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 s = "alpha";
Eric Smith0e5b5622009-02-06 01:32:42 +00002500#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 s = "beta";
Eric Smith0e5b5622009-02-06 01:32:42 +00002502#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 s = "candidate";
Eric Smith0e5b5622009-02-06 01:32:42 +00002504#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 s = "final";
Eric Smith0e5b5622009-02-06 01:32:42 +00002506#endif
2507
2508#define SetIntItem(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 PyStructSequence_SET_ITEM(version_info, pos++, PyLong_FromLong(flag))
Eric Smith0e5b5622009-02-06 01:32:42 +00002510#define SetStrItem(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 PyStructSequence_SET_ITEM(version_info, pos++, PyUnicode_FromString(flag))
Eric Smith0e5b5622009-02-06 01:32:42 +00002512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 SetIntItem(PY_MAJOR_VERSION);
2514 SetIntItem(PY_MINOR_VERSION);
2515 SetIntItem(PY_MICRO_VERSION);
2516 SetStrItem(s);
2517 SetIntItem(PY_RELEASE_SERIAL);
Eric Smith0e5b5622009-02-06 01:32:42 +00002518#undef SetIntItem
2519#undef SetStrItem
2520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 if (PyErr_Occurred()) {
2522 Py_CLEAR(version_info);
2523 return NULL;
2524 }
2525 return version_info;
Eric Smith0e5b5622009-02-06 01:32:42 +00002526}
2527
Brett Cannon3adc7b72012-07-09 14:22:12 -04002528/* sys.implementation values */
2529#define NAME "cpython"
2530const char *_PySys_ImplName = NAME;
Victor Stinnercf01b682015-11-05 11:21:38 +01002531#define MAJOR Py_STRINGIFY(PY_MAJOR_VERSION)
2532#define MINOR Py_STRINGIFY(PY_MINOR_VERSION)
Ned Deily529ea5d2014-06-30 23:31:14 -07002533#define TAG NAME "-" MAJOR MINOR
Brett Cannon3adc7b72012-07-09 14:22:12 -04002534const char *_PySys_ImplCacheTag = TAG;
2535#undef NAME
Brett Cannon3adc7b72012-07-09 14:22:12 -04002536#undef MAJOR
2537#undef MINOR
2538#undef TAG
2539
Barry Warsaw409da152012-06-03 16:18:47 -04002540static PyObject *
2541make_impl_info(PyObject *version_info)
2542{
2543 int res;
2544 PyObject *impl_info, *value, *ns;
2545
2546 impl_info = PyDict_New();
2547 if (impl_info == NULL)
2548 return NULL;
2549
2550 /* populate the dict */
2551
Brett Cannon3adc7b72012-07-09 14:22:12 -04002552 value = PyUnicode_FromString(_PySys_ImplName);
Barry Warsaw409da152012-06-03 16:18:47 -04002553 if (value == NULL)
2554 goto error;
2555 res = PyDict_SetItemString(impl_info, "name", value);
2556 Py_DECREF(value);
2557 if (res < 0)
2558 goto error;
2559
Brett Cannon3adc7b72012-07-09 14:22:12 -04002560 value = PyUnicode_FromString(_PySys_ImplCacheTag);
Barry Warsaw409da152012-06-03 16:18:47 -04002561 if (value == NULL)
2562 goto error;
2563 res = PyDict_SetItemString(impl_info, "cache_tag", value);
2564 Py_DECREF(value);
2565 if (res < 0)
2566 goto error;
Barry Warsaw409da152012-06-03 16:18:47 -04002567
2568 res = PyDict_SetItemString(impl_info, "version", version_info);
2569 if (res < 0)
2570 goto error;
2571
2572 value = PyLong_FromLong(PY_VERSION_HEX);
2573 if (value == NULL)
2574 goto error;
2575 res = PyDict_SetItemString(impl_info, "hexversion", value);
2576 Py_DECREF(value);
2577 if (res < 0)
2578 goto error;
2579
doko@ubuntu.com55532312016-06-14 08:55:19 +02002580#ifdef MULTIARCH
2581 value = PyUnicode_FromString(MULTIARCH);
2582 if (value == NULL)
2583 goto error;
2584 res = PyDict_SetItemString(impl_info, "_multiarch", value);
2585 Py_DECREF(value);
2586 if (res < 0)
2587 goto error;
2588#endif
2589
Barry Warsaw409da152012-06-03 16:18:47 -04002590 /* dict ready */
2591
2592 ns = _PyNamespace_New(impl_info);
2593 Py_DECREF(impl_info);
2594 return ns;
2595
2596error:
2597 Py_CLEAR(impl_info);
2598 return NULL;
2599}
2600
Martin v. Löwis1a214512008-06-11 05:26:20 +00002601static struct PyModuleDef sysmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 PyModuleDef_HEAD_INIT,
2603 "sys",
2604 sys_doc,
2605 -1, /* multiple "initialization" just copies the module dict. */
2606 sys_methods,
2607 NULL,
2608 NULL,
2609 NULL,
2610 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002611};
2612
Eric Snow6b4be192017-05-22 21:36:03 -07002613/* Updating the sys namespace, returning NULL pointer on error */
Victor Stinner8fea2522013-10-27 17:15:42 +01002614#define SET_SYS_FROM_STRING_BORROW(key, value) \
Victor Stinner58049602013-07-22 22:40:00 +02002615 do { \
Victor Stinner58049602013-07-22 22:40:00 +02002616 PyObject *v = (value); \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002617 if (v == NULL) { \
2618 goto err_occurred; \
2619 } \
Victor Stinner58049602013-07-22 22:40:00 +02002620 res = PyDict_SetItemString(sysdict, key, v); \
2621 if (res < 0) { \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002622 goto err_occurred; \
Victor Stinner8fea2522013-10-27 17:15:42 +01002623 } \
2624 } while (0)
2625#define SET_SYS_FROM_STRING(key, value) \
2626 do { \
Victor Stinner8fea2522013-10-27 17:15:42 +01002627 PyObject *v = (value); \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002628 if (v == NULL) { \
2629 goto err_occurred; \
2630 } \
Victor Stinner8fea2522013-10-27 17:15:42 +01002631 res = PyDict_SetItemString(sysdict, key, v); \
2632 Py_DECREF(v); \
2633 if (res < 0) { \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002634 goto err_occurred; \
Victor Stinner58049602013-07-22 22:40:00 +02002635 } \
2636 } while (0)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002637
Victor Stinner331a6a52019-05-27 16:39:22 +02002638static PyStatus
Victor Stinner0fd2c302019-06-04 03:15:09 +02002639_PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp,
2640 PyObject *sysdict)
Eric Snow6b4be192017-05-22 21:36:03 -07002641{
Victor Stinnerab672812019-01-23 15:04:40 +01002642 PyObject *version_info;
Eric Snow6b4be192017-05-22 21:36:03 -07002643 int res;
2644
Nick Coghland6009512014-11-20 21:39:37 +10002645 /* stdin/stdout/stderr are set in pylifecycle.c */
Martin v. Löwis5467d4c2003-05-10 07:10:12 +00002646
Victor Stinner8fea2522013-10-27 17:15:42 +01002647 SET_SYS_FROM_STRING_BORROW("__displayhook__",
2648 PyDict_GetItemString(sysdict, "displayhook"));
2649 SET_SYS_FROM_STRING_BORROW("__excepthook__",
2650 PyDict_GetItemString(sysdict, "excepthook"));
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04002651 SET_SYS_FROM_STRING_BORROW(
2652 "__breakpointhook__",
2653 PyDict_GetItemString(sysdict, "breakpointhook"));
Victor Stinneref9d9b62019-05-22 11:28:22 +02002654 SET_SYS_FROM_STRING_BORROW("__unraisablehook__",
2655 PyDict_GetItemString(sysdict, "unraisablehook"));
2656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 SET_SYS_FROM_STRING("version",
2658 PyUnicode_FromString(Py_GetVersion()));
2659 SET_SYS_FROM_STRING("hexversion",
2660 PyLong_FromLong(PY_VERSION_HEX));
Ned Deily5c4b0d02017-03-04 00:19:55 -05002661 SET_SYS_FROM_STRING("_git",
2662 Py_BuildValue("(szz)", "CPython", _Py_gitidentifier(),
2663 _Py_gitversion()));
INADA Naoki6b42eb12017-06-29 15:31:38 +09002664 SET_SYS_FROM_STRING("_framework", PyUnicode_FromString(_PYTHONFRAMEWORK));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 SET_SYS_FROM_STRING("api_version",
2666 PyLong_FromLong(PYTHON_API_VERSION));
2667 SET_SYS_FROM_STRING("copyright",
2668 PyUnicode_FromString(Py_GetCopyright()));
2669 SET_SYS_FROM_STRING("platform",
2670 PyUnicode_FromString(Py_GetPlatform()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 SET_SYS_FROM_STRING("maxsize",
2672 PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2673 SET_SYS_FROM_STRING("float_info",
2674 PyFloat_GetInfo());
2675 SET_SYS_FROM_STRING("int_info",
2676 PyLong_GetInfo());
Mark Dickinsondc787d22010-05-23 13:33:13 +00002677 /* initialize hash_info */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002678 if (Hash_InfoType.tp_name == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002679 if (PyStructSequence_InitType2(&Hash_InfoType, &hash_info_desc) < 0) {
2680 goto type_init_failed;
2681 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02002682 }
Mark Dickinsondc787d22010-05-23 13:33:13 +00002683 SET_SYS_FROM_STRING("hash_info",
2684 get_hash_info());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 SET_SYS_FROM_STRING("maxunicode",
Ezio Melotti48a2f8f2011-09-29 00:18:19 +03002686 PyLong_FromLong(0x10FFFF));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 SET_SYS_FROM_STRING("builtin_module_names",
2688 list_builtin_module_names());
Christian Heimes743e0cd2012-10-17 23:52:17 +02002689#if PY_BIG_ENDIAN
2690 SET_SYS_FROM_STRING("byteorder",
2691 PyUnicode_FromString("big"));
2692#else
2693 SET_SYS_FROM_STRING("byteorder",
2694 PyUnicode_FromString("little"));
2695#endif
Fred Drake099325e2000-08-14 15:47:03 +00002696
Guido van Rossum8b9ea871996-08-23 18:14:47 +00002697#ifdef MS_COREDLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 SET_SYS_FROM_STRING("dllhandle",
2699 PyLong_FromVoidPtr(PyWin_DLLhModule));
2700 SET_SYS_FROM_STRING("winver",
2701 PyUnicode_FromString(PyWin_DLLVersionString));
Guido van Rossumc606fe11996-04-09 02:37:57 +00002702#endif
Barry Warsaw8cf4eae2010-10-16 01:04:07 +00002703#ifdef ABIFLAGS
2704 SET_SYS_FROM_STRING("abiflags",
2705 PyUnicode_FromString(ABIFLAGS));
2706#endif
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 /* version_info */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002709 if (VersionInfoType.tp_name == NULL) {
2710 if (PyStructSequence_InitType2(&VersionInfoType,
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002711 &version_info_desc) < 0) {
2712 goto type_init_failed;
2713 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02002714 }
Barry Warsaw409da152012-06-03 16:18:47 -04002715 version_info = make_version_info();
2716 SET_SYS_FROM_STRING("version_info", version_info);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717 /* prevent user from creating new instances */
2718 VersionInfoType.tp_init = NULL;
2719 VersionInfoType.tp_new = NULL;
Antoine Pitrou871dfc42014-04-28 13:07:06 +02002720 res = PyDict_DelItemString(VersionInfoType.tp_dict, "__new__");
2721 if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
2722 PyErr_Clear();
Eric Smith0e5b5622009-02-06 01:32:42 +00002723
Barry Warsaw409da152012-06-03 16:18:47 -04002724 /* implementation */
2725 SET_SYS_FROM_STRING("implementation", make_impl_info(version_info));
2726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 /* flags */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002728 if (FlagsType.tp_name == 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002729 if (PyStructSequence_InitType2(&FlagsType, &flags_desc) < 0) {
2730 goto type_init_failed;
2731 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02002732 }
Victor Stinner43125222019-04-24 18:23:53 +02002733 /* Set flags to their default values (updated by _PySys_InitMain()) */
Victor Stinner0fd2c302019-06-04 03:15:09 +02002734 SET_SYS_FROM_STRING("flags", make_flags(runtime, interp));
Eric Smithf7bb5782010-01-27 00:44:57 +00002735
2736#if defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 /* getwindowsversion */
2738 if (WindowsVersionType.tp_name == 0)
Victor Stinner1c8f0592013-07-22 22:24:54 +02002739 if (PyStructSequence_InitType2(&WindowsVersionType,
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002740 &windows_version_desc) < 0) {
2741 goto type_init_failed;
2742 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 /* prevent user from creating new instances */
2744 WindowsVersionType.tp_init = NULL;
2745 WindowsVersionType.tp_new = NULL;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002746 assert(!PyErr_Occurred());
Antoine Pitrou871dfc42014-04-28 13:07:06 +02002747 res = PyDict_DelItemString(WindowsVersionType.tp_dict, "__new__");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002748 if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) {
Antoine Pitrou871dfc42014-04-28 13:07:06 +02002749 PyErr_Clear();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002750 }
Eric Smithf7bb5782010-01-27 00:44:57 +00002751#endif
2752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00002754#ifndef PY_NO_SHORT_FLOAT_REPR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 SET_SYS_FROM_STRING("float_repr_style",
2756 PyUnicode_FromString("short"));
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00002757#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 SET_SYS_FROM_STRING("float_repr_style",
2759 PyUnicode_FromString("legacy"));
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00002760#endif
2761
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002762 SET_SYS_FROM_STRING("thread_info", PyThread_GetInfo());
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002763
Yury Selivanoveb636452016-09-08 22:01:51 -07002764 /* initialize asyncgen_hooks */
2765 if (AsyncGenHooksType.tp_name == NULL) {
2766 if (PyStructSequence_InitType2(
2767 &AsyncGenHooksType, &asyncgen_hooks_desc) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002768 goto type_init_failed;
Yury Selivanoveb636452016-09-08 22:01:51 -07002769 }
2770 }
2771
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002772 if (PyErr_Occurred()) {
2773 goto err_occurred;
2774 }
Victor Stinner331a6a52019-05-27 16:39:22 +02002775 return _PyStatus_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002776
2777type_init_failed:
Victor Stinner331a6a52019-05-27 16:39:22 +02002778 return _PyStatus_ERR("failed to initialize a type");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002779
2780err_occurred:
Victor Stinner331a6a52019-05-27 16:39:22 +02002781 return _PyStatus_ERR("can't initialize sys module");
Guido van Rossum5b3138b1990-11-18 17:41:40 +00002782}
2783
Eric Snow6b4be192017-05-22 21:36:03 -07002784#undef SET_SYS_FROM_STRING
Eric Snow6b4be192017-05-22 21:36:03 -07002785
2786/* Updating the sys namespace, returning integer error codes */
Eric Snow6b4be192017-05-22 21:36:03 -07002787#define SET_SYS_FROM_STRING_INT_RESULT(key, value) \
2788 do { \
2789 PyObject *v = (value); \
2790 if (v == NULL) \
2791 return -1; \
2792 res = PyDict_SetItemString(sysdict, key, v); \
2793 Py_DECREF(v); \
2794 if (res < 0) { \
2795 return res; \
2796 } \
2797 } while (0)
2798
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002799
2800static int
2801sys_add_xoption(PyObject *opts, const wchar_t *s)
2802{
2803 PyObject *name, *value;
2804
2805 const wchar_t *name_end = wcschr(s, L'=');
2806 if (!name_end) {
2807 name = PyUnicode_FromWideChar(s, -1);
2808 value = Py_True;
2809 Py_INCREF(value);
2810 }
2811 else {
2812 name = PyUnicode_FromWideChar(s, name_end - s);
2813 value = PyUnicode_FromWideChar(name_end + 1, -1);
2814 }
2815 if (name == NULL || value == NULL) {
2816 goto error;
2817 }
2818 if (PyDict_SetItem(opts, name, value) < 0) {
2819 goto error;
2820 }
2821 Py_DECREF(name);
2822 Py_DECREF(value);
2823 return 0;
2824
2825error:
2826 Py_XDECREF(name);
2827 Py_XDECREF(value);
2828 return -1;
2829}
2830
2831
2832static PyObject*
Victor Stinner331a6a52019-05-27 16:39:22 +02002833sys_create_xoptions_dict(const PyConfig *config)
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002834{
2835 Py_ssize_t nxoption = config->xoptions.length;
2836 wchar_t * const * xoptions = config->xoptions.items;
2837 PyObject *dict = PyDict_New();
2838 if (dict == NULL) {
2839 return NULL;
2840 }
2841
2842 for (Py_ssize_t i=0; i < nxoption; i++) {
2843 const wchar_t *option = xoptions[i];
2844 if (sys_add_xoption(dict, option) < 0) {
2845 Py_DECREF(dict);
2846 return NULL;
2847 }
2848 }
2849
2850 return dict;
2851}
2852
2853
Eric Snow6b4be192017-05-22 21:36:03 -07002854int
Victor Stinner0fd2c302019-06-04 03:15:09 +02002855_PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp)
Eric Snow6b4be192017-05-22 21:36:03 -07002856{
Victor Stinnerab672812019-01-23 15:04:40 +01002857 PyObject *sysdict = interp->sysdict;
Victor Stinner331a6a52019-05-27 16:39:22 +02002858 const PyConfig *config = &interp->config;
Eric Snow6b4be192017-05-22 21:36:03 -07002859 int res;
2860
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002861#define COPY_LIST(KEY, VALUE) \
Victor Stinner37cd9822018-11-16 11:55:35 +01002862 do { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002863 PyObject *list = _PyWideStringList_AsList(&(VALUE)); \
Victor Stinner37cd9822018-11-16 11:55:35 +01002864 if (list == NULL) { \
2865 return -1; \
2866 } \
2867 SET_SYS_FROM_STRING_BORROW(KEY, list); \
2868 Py_DECREF(list); \
2869 } while (0)
2870
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002871#define SET_SYS_FROM_WSTR(KEY, VALUE) \
2872 do { \
2873 PyObject *str = PyUnicode_FromWideChar(VALUE, -1); \
2874 if (str == NULL) { \
2875 return -1; \
2876 } \
2877 SET_SYS_FROM_STRING_BORROW(KEY, str); \
2878 Py_DECREF(str); \
2879 } while (0)
Victor Stinner37cd9822018-11-16 11:55:35 +01002880
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002881 COPY_LIST("path", config->module_search_paths);
2882
2883 SET_SYS_FROM_WSTR("executable", config->executable);
Steve Dower323e7432019-06-29 14:28:59 -07002884 SET_SYS_FROM_WSTR("_base_executable", config->base_executable);
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002885 SET_SYS_FROM_WSTR("prefix", config->prefix);
2886 SET_SYS_FROM_WSTR("base_prefix", config->base_prefix);
2887 SET_SYS_FROM_WSTR("exec_prefix", config->exec_prefix);
2888 SET_SYS_FROM_WSTR("base_exec_prefix", config->base_exec_prefix);
Victor Stinner41264f12017-12-15 02:05:29 +01002889
Carl Meyerb193fa92018-06-15 22:40:56 -06002890 if (config->pycache_prefix != NULL) {
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002891 SET_SYS_FROM_WSTR("pycache_prefix", config->pycache_prefix);
Carl Meyerb193fa92018-06-15 22:40:56 -06002892 } else {
2893 PyDict_SetItemString(sysdict, "pycache_prefix", Py_None);
2894 }
2895
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002896 COPY_LIST("argv", config->argv);
2897 COPY_LIST("warnoptions", config->warnoptions);
2898
2899 PyObject *xoptions = sys_create_xoptions_dict(config);
2900 if (xoptions == NULL) {
2901 return -1;
Victor Stinner41264f12017-12-15 02:05:29 +01002902 }
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002903 SET_SYS_FROM_STRING_BORROW("_xoptions", xoptions);
Pablo Galindo34ef64f2019-03-27 12:43:47 +00002904 Py_DECREF(xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002905
Victor Stinner37cd9822018-11-16 11:55:35 +01002906#undef COPY_LIST
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002907#undef SET_SYS_FROM_WSTR
Victor Stinner37cd9822018-11-16 11:55:35 +01002908
Eric Snow6b4be192017-05-22 21:36:03 -07002909 /* Set flags to their final values */
Victor Stinner0fd2c302019-06-04 03:15:09 +02002910 SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(runtime, interp));
Eric Snow6b4be192017-05-22 21:36:03 -07002911 /* prevent user from creating new instances */
2912 FlagsType.tp_init = NULL;
2913 FlagsType.tp_new = NULL;
2914 res = PyDict_DelItemString(FlagsType.tp_dict, "__new__");
2915 if (res < 0) {
2916 if (!PyErr_ExceptionMatches(PyExc_KeyError)) {
2917 return res;
2918 }
2919 PyErr_Clear();
2920 }
2921
2922 SET_SYS_FROM_STRING_INT_RESULT("dont_write_bytecode",
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002923 PyBool_FromLong(!config->write_bytecode));
Eric Snow6b4be192017-05-22 21:36:03 -07002924
Eric Snowdae02762017-09-14 00:35:58 -07002925 if (get_warnoptions() == NULL)
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002926 return -1;
Victor Stinner865de272017-06-08 13:27:47 +02002927
Eric Snowdae02762017-09-14 00:35:58 -07002928 if (get_xoptions() == NULL)
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002929 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -07002930
2931 if (PyErr_Occurred())
2932 return -1;
Victor Stinneraf84a882019-08-23 21:16:51 +02002933
Eric Snow6b4be192017-05-22 21:36:03 -07002934 return 0;
Victor Stinner41264f12017-12-15 02:05:29 +01002935
2936err_occurred:
2937 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -07002938}
2939
Victor Stinner41264f12017-12-15 02:05:29 +01002940#undef SET_SYS_FROM_STRING_BORROW
Eric Snow6b4be192017-05-22 21:36:03 -07002941#undef SET_SYS_FROM_STRING_INT_RESULT
Eric Snow6b4be192017-05-22 21:36:03 -07002942
Victor Stinnerab672812019-01-23 15:04:40 +01002943
2944/* Set up a preliminary stderr printer until we have enough
2945 infrastructure for the io module in place.
2946
2947 Use UTF-8/surrogateescape and ignore EAGAIN errors. */
Victor Stinner331a6a52019-05-27 16:39:22 +02002948PyStatus
Victor Stinnerab672812019-01-23 15:04:40 +01002949_PySys_SetPreliminaryStderr(PyObject *sysdict)
2950{
2951 PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr));
2952 if (pstderr == NULL) {
2953 goto error;
2954 }
2955 if (_PyDict_SetItemId(sysdict, &PyId_stderr, pstderr) < 0) {
2956 goto error;
2957 }
2958 if (PyDict_SetItemString(sysdict, "__stderr__", pstderr) < 0) {
2959 goto error;
2960 }
2961 Py_DECREF(pstderr);
Victor Stinner331a6a52019-05-27 16:39:22 +02002962 return _PyStatus_OK();
Victor Stinnerab672812019-01-23 15:04:40 +01002963
2964error:
2965 Py_XDECREF(pstderr);
Victor Stinner331a6a52019-05-27 16:39:22 +02002966 return _PyStatus_ERR("can't set preliminary stderr");
Victor Stinnerab672812019-01-23 15:04:40 +01002967}
2968
2969
2970/* Create sys module without all attributes: _PySys_InitMain() should be called
2971 later to add remaining attributes. */
Victor Stinner331a6a52019-05-27 16:39:22 +02002972PyStatus
Victor Stinner0fd2c302019-06-04 03:15:09 +02002973_PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp,
2974 PyObject **sysmod_p)
Victor Stinnerab672812019-01-23 15:04:40 +01002975{
2976 PyObject *modules = PyDict_New();
2977 if (modules == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002978 return _PyStatus_ERR("can't make modules dictionary");
Victor Stinnerab672812019-01-23 15:04:40 +01002979 }
2980 interp->modules = modules;
2981
2982 PyObject *sysmod = _PyModule_CreateInitialized(&sysmodule, PYTHON_API_VERSION);
2983 if (sysmod == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002984 return _PyStatus_ERR("failed to create a module object");
Victor Stinnerab672812019-01-23 15:04:40 +01002985 }
2986
2987 PyObject *sysdict = PyModule_GetDict(sysmod);
2988 if (sysdict == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002989 return _PyStatus_ERR("can't initialize sys dict");
Victor Stinnerab672812019-01-23 15:04:40 +01002990 }
2991 Py_INCREF(sysdict);
2992 interp->sysdict = sysdict;
2993
2994 if (PyDict_SetItemString(sysdict, "modules", interp->modules) < 0) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002995 return _PyStatus_ERR("can't initialize sys module");
Victor Stinnerab672812019-01-23 15:04:40 +01002996 }
2997
Victor Stinner331a6a52019-05-27 16:39:22 +02002998 PyStatus status = _PySys_SetPreliminaryStderr(sysdict);
2999 if (_PyStatus_EXCEPTION(status)) {
3000 return status;
Victor Stinnerab672812019-01-23 15:04:40 +01003001 }
3002
Victor Stinner0fd2c302019-06-04 03:15:09 +02003003 status = _PySys_InitCore(runtime, interp, sysdict);
Victor Stinner331a6a52019-05-27 16:39:22 +02003004 if (_PyStatus_EXCEPTION(status)) {
3005 return status;
Victor Stinnerab672812019-01-23 15:04:40 +01003006 }
3007
3008 _PyImport_FixupBuiltin(sysmod, "sys", interp->modules);
3009
3010 *sysmod_p = sysmod;
Victor Stinner331a6a52019-05-27 16:39:22 +02003011 return _PyStatus_OK();
Victor Stinnerab672812019-01-23 15:04:40 +01003012}
3013
3014
Guido van Rossum65bf9f21997-04-29 18:33:38 +00003015static PyObject *
Martin v. Löwis790465f2008-04-05 20:41:37 +00003016makepathobject(const wchar_t *path, wchar_t delim)
Guido van Rossum5b3138b1990-11-18 17:41:40 +00003017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 int i, n;
3019 const wchar_t *p;
3020 PyObject *v, *w;
Tim Peters216b78b2006-01-06 02:40:53 +00003021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003022 n = 1;
3023 p = path;
3024 while ((p = wcschr(p, delim)) != NULL) {
3025 n++;
3026 p++;
3027 }
3028 v = PyList_New(n);
3029 if (v == NULL)
3030 return NULL;
3031 for (i = 0; ; i++) {
3032 p = wcschr(path, delim);
3033 if (p == NULL)
3034 p = path + wcslen(path); /* End of string */
3035 w = PyUnicode_FromWideChar(path, (Py_ssize_t)(p - path));
3036 if (w == NULL) {
3037 Py_DECREF(v);
3038 return NULL;
3039 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07003040 PyList_SET_ITEM(v, i, w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 if (*p == '\0')
3042 break;
3043 path = p+1;
3044 }
3045 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003046}
3047
3048void
Martin v. Löwis790465f2008-04-05 20:41:37 +00003049PySys_SetPath(const wchar_t *path)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 PyObject *v;
3052 if ((v = makepathobject(path, DELIM)) == NULL)
3053 Py_FatalError("can't create sys.path");
Victor Stinnerbd303c12013-11-07 23:07:29 +01003054 if (_PySys_SetObjectId(&PyId_path, v) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 Py_FatalError("can't assign sys.path");
3056 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003057}
3058
Guido van Rossum65bf9f21997-04-29 18:33:38 +00003059static PyObject *
Victor Stinner74f65682019-03-15 15:08:05 +01003060make_sys_argv(int argc, wchar_t * const * argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003061{
Victor Stinner74f65682019-03-15 15:08:05 +01003062 PyObject *list = PyList_New(argc);
3063 if (list == NULL) {
3064 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065 }
Victor Stinner74f65682019-03-15 15:08:05 +01003066
3067 for (Py_ssize_t i = 0; i < argc; i++) {
3068 PyObject *v = PyUnicode_FromWideChar(argv[i], -1);
3069 if (v == NULL) {
3070 Py_DECREF(list);
3071 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 }
Victor Stinner74f65682019-03-15 15:08:05 +01003073 PyList_SET_ITEM(list, i, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 }
Victor Stinner74f65682019-03-15 15:08:05 +01003075 return list;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003076}
3077
Victor Stinner11a247d2017-12-13 21:05:57 +01003078void
3079PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
Victor Stinnerd5dda982017-12-13 17:31:16 +01003080{
Victor Stinnerca9ae942019-08-23 12:22:14 +01003081 wchar_t* empty_argv[1] = {L""};
3082
Victor Stinner74f65682019-03-15 15:08:05 +01003083 if (argc < 1 || argv == NULL) {
3084 /* Ensure at least one (empty) argument is seen */
Victor Stinner74f65682019-03-15 15:08:05 +01003085 argv = empty_argv;
3086 argc = 1;
3087 }
3088
3089 PyObject *av = make_sys_argv(argc, argv);
Victor Stinnerd5dda982017-12-13 17:31:16 +01003090 if (av == NULL) {
Victor Stinner11a247d2017-12-13 21:05:57 +01003091 Py_FatalError("no mem for sys.argv");
Victor Stinnerd5dda982017-12-13 17:31:16 +01003092 }
3093 if (PySys_SetObject("argv", av) != 0) {
3094 Py_DECREF(av);
Victor Stinner11a247d2017-12-13 21:05:57 +01003095 Py_FatalError("can't assign sys.argv");
Victor Stinnerd5dda982017-12-13 17:31:16 +01003096 }
3097 Py_DECREF(av);
3098
3099 if (updatepath) {
3100 /* If argv[0] is not '-c' nor '-m', prepend argv[0] to sys.path.
3101 If argv[0] is a symlink, use the real path. */
Victor Stinner331a6a52019-05-27 16:39:22 +02003102 const PyWideStringList argv_list = {.length = argc, .items = argv};
Victor Stinnerdcf61712019-03-19 16:09:27 +01003103 PyObject *path0 = NULL;
3104 if (_PyPathConfig_ComputeSysPath0(&argv_list, &path0)) {
3105 if (path0 == NULL) {
3106 Py_FatalError("can't compute path0 from argv");
Victor Stinner11a247d2017-12-13 21:05:57 +01003107 }
Victor Stinnerdcf61712019-03-19 16:09:27 +01003108
3109 PyObject *sys_path = _PySys_GetObjectId(&PyId_path);
3110 if (sys_path != NULL) {
3111 if (PyList_Insert(sys_path, 0, path0) < 0) {
3112 Py_DECREF(path0);
3113 Py_FatalError("can't prepend path0 to sys.path");
3114 }
3115 }
3116 Py_DECREF(path0);
Victor Stinner11a247d2017-12-13 21:05:57 +01003117 }
Victor Stinnerd5dda982017-12-13 17:31:16 +01003118 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003119}
Guido van Rossuma890e681998-05-12 14:59:24 +00003120
Antoine Pitrouf978fac2010-05-21 17:25:34 +00003121void
3122PySys_SetArgv(int argc, wchar_t **argv)
3123{
Christian Heimesad73a9c2013-08-10 16:36:18 +02003124 PySys_SetArgvEx(argc, argv, Py_IsolatedFlag == 0);
Antoine Pitrouf978fac2010-05-21 17:25:34 +00003125}
3126
Victor Stinner14284c22010-04-23 12:02:30 +00003127/* Reimplementation of PyFile_WriteString() no calling indirectly
3128 PyErr_CheckSignals(): avoid the call to PyObject_Str(). */
3129
3130static int
Victor Stinner79766632010-08-16 17:36:42 +00003131sys_pyfile_write_unicode(PyObject *unicode, PyObject *file)
Victor Stinner14284c22010-04-23 12:02:30 +00003132{
Victor Stinnerc3ccaae2016-08-20 01:24:22 +02003133 PyObject *writer = NULL, *result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003134 int err;
Victor Stinner14284c22010-04-23 12:02:30 +00003135
Victor Stinnerecccc4f2010-06-08 20:46:00 +00003136 if (file == NULL)
3137 return -1;
3138
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003139 writer = _PyObject_GetAttrId(file, &PyId_write);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003140 if (writer == NULL)
3141 goto error;
Victor Stinner14284c22010-04-23 12:02:30 +00003142
Victor Stinner7bfb42d2016-12-05 17:04:32 +01003143 result = PyObject_CallFunctionObjArgs(writer, unicode, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 if (result == NULL) {
3145 goto error;
3146 } else {
3147 err = 0;
3148 goto finally;
3149 }
Victor Stinner14284c22010-04-23 12:02:30 +00003150
3151error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 err = -1;
Victor Stinner14284c22010-04-23 12:02:30 +00003153finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 Py_XDECREF(writer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003155 Py_XDECREF(result);
3156 return err;
Victor Stinner14284c22010-04-23 12:02:30 +00003157}
3158
Victor Stinner79766632010-08-16 17:36:42 +00003159static int
3160sys_pyfile_write(const char *text, PyObject *file)
3161{
3162 PyObject *unicode = NULL;
3163 int err;
3164
3165 if (file == NULL)
3166 return -1;
3167
3168 unicode = PyUnicode_FromString(text);
3169 if (unicode == NULL)
3170 return -1;
3171
3172 err = sys_pyfile_write_unicode(unicode, file);
3173 Py_DECREF(unicode);
3174 return err;
3175}
Guido van Rossuma890e681998-05-12 14:59:24 +00003176
3177/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
3178 Adapted from code submitted by Just van Rossum.
3179
3180 PySys_WriteStdout(format, ...)
3181 PySys_WriteStderr(format, ...)
3182
3183 The first function writes to sys.stdout; the second to sys.stderr. When
3184 there is a problem, they write to the real (C level) stdout or stderr;
Guido van Rossum8442af31998-10-12 18:22:10 +00003185 no exceptions are raised.
Guido van Rossuma890e681998-05-12 14:59:24 +00003186
Victor Stinner14284c22010-04-23 12:02:30 +00003187 PyErr_CheckSignals() is not called to avoid the execution of the Python
Victor Stinner79766632010-08-16 17:36:42 +00003188 signal handlers: they may raise a new exception whereas sys_write()
3189 ignores all exceptions.
Victor Stinner14284c22010-04-23 12:02:30 +00003190
Guido van Rossuma890e681998-05-12 14:59:24 +00003191 Both take a printf-style format string as their first argument followed
3192 by a variable length argument list determined by the format string.
3193
3194 *** WARNING ***
3195
3196 The format should limit the total size of the formatted output string to
3197 1000 bytes. In particular, this means that no unrestricted "%s" formats
3198 should occur; these should be limited using "%.<N>s where <N> is a
3199 decimal number calculated so that <N> plus the maximum size of other
3200 formatted text does not exceed 1000 bytes. Also watch out for "%f",
3201 which can print hundreds of digits for very large numbers.
3202
3203 */
3204
3205static void
Victor Stinner09054372013-11-06 22:41:44 +01003206sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va)
Guido van Rossuma890e681998-05-12 14:59:24 +00003207{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003208 PyObject *file;
3209 PyObject *error_type, *error_value, *error_traceback;
3210 char buffer[1001];
3211 int written;
Guido van Rossuma890e681998-05-12 14:59:24 +00003212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Victor Stinner09054372013-11-06 22:41:44 +01003214 file = _PySys_GetObjectId(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
3216 if (sys_pyfile_write(buffer, file) != 0) {
3217 PyErr_Clear();
3218 fputs(buffer, fp);
3219 }
3220 if (written < 0 || (size_t)written >= sizeof(buffer)) {
3221 const char *truncated = "... truncated";
Victor Stinner79766632010-08-16 17:36:42 +00003222 if (sys_pyfile_write(truncated, file) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 fputs(truncated, fp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003224 }
3225 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +00003226}
3227
3228void
Guido van Rossuma890e681998-05-12 14:59:24 +00003229PySys_WriteStdout(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00003230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231 va_list va;
Guido van Rossuma890e681998-05-12 14:59:24 +00003232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003234 sys_write(&PyId_stdout, stdout, format, va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 va_end(va);
Guido van Rossuma890e681998-05-12 14:59:24 +00003236}
3237
3238void
Guido van Rossuma890e681998-05-12 14:59:24 +00003239PySys_WriteStderr(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00003240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 va_list va;
Guido van Rossuma890e681998-05-12 14:59:24 +00003242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003243 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003244 sys_write(&PyId_stderr, stderr, format, va);
Victor Stinner79766632010-08-16 17:36:42 +00003245 va_end(va);
3246}
3247
3248static void
Victor Stinner09054372013-11-06 22:41:44 +01003249sys_format(_Py_Identifier *key, FILE *fp, const char *format, va_list va)
Victor Stinner79766632010-08-16 17:36:42 +00003250{
3251 PyObject *file, *message;
3252 PyObject *error_type, *error_value, *error_traceback;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02003253 const char *utf8;
Victor Stinner79766632010-08-16 17:36:42 +00003254
3255 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Victor Stinner09054372013-11-06 22:41:44 +01003256 file = _PySys_GetObjectId(key);
Victor Stinner79766632010-08-16 17:36:42 +00003257 message = PyUnicode_FromFormatV(format, va);
3258 if (message != NULL) {
3259 if (sys_pyfile_write_unicode(message, file) != 0) {
3260 PyErr_Clear();
Serhiy Storchaka06515832016-11-20 09:13:07 +02003261 utf8 = PyUnicode_AsUTF8(message);
Victor Stinner79766632010-08-16 17:36:42 +00003262 if (utf8 != NULL)
3263 fputs(utf8, fp);
3264 }
3265 Py_DECREF(message);
3266 }
3267 PyErr_Restore(error_type, error_value, error_traceback);
3268}
3269
3270void
3271PySys_FormatStdout(const char *format, ...)
3272{
3273 va_list va;
3274
3275 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003276 sys_format(&PyId_stdout, stdout, format, va);
Victor Stinner79766632010-08-16 17:36:42 +00003277 va_end(va);
3278}
3279
3280void
3281PySys_FormatStderr(const char *format, ...)
3282{
3283 va_list va;
3284
3285 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003286 sys_format(&PyId_stderr, stderr, format, va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 va_end(va);
Guido van Rossuma890e681998-05-12 14:59:24 +00003288}