blob: c78a62738052219c8c96278fcd8ec437b445abbe [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 Stinner838f2642019-06-13 22:41:23 +020020#include "pycore_ceval.h"
Victor Stinner331a6a52019-05-27 16:39:22 +020021#include "pycore_initconfig.h"
Victor Stinner838f2642019-06-13 22:41:23 +020022#include "pycore_pathconfig.h"
23#include "pycore_pyerrors.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010024#include "pycore_pylifecycle.h"
25#include "pycore_pymem.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010026#include "pycore_pystate.h"
Steve Dowerb82e17e2019-05-23 08:45:22 -070027#include "pycore_tupleobject.h"
Victor Stinnerd5c355c2011-04-30 14:53:09 +020028#include "pythread.h"
Steve Dowerb82e17e2019-05-23 08:45:22 -070029#include "pydtrace.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030
Guido van Rossume2437a11992-03-23 18:20:18 +000031#include "osdefs.h"
Stefan Krah1845d142016-04-25 21:38:53 +020032#include <locale.h>
Guido van Rossum3f5da241990-12-20 15:06:42 +000033
Mark Hammond8696ebc2002-10-08 02:44:31 +000034#ifdef MS_WINDOWS
35#define WIN32_LEAN_AND_MEAN
Amaury Forgeot d'Arc06cfe952007-11-10 13:55:44 +000036#include <windows.h>
Mark Hammond8696ebc2002-10-08 02:44:31 +000037#endif /* MS_WINDOWS */
38
Guido van Rossum9b38a141996-09-11 23:12:24 +000039#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000040extern void *PyWin_DLLhModule;
Guido van Rossum6c1e5f21997-09-29 23:34:23 +000041/* A string loaded from the DLL at startup: */
42extern const char *PyWin_DLLVersionString;
Guido van Rossumc606fe11996-04-09 02:37:57 +000043#endif
44
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -080045/*[clinic input]
46module sys
47[clinic start generated code]*/
48/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3726b388feee8cea]*/
49
50#include "clinic/sysmodule.c.h"
51
Victor Stinnerbd303c12013-11-07 23:07:29 +010052_Py_IDENTIFIER(_);
53_Py_IDENTIFIER(__sizeof__);
Eric Snowdae02762017-09-14 00:35:58 -070054_Py_IDENTIFIER(_xoptions);
Victor Stinnerbd303c12013-11-07 23:07:29 +010055_Py_IDENTIFIER(buffer);
56_Py_IDENTIFIER(builtins);
57_Py_IDENTIFIER(encoding);
58_Py_IDENTIFIER(path);
59_Py_IDENTIFIER(stdout);
60_Py_IDENTIFIER(stderr);
Eric Snowdae02762017-09-14 00:35:58 -070061_Py_IDENTIFIER(warnoptions);
Victor Stinnerbd303c12013-11-07 23:07:29 +010062_Py_IDENTIFIER(write);
63
Victor Stinner838f2642019-06-13 22:41:23 +020064static PyObject *
65sys_get_object_id(PyThreadState *tstate, _Py_Identifier *key)
Victor Stinnerd67bd452013-11-06 22:36:40 +010066{
Victor Stinner838f2642019-06-13 22:41:23 +020067 PyObject *sd = tstate->interp->sysdict;
Victor Stinnercaba55b2018-08-03 15:33:52 +020068 if (sd == NULL) {
Victor Stinnerd67bd452013-11-06 22:36:40 +010069 return NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +020070 }
Victor Stinnerd67bd452013-11-06 22:36:40 +010071 return _PyDict_GetItemId(sd, key);
72}
73
74PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +020075_PySys_GetObjectId(_Py_Identifier *key)
76{
77 PyThreadState *tstate = _PyThreadState_GET();
78 return sys_get_object_id(tstate, key);
79}
80
81PyObject *
Neal Norwitzf3081322007-08-25 00:32:45 +000082PySys_GetObject(const char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083{
Victor Stinner838f2642019-06-13 22:41:23 +020084 PyThreadState *tstate = _PyThreadState_GET();
85 PyObject *sd = tstate->interp->sysdict;
Victor Stinnercaba55b2018-08-03 15:33:52 +020086 if (sd == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 return NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +020088 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 return PyDict_GetItemString(sd, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090}
91
Victor Stinner838f2642019-06-13 22:41:23 +020092static int
93sys_set_object_id(PyThreadState *tstate, _Py_Identifier *key, PyObject *v)
Victor Stinnerd67bd452013-11-06 22:36:40 +010094{
Victor Stinner838f2642019-06-13 22:41:23 +020095 PyObject *sd = tstate->interp->sysdict;
Victor Stinnerd67bd452013-11-06 22:36:40 +010096 if (v == NULL) {
Victor Stinnercaba55b2018-08-03 15:33:52 +020097 if (_PyDict_GetItemId(sd, key) == NULL) {
Victor Stinnerd67bd452013-11-06 22:36:40 +010098 return 0;
Victor Stinnercaba55b2018-08-03 15:33:52 +020099 }
100 else {
Victor Stinnerd67bd452013-11-06 22:36:40 +0100101 return _PyDict_DelItemId(sd, key);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200102 }
Victor Stinnerd67bd452013-11-06 22:36:40 +0100103 }
Victor Stinnercaba55b2018-08-03 15:33:52 +0200104 else {
Victor Stinnerd67bd452013-11-06 22:36:40 +0100105 return _PyDict_SetItemId(sd, key, v);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200106 }
Victor Stinnerd67bd452013-11-06 22:36:40 +0100107}
108
109int
Victor Stinner838f2642019-06-13 22:41:23 +0200110_PySys_SetObjectId(_Py_Identifier *key, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111{
Victor Stinner838f2642019-06-13 22:41:23 +0200112 PyThreadState *tstate = _PyThreadState_GET();
113 return sys_set_object_id(tstate, key, v);
114}
115
116static int
117sys_set_object(PyThreadState *tstate, const char *name, PyObject *v)
118{
119 PyObject *sd = tstate->interp->sysdict;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 if (v == NULL) {
Victor Stinnercaba55b2018-08-03 15:33:52 +0200121 if (PyDict_GetItemString(sd, name) == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 return 0;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200123 }
124 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 return PyDict_DelItemString(sd, name);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200126 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 }
Victor Stinnercaba55b2018-08-03 15:33:52 +0200128 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 return PyDict_SetItemString(sd, name, v);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200130 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131}
132
Victor Stinner838f2642019-06-13 22:41:23 +0200133int
134PySys_SetObject(const char *name, PyObject *v)
Steve Dowerb82e17e2019-05-23 08:45:22 -0700135{
Victor Stinner838f2642019-06-13 22:41:23 +0200136 PyThreadState *tstate = _PyThreadState_GET();
137 return sys_set_object(tstate, name, v);
138}
139
140static int
141should_audit(PyThreadState *ts)
142{
Steve Dowerb82e17e2019-05-23 08:45:22 -0700143 if (!ts) {
144 return 0;
145 }
Victor Stinner0fd2c302019-06-04 03:15:09 +0200146 PyInterpreterState *is = ts ? ts->interp : NULL;
147 return _PyRuntime.audit_hook_head
Steve Dowerb82e17e2019-05-23 08:45:22 -0700148 || (is && is->audit_hooks)
149 || PyDTrace_AUDIT_ENABLED();
150}
151
152int
153PySys_Audit(const char *event, const char *argFormat, ...)
154{
155 PyObject *eventName = NULL;
156 PyObject *eventArgs = NULL;
157 PyObject *hooks = NULL;
158 PyObject *hook = NULL;
159 int res = -1;
Victor Stinner838f2642019-06-13 22:41:23 +0200160 PyThreadState *ts = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -0700161
162 /* N format is inappropriate, because you do not know
163 whether the reference is consumed by the call.
164 Assert rather than exception for perf reasons */
165 assert(!argFormat || !strchr(argFormat, 'N'));
166
167 /* Early exit when no hooks are registered */
Victor Stinner838f2642019-06-13 22:41:23 +0200168 if (!should_audit(ts)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700169 return 0;
170 }
171
172 _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700173 int dtrace = PyDTrace_AUDIT_ENABLED();
174
175 PyObject *exc_type, *exc_value, *exc_tb;
176 if (ts) {
Victor Stinner838f2642019-06-13 22:41:23 +0200177 _PyErr_Fetch(ts, &exc_type, &exc_value, &exc_tb);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700178 }
179
180 /* Initialize event args now */
181 if (argFormat && argFormat[0]) {
182 va_list args;
183 va_start(args, argFormat);
Steve Dowerb8cbe742019-12-09 11:05:39 -0800184 eventArgs = _Py_VaBuildValue_SizeT(argFormat, args);
Zackery Spytz08286d52019-06-21 09:31:59 -0600185 va_end(args);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700186 if (eventArgs && !PyTuple_Check(eventArgs)) {
187 PyObject *argTuple = PyTuple_Pack(1, eventArgs);
188 Py_DECREF(eventArgs);
189 eventArgs = argTuple;
190 }
191 } else {
192 eventArgs = PyTuple_New(0);
193 }
194 if (!eventArgs) {
195 goto exit;
196 }
197
198 /* Call global hooks */
199 for (; e; e = e->next) {
200 if (e->hookCFunction(event, eventArgs, e->userData) < 0) {
201 goto exit;
202 }
203 }
204
205 /* Dtrace USDT point */
206 if (dtrace) {
Andy Lestere6be9b52020-02-11 20:28:35 -0600207 PyDTrace_AUDIT(event, (void *)eventArgs);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700208 }
209
210 /* Call interpreter hooks */
Victor Stinner838f2642019-06-13 22:41:23 +0200211 PyInterpreterState *is = ts ? ts->interp : NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700212 if (is && is->audit_hooks) {
213 eventName = PyUnicode_FromString(event);
214 if (!eventName) {
215 goto exit;
216 }
217
218 hooks = PyObject_GetIter(is->audit_hooks);
219 if (!hooks) {
220 goto exit;
221 }
222
223 /* Disallow tracing in hooks unless explicitly enabled */
224 ts->tracing++;
225 ts->use_tracing = 0;
226 while ((hook = PyIter_Next(hooks)) != NULL) {
Serhiy Storchaka41c57b32019-09-01 12:03:39 +0300227 _Py_IDENTIFIER(__cantrace__);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700228 PyObject *o;
Serhiy Storchaka41c57b32019-09-01 12:03:39 +0300229 int canTrace = _PyObject_LookupAttrId(hook, &PyId___cantrace__, &o);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700230 if (o) {
231 canTrace = PyObject_IsTrue(o);
232 Py_DECREF(o);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700233 }
234 if (canTrace < 0) {
235 break;
236 }
237 if (canTrace) {
238 ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc);
239 ts->tracing--;
240 }
241 o = PyObject_CallFunctionObjArgs(hook, eventName,
242 eventArgs, NULL);
243 if (canTrace) {
244 ts->tracing++;
245 ts->use_tracing = 0;
246 }
247 if (!o) {
248 break;
249 }
250 Py_DECREF(o);
251 Py_CLEAR(hook);
252 }
253 ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc);
254 ts->tracing--;
Victor Stinner838f2642019-06-13 22:41:23 +0200255 if (_PyErr_Occurred(ts)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700256 goto exit;
257 }
258 }
259
260 res = 0;
261
262exit:
263 Py_XDECREF(hook);
264 Py_XDECREF(hooks);
265 Py_XDECREF(eventName);
266 Py_XDECREF(eventArgs);
267
268 if (ts) {
269 if (!res) {
Victor Stinner838f2642019-06-13 22:41:23 +0200270 _PyErr_Restore(ts, exc_type, exc_value, exc_tb);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700271 } else {
Victor Stinner838f2642019-06-13 22:41:23 +0200272 assert(_PyErr_Occurred(ts));
Steve Dowerb82e17e2019-05-23 08:45:22 -0700273 Py_XDECREF(exc_type);
274 Py_XDECREF(exc_value);
275 Py_XDECREF(exc_tb);
276 }
277 }
278
279 return res;
280}
281
282/* We expose this function primarily for our own cleanup during
283 * finalization. In general, it should not need to be called,
284 * and as such it is not defined in any header files.
285 */
Victor Stinner838f2642019-06-13 22:41:23 +0200286void
287_PySys_ClearAuditHooks(void)
288{
Steve Dowerb82e17e2019-05-23 08:45:22 -0700289 /* Must be finalizing to clear hooks */
290 _PyRuntimeState *runtime = &_PyRuntime;
291 PyThreadState *ts = _PyRuntimeState_GetThreadState(runtime);
Victor Stinner7b3c2522020-03-07 00:24:23 +0100292 PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(runtime);
293 assert(!ts || finalizing == ts);
294 if (!ts || finalizing != ts) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700295 return;
Victor Stinner838f2642019-06-13 22:41:23 +0200296 }
Steve Dowerb82e17e2019-05-23 08:45:22 -0700297
Victor Stinner838f2642019-06-13 22:41:23 +0200298 const PyConfig *config = &ts->interp->config;
299 if (config->verbose) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700300 PySys_WriteStderr("# clear sys.audit hooks\n");
301 }
302
303 /* Hooks can abort later hooks for this event, but cannot
304 abort the clear operation itself. */
305 PySys_Audit("cpython._PySys_ClearAuditHooks", NULL);
Victor Stinner838f2642019-06-13 22:41:23 +0200306 _PyErr_Clear(ts);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700307
Victor Stinner0fd2c302019-06-04 03:15:09 +0200308 _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head, *n;
309 _PyRuntime.audit_hook_head = NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700310 while (e) {
311 n = e->next;
312 PyMem_RawFree(e);
313 e = n;
314 }
315}
316
317int
318PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)
319{
Victor Stinner838f2642019-06-13 22:41:23 +0200320 _PyRuntimeState *runtime = &_PyRuntime;
321 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
322
Steve Dowerb82e17e2019-05-23 08:45:22 -0700323 /* Invoke existing audit hooks to allow them an opportunity to abort. */
324 /* Cannot invoke hooks until we are initialized */
Victor Stinner838f2642019-06-13 22:41:23 +0200325 if (runtime->initialized) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700326 if (PySys_Audit("sys.addaudithook", NULL) < 0) {
Steve Dowerbea33f52019-11-28 08:46:11 -0800327 if (_PyErr_ExceptionMatches(tstate, PyExc_RuntimeError)) {
328 /* We do not report errors derived from RuntimeError */
Victor Stinner838f2642019-06-13 22:41:23 +0200329 _PyErr_Clear(tstate);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700330 return 0;
331 }
332 return -1;
333 }
334 }
335
Victor Stinner0fd2c302019-06-04 03:15:09 +0200336 _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700337 if (!e) {
338 e = (_Py_AuditHookEntry*)PyMem_RawMalloc(sizeof(_Py_AuditHookEntry));
Victor Stinner0fd2c302019-06-04 03:15:09 +0200339 _PyRuntime.audit_hook_head = e;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700340 } else {
Victor Stinner838f2642019-06-13 22:41:23 +0200341 while (e->next) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700342 e = e->next;
Victor Stinner838f2642019-06-13 22:41:23 +0200343 }
Steve Dowerb82e17e2019-05-23 08:45:22 -0700344 e = e->next = (_Py_AuditHookEntry*)PyMem_RawMalloc(
345 sizeof(_Py_AuditHookEntry));
346 }
347
348 if (!e) {
Victor Stinner838f2642019-06-13 22:41:23 +0200349 if (runtime->initialized) {
350 _PyErr_NoMemory(tstate);
351 }
Steve Dowerb82e17e2019-05-23 08:45:22 -0700352 return -1;
353 }
354
355 e->next = NULL;
356 e->hookCFunction = (Py_AuditHookFunction)hook;
357 e->userData = userData;
358
359 return 0;
360}
361
362/*[clinic input]
363sys.addaudithook
364
365 hook: object
366
367Adds a new audit hook callback.
368[clinic start generated code]*/
369
370static PyObject *
371sys_addaudithook_impl(PyObject *module, PyObject *hook)
372/*[clinic end generated code: output=4f9c17aaeb02f44e input=0f3e191217a45e34]*/
373{
Victor Stinner838f2642019-06-13 22:41:23 +0200374 PyThreadState *tstate = _PyThreadState_GET();
375
Steve Dowerb82e17e2019-05-23 08:45:22 -0700376 /* Invoke existing audit hooks to allow them an opportunity to abort. */
377 if (PySys_Audit("sys.addaudithook", NULL) < 0) {
Victor Stinner838f2642019-06-13 22:41:23 +0200378 if (_PyErr_ExceptionMatches(tstate, PyExc_Exception)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700379 /* We do not report errors derived from Exception */
Victor Stinner838f2642019-06-13 22:41:23 +0200380 _PyErr_Clear(tstate);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700381 Py_RETURN_NONE;
382 }
383 return NULL;
384 }
385
Victor Stinner838f2642019-06-13 22:41:23 +0200386 PyInterpreterState *is = tstate->interp;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700387
388 if (is->audit_hooks == NULL) {
389 is->audit_hooks = PyList_New(0);
390 if (is->audit_hooks == NULL) {
391 return NULL;
392 }
393 }
394
395 if (PyList_Append(is->audit_hooks, hook) < 0) {
396 return NULL;
397 }
398
399 Py_RETURN_NONE;
400}
401
402PyDoc_STRVAR(audit_doc,
403"audit(event, *args)\n\
404\n\
405Passes the event to any audit hooks that are attached.");
406
407static PyObject *
408sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc)
409{
Victor Stinner838f2642019-06-13 22:41:23 +0200410 PyThreadState *tstate = _PyThreadState_GET();
411
Steve Dowerb82e17e2019-05-23 08:45:22 -0700412 if (argc == 0) {
Victor Stinner838f2642019-06-13 22:41:23 +0200413 _PyErr_SetString(tstate, PyExc_TypeError,
414 "audit() missing 1 required positional argument: "
415 "'event'");
Steve Dowerb82e17e2019-05-23 08:45:22 -0700416 return NULL;
417 }
418
Victor Stinner838f2642019-06-13 22:41:23 +0200419 if (!should_audit(tstate)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700420 Py_RETURN_NONE;
421 }
422
423 PyObject *auditEvent = args[0];
424 if (!auditEvent) {
Victor Stinner838f2642019-06-13 22:41:23 +0200425 _PyErr_SetString(tstate, PyExc_TypeError,
426 "expected str for argument 'event'");
Steve Dowerb82e17e2019-05-23 08:45:22 -0700427 return NULL;
428 }
429 if (!PyUnicode_Check(auditEvent)) {
Victor Stinner838f2642019-06-13 22:41:23 +0200430 _PyErr_Format(tstate, PyExc_TypeError,
431 "expected str for argument 'event', not %.200s",
432 Py_TYPE(auditEvent)->tp_name);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700433 return NULL;
434 }
435 const char *event = PyUnicode_AsUTF8(auditEvent);
436 if (!event) {
437 return NULL;
438 }
439
440 PyObject *auditArgs = _PyTuple_FromArray(args + 1, argc - 1);
441 if (!auditArgs) {
442 return NULL;
443 }
444
445 int res = PySys_Audit(event, "O", auditArgs);
446 Py_DECREF(auditArgs);
447
448 if (res < 0) {
449 return NULL;
450 }
451
452 Py_RETURN_NONE;
453}
454
455
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400456static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200457sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400458{
Victor Stinner838f2642019-06-13 22:41:23 +0200459 PyThreadState *tstate = _PyThreadState_GET();
460 assert(!_PyErr_Occurred(tstate));
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300461 char *envar = Py_GETENV("PYTHONBREAKPOINT");
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400462
463 if (envar == NULL || strlen(envar) == 0) {
464 envar = "pdb.set_trace";
465 }
466 else if (!strcmp(envar, "0")) {
467 /* The breakpoint is explicitly no-op'd. */
468 Py_RETURN_NONE;
469 }
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300470 /* According to POSIX the string returned by getenv() might be invalidated
471 * or the string content might be overwritten by a subsequent call to
472 * getenv(). Since importing a module can performs the getenv() calls,
473 * we need to save a copy of envar. */
474 envar = _PyMem_RawStrdup(envar);
475 if (envar == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200476 _PyErr_NoMemory(tstate);
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300477 return NULL;
478 }
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200479 const char *last_dot = strrchr(envar, '.');
480 const char *attrname = NULL;
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400481 PyObject *modulepath = NULL;
482
483 if (last_dot == NULL) {
484 /* The breakpoint is a built-in, e.g. PYTHONBREAKPOINT=int */
485 modulepath = PyUnicode_FromString("builtins");
486 attrname = envar;
487 }
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200488 else if (last_dot != envar) {
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400489 /* Split on the last dot; */
490 modulepath = PyUnicode_FromStringAndSize(envar, last_dot - envar);
491 attrname = last_dot + 1;
492 }
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200493 else {
494 goto warn;
495 }
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400496 if (modulepath == NULL) {
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300497 PyMem_RawFree(envar);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400498 return NULL;
499 }
500
Anthony Sottiledce345c2018-11-01 10:25:05 -0700501 PyObject *module = PyImport_Import(modulepath);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400502 Py_DECREF(modulepath);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400503
504 if (module == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200505 if (_PyErr_ExceptionMatches(tstate, PyExc_ImportError)) {
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200506 goto warn;
507 }
508 PyMem_RawFree(envar);
509 return NULL;
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400510 }
511
512 PyObject *hook = PyObject_GetAttrString(module, attrname);
513 Py_DECREF(module);
514
515 if (hook == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200516 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200517 goto warn;
518 }
519 PyMem_RawFree(envar);
520 return NULL;
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400521 }
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300522 PyMem_RawFree(envar);
Petr Viktorinffd97532020-02-11 17:46:57 +0100523 PyObject *retval = PyObject_Vectorcall(hook, args, nargs, keywords);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400524 Py_DECREF(hook);
525 return retval;
526
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200527 warn:
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400528 /* If any of the imports went wrong, then warn and ignore. */
Victor Stinner838f2642019-06-13 22:41:23 +0200529 _PyErr_Clear(tstate);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400530 int status = PyErr_WarnFormat(
531 PyExc_RuntimeWarning, 0,
532 "Ignoring unimportable $PYTHONBREAKPOINT: \"%s\"", envar);
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300533 PyMem_RawFree(envar);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400534 if (status < 0) {
535 /* Printing the warning raised an exception. */
536 return NULL;
537 }
538 /* The warning was (probably) issued. */
539 Py_RETURN_NONE;
540}
541
542PyDoc_STRVAR(breakpointhook_doc,
543"breakpointhook(*args, **kws)\n"
544"\n"
545"This hook function is called by built-in breakpoint().\n"
546);
547
Victor Stinner13d49ee2010-12-04 17:24:33 +0000548/* Write repr(o) to sys.stdout using sys.stdout.encoding and 'backslashreplace'
549 error handler. If sys.stdout has a buffer attribute, use
550 sys.stdout.buffer.write(encoded), otherwise redecode the string and use
551 sys.stdout.write(redecoded).
552
553 Helper function for sys_displayhook(). */
554static int
Andy Lesterda4d6562020-03-05 22:34:36 -0600555sys_displayhook_unencodable(PyObject *outf, PyObject *o)
Victor Stinner13d49ee2010-12-04 17:24:33 +0000556{
557 PyObject *stdout_encoding = NULL;
558 PyObject *encoded, *escaped_str, *repr_str, *buffer, *result;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +0200559 const char *stdout_encoding_str;
Victor Stinner13d49ee2010-12-04 17:24:33 +0000560 int ret;
561
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200562 stdout_encoding = _PyObject_GetAttrId(outf, &PyId_encoding);
Victor Stinner13d49ee2010-12-04 17:24:33 +0000563 if (stdout_encoding == NULL)
564 goto error;
Serhiy Storchaka06515832016-11-20 09:13:07 +0200565 stdout_encoding_str = PyUnicode_AsUTF8(stdout_encoding);
Victor Stinner13d49ee2010-12-04 17:24:33 +0000566 if (stdout_encoding_str == NULL)
567 goto error;
568
569 repr_str = PyObject_Repr(o);
570 if (repr_str == NULL)
571 goto error;
572 encoded = PyUnicode_AsEncodedString(repr_str,
573 stdout_encoding_str,
574 "backslashreplace");
575 Py_DECREF(repr_str);
576 if (encoded == NULL)
577 goto error;
578
Serhiy Storchaka41c57b32019-09-01 12:03:39 +0300579 if (_PyObject_LookupAttrId(outf, &PyId_buffer, &buffer) < 0) {
580 Py_DECREF(encoded);
581 goto error;
582 }
Victor Stinner13d49ee2010-12-04 17:24:33 +0000583 if (buffer) {
Jeroen Demeyer59ad1102019-07-11 10:59:05 +0200584 result = _PyObject_CallMethodIdOneArg(buffer, &PyId_write, encoded);
Victor Stinner13d49ee2010-12-04 17:24:33 +0000585 Py_DECREF(buffer);
586 Py_DECREF(encoded);
587 if (result == NULL)
588 goto error;
589 Py_DECREF(result);
590 }
591 else {
Victor Stinner13d49ee2010-12-04 17:24:33 +0000592 escaped_str = PyUnicode_FromEncodedObject(encoded,
593 stdout_encoding_str,
594 "strict");
595 Py_DECREF(encoded);
596 if (PyFile_WriteObject(escaped_str, outf, Py_PRINT_RAW) != 0) {
597 Py_DECREF(escaped_str);
598 goto error;
599 }
600 Py_DECREF(escaped_str);
601 }
602 ret = 0;
603 goto finally;
604
605error:
606 ret = -1;
607finally:
608 Py_XDECREF(stdout_encoding);
609 return ret;
610}
611
Tal Einatede0b6f2018-12-31 17:12:08 +0200612/*[clinic input]
613sys.displayhook
614
615 object as o: object
616 /
617
618Print an object to sys.stdout and also save it in builtins._
619[clinic start generated code]*/
620
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000621static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200622sys_displayhook(PyObject *module, PyObject *o)
623/*[clinic end generated code: output=347477d006df92ed input=08ba730166d7ef72]*/
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 PyObject *outf;
Victor Stinnerd02fbb82013-11-06 18:27:13 +0100626 PyObject *builtins;
627 static PyObject *newline = NULL;
Victor Stinner838f2642019-06-13 22:41:23 +0200628 PyThreadState *tstate = _PyThreadState_GET();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000629
Eric Snow3f9eee62017-09-15 16:35:20 -0600630 builtins = _PyImport_GetModuleId(&PyId_builtins);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 if (builtins == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200632 if (!_PyErr_Occurred(tstate)) {
633 _PyErr_SetString(tstate, PyExc_RuntimeError,
634 "lost builtins module");
Stefan Krah027b09c2019-03-25 21:50:58 +0100635 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 return NULL;
637 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600638 Py_DECREF(builtins);
Moshe Zadka03897ea2001-07-23 13:32:43 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 /* Print value except if None */
641 /* After printing, also assign to '_' */
642 /* Before, set '_' to None to avoid recursion */
643 if (o == Py_None) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200644 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200646 if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +0200648 outf = sys_get_object_id(tstate, &PyId_stdout);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 if (outf == NULL || outf == Py_None) {
Victor Stinner838f2642019-06-13 22:41:23 +0200650 _PyErr_SetString(tstate, PyExc_RuntimeError, "lost sys.stdout");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 return NULL;
652 }
Victor Stinner13d49ee2010-12-04 17:24:33 +0000653 if (PyFile_WriteObject(o, outf, 0) != 0) {
Victor Stinner838f2642019-06-13 22:41:23 +0200654 if (_PyErr_ExceptionMatches(tstate, PyExc_UnicodeEncodeError)) {
Andy Lesterda4d6562020-03-05 22:34:36 -0600655 int err;
Victor Stinner13d49ee2010-12-04 17:24:33 +0000656 /* repr(o) is not encodable to sys.stdout.encoding with
657 * sys.stdout.errors error handler (which is probably 'strict') */
Victor Stinner838f2642019-06-13 22:41:23 +0200658 _PyErr_Clear(tstate);
Andy Lesterda4d6562020-03-05 22:34:36 -0600659 err = sys_displayhook_unencodable(outf, o);
Victor Stinner838f2642019-06-13 22:41:23 +0200660 if (err) {
Victor Stinner13d49ee2010-12-04 17:24:33 +0000661 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +0200662 }
Victor Stinner13d49ee2010-12-04 17:24:33 +0000663 }
664 else {
665 return NULL;
666 }
667 }
Victor Stinnerd02fbb82013-11-06 18:27:13 +0100668 if (newline == NULL) {
669 newline = PyUnicode_FromString("\n");
670 if (newline == NULL)
671 return NULL;
672 }
673 if (PyFile_WriteObject(newline, outf, Py_PRINT_RAW) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 return NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200675 if (_PyObject_SetAttrId(builtins, &PyId__, o) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 return NULL;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200677 Py_RETURN_NONE;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000678}
679
Tal Einatede0b6f2018-12-31 17:12:08 +0200680
681/*[clinic input]
682sys.excepthook
683
684 exctype: object
685 value: object
686 traceback: object
687 /
688
689Handle an exception by displaying it with a traceback on sys.stderr.
690[clinic start generated code]*/
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000691
692static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200693sys_excepthook_impl(PyObject *module, PyObject *exctype, PyObject *value,
694 PyObject *traceback)
695/*[clinic end generated code: output=18d99fdda21b6b5e input=ecf606fa826f19d9]*/
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000696{
Tal Einatede0b6f2018-12-31 17:12:08 +0200697 PyErr_Display(exctype, value, traceback);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200698 Py_RETURN_NONE;
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000699}
700
Tal Einatede0b6f2018-12-31 17:12:08 +0200701
702/*[clinic input]
703sys.exc_info
704
705Return current exception information: (type, value, traceback).
706
707Return information about the most recent exception caught by an except
708clause in the current stack frame or in an older stack frame.
709[clinic start generated code]*/
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000710
711static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200712sys_exc_info_impl(PyObject *module)
713/*[clinic end generated code: output=3afd0940cf3a4d30 input=b5c5bf077788a3e5]*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000714{
Victor Stinner50b48572018-11-01 01:51:40 +0100715 _PyErr_StackItem *err_info = _PyErr_GetTopmostException(_PyThreadState_GET());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 return Py_BuildValue(
717 "(OOO)",
Mark Shannonae3087c2017-10-22 22:41:51 +0100718 err_info->exc_type != NULL ? err_info->exc_type : Py_None,
719 err_info->exc_value != NULL ? err_info->exc_value : Py_None,
720 err_info->exc_traceback != NULL ?
721 err_info->exc_traceback : Py_None);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000722}
723
Tal Einatede0b6f2018-12-31 17:12:08 +0200724
725/*[clinic input]
Victor Stinneref9d9b62019-05-22 11:28:22 +0200726sys.unraisablehook
727
728 unraisable: object
729 /
730
731Handle an unraisable exception.
732
733The unraisable argument has the following attributes:
734
735* exc_type: Exception type.
Victor Stinner71c52e32019-05-27 08:57:14 +0200736* exc_value: Exception value, can be None.
737* exc_traceback: Exception traceback, can be None.
738* err_msg: Error message, can be None.
739* object: Object causing the exception, can be None.
Victor Stinneref9d9b62019-05-22 11:28:22 +0200740[clinic start generated code]*/
741
742static PyObject *
743sys_unraisablehook(PyObject *module, PyObject *unraisable)
Victor Stinner71c52e32019-05-27 08:57:14 +0200744/*[clinic end generated code: output=bb92838b32abaa14 input=ec3af148294af8d3]*/
Victor Stinneref9d9b62019-05-22 11:28:22 +0200745{
746 return _PyErr_WriteUnraisableDefaultHook(unraisable);
747}
748
749
750/*[clinic input]
Tal Einatede0b6f2018-12-31 17:12:08 +0200751sys.exit
752
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300753 status: object = None
Tal Einatede0b6f2018-12-31 17:12:08 +0200754 /
755
756Exit the interpreter by raising SystemExit(status).
757
758If the status is omitted or None, it defaults to zero (i.e., success).
759If the status is an integer, it will be used as the system exit status.
760If it is another kind of object, it will be printed and the system
761exit status will be one (i.e., failure).
762[clinic start generated code]*/
Guido van Rossum46d3dc32003-03-01 03:20:41 +0000763
764static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200765sys_exit_impl(PyObject *module, PyObject *status)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300766/*[clinic end generated code: output=13870986c1ab2ec0 input=b86ca9497baa94f2]*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 /* Raise SystemExit so callers may catch it or clean up. */
Victor Stinner838f2642019-06-13 22:41:23 +0200769 PyThreadState *tstate = _PyThreadState_GET();
770 _PyErr_SetObject(tstate, PyExc_SystemExit, status);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000772}
773
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000774
Martin v. Löwis107b7da2001-11-09 20:59:39 +0000775
Tal Einatede0b6f2018-12-31 17:12:08 +0200776/*[clinic input]
777sys.getdefaultencoding
778
779Return the current default encoding used by the Unicode implementation.
780[clinic start generated code]*/
781
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000782static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200783sys_getdefaultencoding_impl(PyObject *module)
784/*[clinic end generated code: output=256d19dfcc0711e6 input=d416856ddbef6909]*/
Fred Drake8b4d01d2000-05-09 19:57:01 +0000785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 return PyUnicode_FromString(PyUnicode_GetDefaultEncoding());
Fred Drake8b4d01d2000-05-09 19:57:01 +0000787}
788
Tal Einatede0b6f2018-12-31 17:12:08 +0200789/*[clinic input]
790sys.getfilesystemencoding
791
792Return the encoding used to convert Unicode filenames to OS filenames.
793[clinic start generated code]*/
Fred Drake8b4d01d2000-05-09 19:57:01 +0000794
795static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200796sys_getfilesystemencoding_impl(PyObject *module)
797/*[clinic end generated code: output=1dc4bdbe9be44aa7 input=8475f8649b8c7d8c]*/
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000798{
Victor Stinner838f2642019-06-13 22:41:23 +0200799 PyThreadState *tstate = _PyThreadState_GET();
800 const PyConfig *config = &tstate->interp->config;
Victor Stinner709d23d2019-05-02 14:56:30 -0400801 return PyUnicode_FromWideChar(config->filesystem_encoding, -1);
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000802}
803
Tal Einatede0b6f2018-12-31 17:12:08 +0200804/*[clinic input]
805sys.getfilesystemencodeerrors
806
807Return the error mode used Unicode to OS filename conversion.
808[clinic start generated code]*/
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000809
Martin v. Löwis04dc25c2008-10-03 16:09:28 +0000810static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200811sys_getfilesystemencodeerrors_impl(PyObject *module)
812/*[clinic end generated code: output=ba77b36bbf7c96f5 input=22a1e8365566f1e5]*/
Steve Dowercc16be82016-09-08 10:35:16 -0700813{
Victor Stinner838f2642019-06-13 22:41:23 +0200814 PyThreadState *tstate = _PyThreadState_GET();
815 const PyConfig *config = &tstate->interp->config;
Victor Stinner709d23d2019-05-02 14:56:30 -0400816 return PyUnicode_FromWideChar(config->filesystem_errors, -1);
Steve Dowercc16be82016-09-08 10:35:16 -0700817}
818
Tal Einatede0b6f2018-12-31 17:12:08 +0200819/*[clinic input]
820sys.intern
821
822 string as s: unicode
823 /
824
825``Intern'' the given string.
826
827This enters the string in the (global) table of interned strings whose
828purpose is to speed up dictionary lookups. Return the string itself or
829the previously interned string object with the same value.
830[clinic start generated code]*/
Steve Dowercc16be82016-09-08 10:35:16 -0700831
832static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200833sys_intern_impl(PyObject *module, PyObject *s)
834/*[clinic end generated code: output=be680c24f5c9e5d6 input=849483c006924e2f]*/
Georg Brandl66a796e2006-12-19 20:50:34 +0000835{
Victor Stinner838f2642019-06-13 22:41:23 +0200836 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 if (PyUnicode_CheckExact(s)) {
838 Py_INCREF(s);
839 PyUnicode_InternInPlace(&s);
840 return s;
841 }
842 else {
Victor Stinner838f2642019-06-13 22:41:23 +0200843 _PyErr_Format(tstate, PyExc_TypeError,
Victor Stinnera102ed72020-02-07 02:24:48 +0100844 "can't intern %.400s", Py_TYPE(s)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 return NULL;
846 }
Georg Brandl66a796e2006-12-19 20:50:34 +0000847}
848
Georg Brandl66a796e2006-12-19 20:50:34 +0000849
Fred Drake5755ce62001-06-27 19:19:46 +0000850/*
851 * Cached interned string objects used for calling the profile and
852 * trace functions. Initialized by trace_init().
853 */
Nick Coghlan5a851672017-09-08 10:14:16 +1000854static PyObject *whatstrings[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
Fred Drake5755ce62001-06-27 19:19:46 +0000855
856static int
857trace_init(void)
858{
Nick Coghlan5a851672017-09-08 10:14:16 +1000859 static const char * const whatnames[8] = {
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200860 "call", "exception", "line", "return",
Nick Coghlan5a851672017-09-08 10:14:16 +1000861 "c_call", "c_exception", "c_return",
862 "opcode"
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200863 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 PyObject *name;
865 int i;
Nick Coghlan5a851672017-09-08 10:14:16 +1000866 for (i = 0; i < 8; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 if (whatstrings[i] == NULL) {
868 name = PyUnicode_InternFromString(whatnames[i]);
869 if (name == NULL)
870 return -1;
871 whatstrings[i] = name;
872 }
873 }
874 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +0000875}
876
877
878static PyObject *
Victor Stinner309d7cc2020-03-13 16:39:12 +0100879call_trampoline(PyThreadState *tstate, PyObject* callback,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 PyFrameObject *frame, int what, PyObject *arg)
Fred Drake5755ce62001-06-27 19:19:46 +0000881{
Victor Stinner78da82b2016-08-20 01:22:57 +0200882 if (PyFrame_FastToLocalsWithError(frame) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 return NULL;
Victor Stinner78da82b2016-08-20 01:22:57 +0200884 }
Victor Stinner41bb43a2013-10-29 01:19:37 +0100885
Victor Stinner838f2642019-06-13 22:41:23 +0200886 PyObject *stack[3];
Victor Stinner78da82b2016-08-20 01:22:57 +0200887 stack[0] = (PyObject *)frame;
888 stack[1] = whatstrings[what];
889 stack[2] = (arg != NULL) ? arg : Py_None;
Fred Drake5755ce62001-06-27 19:19:46 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 /* call the Python-level function */
Victor Stinner309d7cc2020-03-13 16:39:12 +0100892 PyObject *result = _PyObject_FastCallTstate(tstate, callback, stack, 3);
Fred Drake5755ce62001-06-27 19:19:46 +0000893
Victor Stinner78da82b2016-08-20 01:22:57 +0200894 PyFrame_LocalsToFast(frame, 1);
895 if (result == NULL) {
896 PyTraceBack_Here(frame);
897 }
898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 return result;
Fred Drake5755ce62001-06-27 19:19:46 +0000900}
901
902static int
903profile_trampoline(PyObject *self, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 int what, PyObject *arg)
Fred Drake5755ce62001-06-27 19:19:46 +0000905{
Victor Stinner309d7cc2020-03-13 16:39:12 +0100906 if (arg == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 arg = Py_None;
Victor Stinner309d7cc2020-03-13 16:39:12 +0100908 }
909
910 PyThreadState *tstate = _PyThreadState_GET();
911 PyObject *result = call_trampoline(tstate, self, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 if (result == NULL) {
Victor Stinner309d7cc2020-03-13 16:39:12 +0100913 _PyEval_SetProfile(tstate, NULL, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 return -1;
915 }
Victor Stinner309d7cc2020-03-13 16:39:12 +0100916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 Py_DECREF(result);
918 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +0000919}
920
921static int
922trace_trampoline(PyObject *self, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 int what, PyObject *arg)
Fred Drake5755ce62001-06-27 19:19:46 +0000924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 PyObject *callback;
Victor Stinner309d7cc2020-03-13 16:39:12 +0100926 if (what == PyTrace_CALL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 callback = self;
Victor Stinner309d7cc2020-03-13 16:39:12 +0100928 }
929 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 callback = frame->f_trace;
Victor Stinner309d7cc2020-03-13 16:39:12 +0100931 }
932 if (callback == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 return 0;
Victor Stinner309d7cc2020-03-13 16:39:12 +0100934 }
935
936 PyThreadState *tstate = _PyThreadState_GET();
937 PyObject *result = call_trampoline(tstate, callback, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 if (result == NULL) {
Victor Stinner309d7cc2020-03-13 16:39:12 +0100939 _PyEval_SetTrace(tstate, NULL, NULL);
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200940 Py_CLEAR(frame->f_trace);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 return -1;
942 }
Victor Stinner309d7cc2020-03-13 16:39:12 +0100943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 if (result != Py_None) {
Serhiy Storchakaec397562016-04-06 09:50:03 +0300945 Py_XSETREF(frame->f_trace, result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 }
947 else {
948 Py_DECREF(result);
949 }
950 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +0000951}
Fred Draked0838392001-06-16 21:02:31 +0000952
Fred Drake8b4d01d2000-05-09 19:57:01 +0000953static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000954sys_settrace(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000955{
Victor Stinner309d7cc2020-03-13 16:39:12 +0100956 if (trace_init() == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 return NULL;
Victor Stinner309d7cc2020-03-13 16:39:12 +0100958 }
959
960 PyThreadState *tstate = _PyThreadState_GET();
961 if (args == Py_None) {
962 if (_PyEval_SetTrace(tstate, NULL, NULL) < 0) {
963 return NULL;
964 }
965 }
966 else {
967 if (_PyEval_SetTrace(tstate, trace_trampoline, args) < 0) {
968 return NULL;
969 }
970 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200971 Py_RETURN_NONE;
Guido van Rossume2437a11992-03-23 18:20:18 +0000972}
973
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000974PyDoc_STRVAR(settrace_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000975"settrace(function)\n\
976\n\
977Set the global debug tracing function. It will be called on each\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000978function call. See the debugger chapter in the library manual."
979);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000980
Tal Einatede0b6f2018-12-31 17:12:08 +0200981/*[clinic input]
982sys.gettrace
983
984Return the global debug tracing function set with sys.settrace.
985
986See the debugger chapter in the library manual.
987[clinic start generated code]*/
988
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000989static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200990sys_gettrace_impl(PyObject *module)
991/*[clinic end generated code: output=e97e3a4d8c971b6e input=373b51bb2147f4d8]*/
Christian Heimes9bd667a2008-01-20 15:14:11 +0000992{
Victor Stinner50b48572018-11-01 01:51:40 +0100993 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 PyObject *temp = tstate->c_traceobj;
Christian Heimes9bd667a2008-01-20 15:14:11 +0000995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 if (temp == NULL)
997 temp = Py_None;
998 Py_INCREF(temp);
999 return temp;
Christian Heimes9bd667a2008-01-20 15:14:11 +00001000}
1001
Christian Heimes9bd667a2008-01-20 15:14:11 +00001002static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001003sys_setprofile(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +00001004{
Victor Stinner309d7cc2020-03-13 16:39:12 +01001005 if (trace_init() == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 return NULL;
Victor Stinner309d7cc2020-03-13 16:39:12 +01001007 }
1008
1009 PyThreadState *tstate = _PyThreadState_GET();
1010 if (args == Py_None) {
1011 if (_PyEval_SetProfile(tstate, NULL, NULL) < 0) {
1012 return NULL;
1013 }
1014 }
1015 else {
1016 if (_PyEval_SetProfile(tstate, profile_trampoline, args) < 0) {
1017 return NULL;
1018 }
1019 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001020 Py_RETURN_NONE;
Guido van Rossume2437a11992-03-23 18:20:18 +00001021}
1022
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001023PyDoc_STRVAR(setprofile_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001024"setprofile(function)\n\
1025\n\
1026Set the profiling function. It will be called on each function call\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001027and return. See the profiler chapter in the library manual."
1028);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001029
Tal Einatede0b6f2018-12-31 17:12:08 +02001030/*[clinic input]
1031sys.getprofile
1032
1033Return the profiling function set with sys.setprofile.
1034
1035See the profiler chapter in the library manual.
1036[clinic start generated code]*/
1037
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001038static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001039sys_getprofile_impl(PyObject *module)
1040/*[clinic end generated code: output=579b96b373448188 input=1b3209d89a32965d]*/
Christian Heimes9bd667a2008-01-20 15:14:11 +00001041{
Victor Stinner50b48572018-11-01 01:51:40 +01001042 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 PyObject *temp = tstate->c_profileobj;
Christian Heimes9bd667a2008-01-20 15:14:11 +00001044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 if (temp == NULL)
1046 temp = Py_None;
1047 Py_INCREF(temp);
1048 return temp;
Christian Heimes9bd667a2008-01-20 15:14:11 +00001049}
1050
Tim Peterse5e065b2003-07-06 18:36:54 +00001051
Tal Einatede0b6f2018-12-31 17:12:08 +02001052/*[clinic input]
1053sys.setswitchinterval
1054
1055 interval: double
1056 /
1057
1058Set the ideal thread switching delay inside the Python interpreter.
1059
1060The actual frequency of switching threads can be lower if the
1061interpreter executes long sequences of uninterruptible code
1062(this is implementation-specific and workload-dependent).
1063
1064The parameter must represent the desired switching delay in seconds
1065A typical value is 0.005 (5 milliseconds).
1066[clinic start generated code]*/
Tim Peterse5e065b2003-07-06 18:36:54 +00001067
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001068static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001069sys_setswitchinterval_impl(PyObject *module, double interval)
1070/*[clinic end generated code: output=65a19629e5153983 input=561b477134df91d9]*/
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001071{
Victor Stinner838f2642019-06-13 22:41:23 +02001072 PyThreadState *tstate = _PyThreadState_GET();
Tal Einatede0b6f2018-12-31 17:12:08 +02001073 if (interval <= 0.0) {
Victor Stinner838f2642019-06-13 22:41:23 +02001074 _PyErr_SetString(tstate, PyExc_ValueError,
1075 "switch interval must be strictly positive");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 return NULL;
1077 }
Tal Einatede0b6f2018-12-31 17:12:08 +02001078 _PyEval_SetSwitchInterval((unsigned long) (1e6 * interval));
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001079 Py_RETURN_NONE;
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001080}
1081
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001082
Tal Einatede0b6f2018-12-31 17:12:08 +02001083/*[clinic input]
1084sys.getswitchinterval -> double
1085
1086Return the current thread switch interval; see sys.setswitchinterval().
1087[clinic start generated code]*/
1088
1089static double
1090sys_getswitchinterval_impl(PyObject *module)
1091/*[clinic end generated code: output=a38c277c85b5096d input=bdf9d39c0ebbbb6f]*/
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001092{
Tal Einatede0b6f2018-12-31 17:12:08 +02001093 return 1e-6 * _PyEval_GetSwitchInterval();
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001094}
1095
Tal Einatede0b6f2018-12-31 17:12:08 +02001096/*[clinic input]
1097sys.setrecursionlimit
1098
1099 limit as new_limit: int
1100 /
1101
1102Set the maximum depth of the Python interpreter stack to n.
1103
1104This limit prevents infinite recursion from causing an overflow of the C
1105stack and crashing Python. The highest possible limit is platform-
1106dependent.
1107[clinic start generated code]*/
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001108
Tim Peterse5e065b2003-07-06 18:36:54 +00001109static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001110sys_setrecursionlimit_impl(PyObject *module, int new_limit)
1111/*[clinic end generated code: output=35e1c64754800ace input=b0f7a23393924af3]*/
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001112{
Tal Einatede0b6f2018-12-31 17:12:08 +02001113 int mark;
Victor Stinner838f2642019-06-13 22:41:23 +02001114 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner50856d52015-10-13 00:11:21 +02001115
Victor Stinner50856d52015-10-13 00:11:21 +02001116 if (new_limit < 1) {
Victor Stinner838f2642019-06-13 22:41:23 +02001117 _PyErr_SetString(tstate, PyExc_ValueError,
1118 "recursion limit must be greater or equal than 1");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 return NULL;
1120 }
Victor Stinner50856d52015-10-13 00:11:21 +02001121
1122 /* Issue #25274: When the recursion depth hits the recursion limit in
1123 _Py_CheckRecursiveCall(), the overflowed flag of the thread state is
1124 set to 1 and a RecursionError is raised. The overflowed flag is reset
1125 to 0 when the recursion depth goes below the low-water mark: see
1126 Py_LeaveRecursiveCall().
1127
1128 Reject too low new limit if the current recursion depth is higher than
1129 the new low-water mark. Otherwise it may not be possible anymore to
1130 reset the overflowed flag to 0. */
1131 mark = _Py_RecursionLimitLowerWaterMark(new_limit);
Victor Stinner50856d52015-10-13 00:11:21 +02001132 if (tstate->recursion_depth >= mark) {
Victor Stinner838f2642019-06-13 22:41:23 +02001133 _PyErr_Format(tstate, PyExc_RecursionError,
1134 "cannot set the recursion limit to %i at "
1135 "the recursion depth %i: the limit is too low",
1136 new_limit, tstate->recursion_depth);
Victor Stinner50856d52015-10-13 00:11:21 +02001137 return NULL;
1138 }
1139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 Py_SetRecursionLimit(new_limit);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001141 Py_RETURN_NONE;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001142}
1143
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001144/*[clinic input]
1145sys.set_coroutine_origin_tracking_depth
1146
1147 depth: int
1148
1149Enable or disable origin tracking for coroutine objects in this thread.
1150
Tal Einatede0b6f2018-12-31 17:12:08 +02001151Coroutine objects will track 'depth' frames of traceback information
1152about where they came from, available in their cr_origin attribute.
1153
1154Set a depth of 0 to disable.
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001155[clinic start generated code]*/
1156
1157static PyObject *
1158sys_set_coroutine_origin_tracking_depth_impl(PyObject *module, int depth)
Tal Einatede0b6f2018-12-31 17:12:08 +02001159/*[clinic end generated code: output=0a2123c1cc6759c5 input=a1d0a05f89d2c426]*/
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001160{
Victor Stinner838f2642019-06-13 22:41:23 +02001161 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001162 if (depth < 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02001163 _PyErr_SetString(tstate, PyExc_ValueError, "depth must be >= 0");
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001164 return NULL;
1165 }
Victor Stinner838f2642019-06-13 22:41:23 +02001166 _PyEval_SetCoroutineOriginTrackingDepth(tstate, depth);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001167 Py_RETURN_NONE;
1168}
1169
1170/*[clinic input]
1171sys.get_coroutine_origin_tracking_depth -> int
1172
1173Check status of origin tracking for coroutine objects in this thread.
1174[clinic start generated code]*/
1175
1176static int
1177sys_get_coroutine_origin_tracking_depth_impl(PyObject *module)
1178/*[clinic end generated code: output=3699f7be95a3afb8 input=335266a71205b61a]*/
1179{
1180 return _PyEval_GetCoroutineOriginTrackingDepth();
1181}
1182
Yury Selivanoveb636452016-09-08 22:01:51 -07001183static PyTypeObject AsyncGenHooksType;
1184
1185PyDoc_STRVAR(asyncgen_hooks_doc,
1186"asyncgen_hooks\n\
1187\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07001188A named tuple providing information about asynchronous\n\
Yury Selivanoveb636452016-09-08 22:01:51 -07001189generators hooks. The attributes are read only.");
1190
1191static PyStructSequence_Field asyncgen_hooks_fields[] = {
1192 {"firstiter", "Hook to intercept first iteration"},
1193 {"finalizer", "Hook to intercept finalization"},
1194 {0}
1195};
1196
1197static PyStructSequence_Desc asyncgen_hooks_desc = {
1198 "asyncgen_hooks", /* name */
1199 asyncgen_hooks_doc, /* doc */
1200 asyncgen_hooks_fields , /* fields */
1201 2
1202};
1203
Yury Selivanoveb636452016-09-08 22:01:51 -07001204static PyObject *
1205sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
1206{
1207 static char *keywords[] = {"firstiter", "finalizer", NULL};
1208 PyObject *firstiter = NULL;
1209 PyObject *finalizer = NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02001210 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07001211
1212 if (!PyArg_ParseTupleAndKeywords(
1213 args, kw, "|OO", keywords,
1214 &firstiter, &finalizer)) {
1215 return NULL;
1216 }
1217
1218 if (finalizer && finalizer != Py_None) {
1219 if (!PyCallable_Check(finalizer)) {
Victor Stinner838f2642019-06-13 22:41:23 +02001220 _PyErr_Format(tstate, PyExc_TypeError,
1221 "callable finalizer expected, got %.50s",
1222 Py_TYPE(finalizer)->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07001223 return NULL;
1224 }
1225 _PyEval_SetAsyncGenFinalizer(finalizer);
1226 }
1227 else if (finalizer == Py_None) {
1228 _PyEval_SetAsyncGenFinalizer(NULL);
1229 }
1230
1231 if (firstiter && firstiter != Py_None) {
1232 if (!PyCallable_Check(firstiter)) {
Victor Stinner838f2642019-06-13 22:41:23 +02001233 _PyErr_Format(tstate, PyExc_TypeError,
1234 "callable firstiter expected, got %.50s",
1235 Py_TYPE(firstiter)->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07001236 return NULL;
1237 }
1238 _PyEval_SetAsyncGenFirstiter(firstiter);
1239 }
1240 else if (firstiter == Py_None) {
1241 _PyEval_SetAsyncGenFirstiter(NULL);
1242 }
1243
1244 Py_RETURN_NONE;
1245}
1246
1247PyDoc_STRVAR(set_asyncgen_hooks_doc,
Tal Einatede0b6f2018-12-31 17:12:08 +02001248"set_asyncgen_hooks(* [, firstiter] [, finalizer])\n\
Yury Selivanoveb636452016-09-08 22:01:51 -07001249\n\
1250Set a finalizer for async generators objects."
1251);
1252
Tal Einatede0b6f2018-12-31 17:12:08 +02001253/*[clinic input]
1254sys.get_asyncgen_hooks
1255
1256Return the installed asynchronous generators hooks.
1257
1258This returns a namedtuple of the form (firstiter, finalizer).
1259[clinic start generated code]*/
1260
Yury Selivanoveb636452016-09-08 22:01:51 -07001261static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001262sys_get_asyncgen_hooks_impl(PyObject *module)
1263/*[clinic end generated code: output=53a253707146f6cf input=3676b9ea62b14625]*/
Yury Selivanoveb636452016-09-08 22:01:51 -07001264{
1265 PyObject *res;
1266 PyObject *firstiter = _PyEval_GetAsyncGenFirstiter();
1267 PyObject *finalizer = _PyEval_GetAsyncGenFinalizer();
1268
1269 res = PyStructSequence_New(&AsyncGenHooksType);
1270 if (res == NULL) {
1271 return NULL;
1272 }
1273
1274 if (firstiter == NULL) {
1275 firstiter = Py_None;
1276 }
1277
1278 if (finalizer == NULL) {
1279 finalizer = Py_None;
1280 }
1281
1282 Py_INCREF(firstiter);
1283 PyStructSequence_SET_ITEM(res, 0, firstiter);
1284
1285 Py_INCREF(finalizer);
1286 PyStructSequence_SET_ITEM(res, 1, finalizer);
1287
1288 return res;
1289}
1290
Yury Selivanoveb636452016-09-08 22:01:51 -07001291
Mark Dickinsondc787d22010-05-23 13:33:13 +00001292static PyTypeObject Hash_InfoType;
1293
1294PyDoc_STRVAR(hash_info_doc,
1295"hash_info\n\
1296\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07001297A named tuple providing parameters used for computing\n\
Christian Heimes985ecdc2013-11-20 11:46:18 +01001298hashes. The attributes are read only.");
Mark Dickinsondc787d22010-05-23 13:33:13 +00001299
1300static PyStructSequence_Field hash_info_fields[] = {
1301 {"width", "width of the type used for hashing, in bits"},
1302 {"modulus", "prime number giving the modulus on which the hash "
1303 "function is based"},
1304 {"inf", "value to be used for hash of a positive infinity"},
1305 {"nan", "value to be used for hash of a nan"},
1306 {"imag", "multiplier used for the imaginary part of a complex number"},
Christian Heimes985ecdc2013-11-20 11:46:18 +01001307 {"algorithm", "name of the algorithm for hashing of str, bytes and "
1308 "memoryviews"},
1309 {"hash_bits", "internal output size of hash algorithm"},
1310 {"seed_bits", "seed size of hash algorithm"},
1311 {"cutoff", "small string optimization cutoff"},
Mark Dickinsondc787d22010-05-23 13:33:13 +00001312 {NULL, NULL}
1313};
1314
1315static PyStructSequence_Desc hash_info_desc = {
1316 "sys.hash_info",
1317 hash_info_doc,
1318 hash_info_fields,
Christian Heimes985ecdc2013-11-20 11:46:18 +01001319 9,
Mark Dickinsondc787d22010-05-23 13:33:13 +00001320};
1321
Matthias Klosed885e952010-07-06 10:53:30 +00001322static PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +02001323get_hash_info(PyThreadState *tstate)
Mark Dickinsondc787d22010-05-23 13:33:13 +00001324{
1325 PyObject *hash_info;
1326 int field = 0;
Christian Heimes985ecdc2013-11-20 11:46:18 +01001327 PyHash_FuncDef *hashfunc;
Mark Dickinsondc787d22010-05-23 13:33:13 +00001328 hash_info = PyStructSequence_New(&Hash_InfoType);
1329 if (hash_info == NULL)
1330 return NULL;
Christian Heimes985ecdc2013-11-20 11:46:18 +01001331 hashfunc = PyHash_GetFuncDef();
Mark Dickinsondc787d22010-05-23 13:33:13 +00001332 PyStructSequence_SET_ITEM(hash_info, field++,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001333 PyLong_FromLong(8*sizeof(Py_hash_t)));
Mark Dickinsondc787d22010-05-23 13:33:13 +00001334 PyStructSequence_SET_ITEM(hash_info, field++,
Benjamin Peterson8035bc52010-10-23 16:20:50 +00001335 PyLong_FromSsize_t(_PyHASH_MODULUS));
Mark Dickinsondc787d22010-05-23 13:33:13 +00001336 PyStructSequence_SET_ITEM(hash_info, field++,
1337 PyLong_FromLong(_PyHASH_INF));
1338 PyStructSequence_SET_ITEM(hash_info, field++,
1339 PyLong_FromLong(_PyHASH_NAN));
1340 PyStructSequence_SET_ITEM(hash_info, field++,
1341 PyLong_FromLong(_PyHASH_IMAG));
Christian Heimes985ecdc2013-11-20 11:46:18 +01001342 PyStructSequence_SET_ITEM(hash_info, field++,
1343 PyUnicode_FromString(hashfunc->name));
1344 PyStructSequence_SET_ITEM(hash_info, field++,
1345 PyLong_FromLong(hashfunc->hash_bits));
1346 PyStructSequence_SET_ITEM(hash_info, field++,
1347 PyLong_FromLong(hashfunc->seed_bits));
1348 PyStructSequence_SET_ITEM(hash_info, field++,
1349 PyLong_FromLong(Py_HASH_CUTOFF));
Victor Stinner838f2642019-06-13 22:41:23 +02001350 if (_PyErr_Occurred(tstate)) {
Mark Dickinsondc787d22010-05-23 13:33:13 +00001351 Py_CLEAR(hash_info);
1352 return NULL;
1353 }
1354 return hash_info;
1355}
Tal Einatede0b6f2018-12-31 17:12:08 +02001356/*[clinic input]
1357sys.getrecursionlimit
Mark Dickinsondc787d22010-05-23 13:33:13 +00001358
Tal Einatede0b6f2018-12-31 17:12:08 +02001359Return the current value of the recursion limit.
Mark Dickinsondc787d22010-05-23 13:33:13 +00001360
Tal Einatede0b6f2018-12-31 17:12:08 +02001361The recursion limit is the maximum depth of the Python interpreter
1362stack. This limit prevents infinite recursion from causing an overflow
1363of the C stack and crashing Python.
1364[clinic start generated code]*/
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001365
1366static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001367sys_getrecursionlimit_impl(PyObject *module)
1368/*[clinic end generated code: output=d571fb6b4549ef2e input=1c6129fd2efaeea8]*/
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001369{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 return PyLong_FromLong(Py_GetRecursionLimit());
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001371}
1372
Mark Hammond8696ebc2002-10-08 02:44:31 +00001373#ifdef MS_WINDOWS
Mark Hammond8696ebc2002-10-08 02:44:31 +00001374
Eric Smithf7bb5782010-01-27 00:44:57 +00001375static PyTypeObject WindowsVersionType = {0, 0, 0, 0, 0, 0};
1376
1377static PyStructSequence_Field windows_version_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 {"major", "Major version number"},
1379 {"minor", "Minor version number"},
1380 {"build", "Build number"},
1381 {"platform", "Operating system platform"},
1382 {"service_pack", "Latest Service Pack installed on the system"},
1383 {"service_pack_major", "Service Pack major version number"},
1384 {"service_pack_minor", "Service Pack minor version number"},
1385 {"suite_mask", "Bit mask identifying available product suites"},
1386 {"product_type", "System product type"},
Steve Dower74f4af72016-09-17 17:27:48 -07001387 {"platform_version", "Diagnostic version number"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 {0}
Eric Smithf7bb5782010-01-27 00:44:57 +00001389};
1390
1391static PyStructSequence_Desc windows_version_desc = {
Tal Einatede0b6f2018-12-31 17:12:08 +02001392 "sys.getwindowsversion", /* name */
1393 sys_getwindowsversion__doc__, /* doc */
1394 windows_version_fields, /* fields */
1395 5 /* For backward compatibility,
1396 only the first 5 items are accessible
1397 via indexing, the rest are name only */
Eric Smithf7bb5782010-01-27 00:44:57 +00001398};
1399
Steve Dower3e96f322015-03-02 08:01:10 -08001400/* Disable deprecation warnings about GetVersionEx as the result is
1401 being passed straight through to the caller, who is responsible for
1402 using it correctly. */
1403#pragma warning(push)
1404#pragma warning(disable:4996)
1405
Tal Einatede0b6f2018-12-31 17:12:08 +02001406/*[clinic input]
1407sys.getwindowsversion
1408
1409Return info about the running version of Windows as a named tuple.
1410
1411The members are named: major, minor, build, platform, service_pack,
1412service_pack_major, service_pack_minor, suite_mask, product_type and
1413platform_version. For backward compatibility, only the first 5 items
1414are available by indexing. All elements are numbers, except
1415service_pack and platform_type which are strings, and platform_version
1416which is a 3-tuple. Platform is always 2. Product_type may be 1 for a
1417workstation, 2 for a domain controller, 3 for a server.
1418Platform_version is a 3-tuple containing a version number that is
1419intended for identifying the OS rather than feature detection.
1420[clinic start generated code]*/
1421
Mark Hammond8696ebc2002-10-08 02:44:31 +00001422static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001423sys_getwindowsversion_impl(PyObject *module)
1424/*[clinic end generated code: output=1ec063280b932857 input=73a228a328fee63a]*/
Mark Hammond8696ebc2002-10-08 02:44:31 +00001425{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 PyObject *version;
1427 int pos = 0;
Minmin Gong8ebc6452019-02-02 20:26:55 -08001428 OSVERSIONINFOEXW ver;
Steve Dower74f4af72016-09-17 17:27:48 -07001429 DWORD realMajor, realMinor, realBuild;
1430 HANDLE hKernel32;
1431 wchar_t kernel32_path[MAX_PATH];
1432 LPVOID verblock;
1433 DWORD verblock_size;
Victor Stinner838f2642019-06-13 22:41:23 +02001434 PyThreadState *tstate = _PyThreadState_GET();
Steve Dower74f4af72016-09-17 17:27:48 -07001435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 ver.dwOSVersionInfoSize = sizeof(ver);
Minmin Gong8ebc6452019-02-02 20:26:55 -08001437 if (!GetVersionExW((OSVERSIONINFOW*) &ver))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 return PyErr_SetFromWindowsErr(0);
Eric Smithf7bb5782010-01-27 00:44:57 +00001439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 version = PyStructSequence_New(&WindowsVersionType);
1441 if (version == NULL)
1442 return NULL;
Eric Smithf7bb5782010-01-27 00:44:57 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMajorVersion));
1445 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMinorVersion));
1446 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwBuildNumber));
1447 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwPlatformId));
Minmin Gong8ebc6452019-02-02 20:26:55 -08001448 PyStructSequence_SET_ITEM(version, pos++, PyUnicode_FromWideChar(ver.szCSDVersion, -1));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMajor));
1450 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMinor));
1451 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wSuiteMask));
1452 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wProductType));
Eric Smithf7bb5782010-01-27 00:44:57 +00001453
Steve Dower74f4af72016-09-17 17:27:48 -07001454 realMajor = ver.dwMajorVersion;
1455 realMinor = ver.dwMinorVersion;
1456 realBuild = ver.dwBuildNumber;
1457
1458 // GetVersion will lie if we are running in a compatibility mode.
1459 // We need to read the version info from a system file resource
1460 // to accurately identify the OS version. If we fail for any reason,
1461 // just return whatever GetVersion said.
Tony Roberts4860f012019-02-02 18:16:42 +01001462 Py_BEGIN_ALLOW_THREADS
Steve Dower74f4af72016-09-17 17:27:48 -07001463 hKernel32 = GetModuleHandleW(L"kernel32.dll");
Tony Roberts4860f012019-02-02 18:16:42 +01001464 Py_END_ALLOW_THREADS
Steve Dower74f4af72016-09-17 17:27:48 -07001465 if (hKernel32 && GetModuleFileNameW(hKernel32, kernel32_path, MAX_PATH) &&
1466 (verblock_size = GetFileVersionInfoSizeW(kernel32_path, NULL)) &&
1467 (verblock = PyMem_RawMalloc(verblock_size))) {
1468 VS_FIXEDFILEINFO *ffi;
1469 UINT ffi_len;
1470
1471 if (GetFileVersionInfoW(kernel32_path, 0, verblock_size, verblock) &&
1472 VerQueryValueW(verblock, L"", (LPVOID)&ffi, &ffi_len)) {
1473 realMajor = HIWORD(ffi->dwProductVersionMS);
1474 realMinor = LOWORD(ffi->dwProductVersionMS);
1475 realBuild = HIWORD(ffi->dwProductVersionLS);
1476 }
1477 PyMem_RawFree(verblock);
1478 }
Segev Finer48fb7662017-06-04 20:52:27 +03001479 PyStructSequence_SET_ITEM(version, pos++, Py_BuildValue("(kkk)",
1480 realMajor,
1481 realMinor,
1482 realBuild
Steve Dower74f4af72016-09-17 17:27:48 -07001483 ));
1484
Victor Stinner838f2642019-06-13 22:41:23 +02001485 if (_PyErr_Occurred(tstate)) {
Serhiy Storchaka48d761e2013-12-17 15:11:24 +02001486 Py_DECREF(version);
1487 return NULL;
1488 }
Steve Dower74f4af72016-09-17 17:27:48 -07001489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 return version;
Mark Hammond8696ebc2002-10-08 02:44:31 +00001491}
1492
Steve Dower3e96f322015-03-02 08:01:10 -08001493#pragma warning(pop)
1494
Tal Einatede0b6f2018-12-31 17:12:08 +02001495/*[clinic input]
1496sys._enablelegacywindowsfsencoding
1497
1498Changes the default filesystem encoding to mbcs:replace.
1499
1500This is done for consistency with earlier versions of Python. See PEP
1501529 for more information.
1502
1503This is equivalent to defining the PYTHONLEGACYWINDOWSFSENCODING
1504environment variable before launching Python.
1505[clinic start generated code]*/
Steve Dowercc16be82016-09-08 10:35:16 -07001506
1507static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001508sys__enablelegacywindowsfsencoding_impl(PyObject *module)
1509/*[clinic end generated code: output=f5c3855b45e24fe9 input=2bfa931a20704492]*/
Steve Dowercc16be82016-09-08 10:35:16 -07001510{
Victor Stinner709d23d2019-05-02 14:56:30 -04001511 if (_PyUnicode_EnableLegacyWindowsFSEncoding() < 0) {
Victor Stinnerb2457ef2018-08-29 13:25:36 +02001512 return NULL;
1513 }
Steve Dowercc16be82016-09-08 10:35:16 -07001514 Py_RETURN_NONE;
1515}
1516
Mark Hammond8696ebc2002-10-08 02:44:31 +00001517#endif /* MS_WINDOWS */
1518
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001519#ifdef HAVE_DLOPEN
Tal Einatede0b6f2018-12-31 17:12:08 +02001520
1521/*[clinic input]
1522sys.setdlopenflags
1523
1524 flags as new_val: int
1525 /
1526
1527Set the flags used by the interpreter for dlopen calls.
1528
1529This is used, for example, when the interpreter loads extension
1530modules. Among other things, this will enable a lazy resolving of
1531symbols when importing a module, if called as sys.setdlopenflags(0).
1532To share symbols across extension modules, call as
1533sys.setdlopenflags(os.RTLD_GLOBAL). Symbolic names for the flag
1534modules can be found in the os module (RTLD_xxx constants, e.g.
1535os.RTLD_LAZY).
1536[clinic start generated code]*/
1537
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001538static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001539sys_setdlopenflags_impl(PyObject *module, int new_val)
1540/*[clinic end generated code: output=ec918b7fe0a37281 input=4c838211e857a77f]*/
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001541{
Victor Stinner838f2642019-06-13 22:41:23 +02001542 PyThreadState *tstate = _PyThreadState_GET();
1543 tstate->interp->dlopenflags = new_val;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001544 Py_RETURN_NONE;
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001545}
1546
Tal Einatede0b6f2018-12-31 17:12:08 +02001547
1548/*[clinic input]
1549sys.getdlopenflags
1550
1551Return the current value of the flags that are used for dlopen calls.
1552
1553The flag constants are defined in the os module.
1554[clinic start generated code]*/
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001555
1556static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001557sys_getdlopenflags_impl(PyObject *module)
1558/*[clinic end generated code: output=e92cd1bc5005da6e input=dc4ea0899c53b4b6]*/
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001559{
Victor Stinner838f2642019-06-13 22:41:23 +02001560 PyThreadState *tstate = _PyThreadState_GET();
1561 return PyLong_FromLong(tstate->interp->dlopenflags);
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001562}
1563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564#endif /* HAVE_DLOPEN */
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001565
Guido van Rossum14b4adb1992-09-03 20:25:30 +00001566#ifdef USE_MALLOPT
1567/* Link with -lmalloc (or -lmpc) on an SGI */
1568#include <malloc.h>
1569
Tal Einatede0b6f2018-12-31 17:12:08 +02001570/*[clinic input]
1571sys.mdebug
1572
1573 flag: int
1574 /
1575[clinic start generated code]*/
1576
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001577static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001578sys_mdebug_impl(PyObject *module, int flag)
1579/*[clinic end generated code: output=5431d545847c3637 input=151d150ae1636f8a]*/
Guido van Rossum14b4adb1992-09-03 20:25:30 +00001580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 int flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 mallopt(M_DEBUG, flag);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001583 Py_RETURN_NONE;
Guido van Rossum14b4adb1992-09-03 20:25:30 +00001584}
1585#endif /* USE_MALLOPT */
1586
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001587size_t
1588_PySys_GetSizeOf(PyObject *o)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 PyObject *res = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 PyObject *method;
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001592 Py_ssize_t size;
Victor Stinner838f2642019-06-13 22:41:23 +02001593 PyThreadState *tstate = _PyThreadState_GET();
Benjamin Petersona5758c02009-05-09 18:15:04 +00001594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 /* Make sure the type is initialized. float gets initialized late */
Victor Stinner838f2642019-06-13 22:41:23 +02001596 if (PyType_Ready(Py_TYPE(o)) < 0) {
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001597 return (size_t)-1;
Victor Stinner838f2642019-06-13 22:41:23 +02001598 }
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00001599
Benjamin Petersonce798522012-01-22 11:24:29 -05001600 method = _PyObject_LookupSpecial(o, &PyId___sizeof__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 if (method == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +02001602 if (!_PyErr_Occurred(tstate)) {
1603 _PyErr_Format(tstate, PyExc_TypeError,
1604 "Type %.100s doesn't define __sizeof__",
1605 Py_TYPE(o)->tp_name);
1606 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 }
1608 else {
Victor Stinnerf17c3de2016-12-06 18:46:19 +01001609 res = _PyObject_CallNoArg(method);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 Py_DECREF(method);
1611 }
1612
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001613 if (res == NULL)
1614 return (size_t)-1;
1615
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001616 size = PyLong_AsSsize_t(res);
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001617 Py_DECREF(res);
Victor Stinner838f2642019-06-13 22:41:23 +02001618 if (size == -1 && _PyErr_Occurred(tstate))
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001619 return (size_t)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001621 if (size < 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02001622 _PyErr_SetString(tstate, PyExc_ValueError,
1623 "__sizeof__() should return >= 0");
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001624 return (size_t)-1;
1625 }
1626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 /* add gc_head size */
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001628 if (PyObject_IS_GC(o))
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001629 return ((size_t)size) + sizeof(PyGC_Head);
1630 return (size_t)size;
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001631}
1632
1633static PyObject *
1634sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
1635{
1636 static char *kwlist[] = {"object", "default", 0};
1637 size_t size;
1638 PyObject *o, *dflt = NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02001639 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001640
1641 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",
Victor Stinner838f2642019-06-13 22:41:23 +02001642 kwlist, &o, &dflt)) {
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001643 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02001644 }
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001645
1646 size = _PySys_GetSizeOf(o);
1647
Victor Stinner838f2642019-06-13 22:41:23 +02001648 if (size == (size_t)-1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001649 /* Has a default value been given */
Victor Stinner838f2642019-06-13 22:41:23 +02001650 if (dflt != NULL && _PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
1651 _PyErr_Clear(tstate);
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001652 Py_INCREF(dflt);
1653 return dflt;
1654 }
1655 else
1656 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 }
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001658
1659 return PyLong_FromSize_t(size);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001660}
1661
1662PyDoc_STRVAR(getsizeof_doc,
Tal Einatede0b6f2018-12-31 17:12:08 +02001663"getsizeof(object [, default]) -> int\n\
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001664\n\
1665Return the size of object in bytes.");
1666
Tal Einatede0b6f2018-12-31 17:12:08 +02001667/*[clinic input]
1668sys.getrefcount -> Py_ssize_t
1669
1670 object: object
1671 /
1672
1673Return the reference count of object.
1674
1675The count returned is generally one higher than you might expect,
1676because it includes the (temporary) reference as an argument to
1677getrefcount().
1678[clinic start generated code]*/
1679
1680static Py_ssize_t
1681sys_getrefcount_impl(PyObject *module, PyObject *object)
1682/*[clinic end generated code: output=5fd477f2264b85b2 input=bf474efd50a21535]*/
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001683{
Victor Stinnera93c51e2020-02-07 00:38:59 +01001684 return Py_REFCNT(object);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001685}
1686
Tim Peters4be93d02002-07-07 19:59:50 +00001687#ifdef Py_REF_DEBUG
Tal Einatede0b6f2018-12-31 17:12:08 +02001688/*[clinic input]
1689sys.gettotalrefcount -> Py_ssize_t
1690[clinic start generated code]*/
1691
1692static Py_ssize_t
1693sys_gettotalrefcount_impl(PyObject *module)
1694/*[clinic end generated code: output=4103886cf17c25bc input=53b744faa5d2e4f6]*/
Mark Hammond440d8982000-06-20 08:12:48 +00001695{
Tal Einatede0b6f2018-12-31 17:12:08 +02001696 return _Py_GetRefTotal();
Mark Hammond440d8982000-06-20 08:12:48 +00001697}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001698#endif /* Py_REF_DEBUG */
Mark Hammond440d8982000-06-20 08:12:48 +00001699
Tal Einatede0b6f2018-12-31 17:12:08 +02001700/*[clinic input]
1701sys.getallocatedblocks -> Py_ssize_t
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001702
Tal Einatede0b6f2018-12-31 17:12:08 +02001703Return the number of memory blocks currently allocated.
1704[clinic start generated code]*/
1705
1706static Py_ssize_t
1707sys_getallocatedblocks_impl(PyObject *module)
1708/*[clinic end generated code: output=f0c4e873f0b6dcf7 input=dab13ee346a0673e]*/
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001709{
Tal Einatede0b6f2018-12-31 17:12:08 +02001710 return _Py_GetAllocatedBlocks();
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001711}
1712
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001713
Tal Einatede0b6f2018-12-31 17:12:08 +02001714/*[clinic input]
1715sys._getframe
1716
1717 depth: int = 0
1718 /
1719
1720Return a frame object from the call stack.
1721
1722If optional integer depth is given, return the frame object that many
1723calls below the top of the stack. If that is deeper than the call
1724stack, ValueError is raised. The default for depth is zero, returning
1725the frame at the top of the call stack.
1726
1727This function should be used for internal and specialized purposes
1728only.
1729[clinic start generated code]*/
Barry Warsawb6a54d22000-12-06 21:47:46 +00001730
1731static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001732sys__getframe_impl(PyObject *module, int depth)
1733/*[clinic end generated code: output=d438776c04d59804 input=c1be8a6464b11ee5]*/
Barry Warsawb6a54d22000-12-06 21:47:46 +00001734{
Victor Stinner838f2642019-06-13 22:41:23 +02001735 PyThreadState *tstate = _PyThreadState_GET();
1736 PyFrameObject *f = tstate->frame;
Barry Warsawb6a54d22000-12-06 21:47:46 +00001737
Steve Dowerb82e17e2019-05-23 08:45:22 -07001738 if (PySys_Audit("sys._getframe", "O", f) < 0) {
1739 return NULL;
1740 }
1741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 while (depth > 0 && f != NULL) {
1743 f = f->f_back;
1744 --depth;
1745 }
1746 if (f == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +02001747 _PyErr_SetString(tstate, PyExc_ValueError,
1748 "call stack is not deep enough");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 return NULL;
1750 }
1751 Py_INCREF(f);
1752 return (PyObject*)f;
Barry Warsawb6a54d22000-12-06 21:47:46 +00001753}
1754
Tal Einatede0b6f2018-12-31 17:12:08 +02001755/*[clinic input]
1756sys._current_frames
1757
1758Return a dict mapping each thread's thread id to its current stack frame.
1759
1760This function should be used for specialized purposes only.
1761[clinic start generated code]*/
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001762
1763static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001764sys__current_frames_impl(PyObject *module)
1765/*[clinic end generated code: output=d2a41ac0a0a3809a input=2a9049c5f5033691]*/
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001766{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 return _PyThread_CurrentFrames();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001768}
1769
Tal Einatede0b6f2018-12-31 17:12:08 +02001770/*[clinic input]
1771sys.call_tracing
1772
1773 func: object
1774 args as funcargs: object(subclass_of='&PyTuple_Type')
1775 /
1776
1777Call func(*args), while tracing is enabled.
1778
1779The tracing state is saved, and restored afterwards. This is intended
1780to be called from a debugger from a checkpoint, to recursively debug
1781some other code.
1782[clinic start generated code]*/
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001783
1784static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001785sys_call_tracing_impl(PyObject *module, PyObject *func, PyObject *funcargs)
1786/*[clinic end generated code: output=7e4999853cd4e5a6 input=5102e8b11049f92f]*/
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 return _PyEval_CallTracing(func, funcargs);
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001789}
1790
Victor Stinner048afd92016-11-28 11:59:04 +01001791
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001792#ifdef __cplusplus
1793extern "C" {
1794#endif
1795
Tal Einatede0b6f2018-12-31 17:12:08 +02001796/*[clinic input]
1797sys._debugmallocstats
1798
1799Print summary info to stderr about the state of pymalloc's structures.
1800
1801In Py_DEBUG mode, also perform some expensive internal consistency
1802checks.
1803[clinic start generated code]*/
1804
David Malcolm49526f42012-06-22 14:55:41 -04001805static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001806sys__debugmallocstats_impl(PyObject *module)
1807/*[clinic end generated code: output=ec3565f8c7cee46a input=33c0c9c416f98424]*/
David Malcolm49526f42012-06-22 14:55:41 -04001808{
1809#ifdef WITH_PYMALLOC
Victor Stinner6bf992a2017-12-06 17:26:10 +01001810 if (_PyObject_DebugMallocStats(stderr)) {
Victor Stinner34be8072016-03-14 12:04:26 +01001811 fputc('\n', stderr);
1812 }
David Malcolm49526f42012-06-22 14:55:41 -04001813#endif
1814 _PyObject_DebugTypeStats(stderr);
1815
1816 Py_RETURN_NONE;
1817}
David Malcolm49526f42012-06-22 14:55:41 -04001818
Guido van Rossum7f3f2c11996-05-23 22:45:41 +00001819#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +00001820/* Defined in objects.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001821extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001822#endif
Guido van Rossumded690f1996-05-24 20:48:31 +00001823
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001824#ifdef DYNAMIC_EXECUTION_PROFILE
1825/* Defined in ceval.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001826extern PyObject *_Py_GetDXProfile(PyObject *, PyObject *);
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001827#endif
1828
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001829#ifdef __cplusplus
1830}
1831#endif
1832
Tal Einatede0b6f2018-12-31 17:12:08 +02001833
1834/*[clinic input]
1835sys._clear_type_cache
1836
1837Clear the internal type lookup cache.
1838[clinic start generated code]*/
1839
Christian Heimes15ebc882008-02-04 18:48:49 +00001840static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001841sys__clear_type_cache_impl(PyObject *module)
1842/*[clinic end generated code: output=20e48ca54a6f6971 input=127f3e04a8d9b555]*/
Christian Heimes15ebc882008-02-04 18:48:49 +00001843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 PyType_ClearCache();
1845 Py_RETURN_NONE;
Christian Heimes15ebc882008-02-04 18:48:49 +00001846}
1847
Tal Einatede0b6f2018-12-31 17:12:08 +02001848/*[clinic input]
1849sys.is_finalizing
1850
1851Return True if Python is exiting.
1852[clinic start generated code]*/
1853
Antoine Pitrou5db1bb82014-12-07 01:28:27 +01001854static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001855sys_is_finalizing_impl(PyObject *module)
1856/*[clinic end generated code: output=735b5ff7962ab281 input=f0df747a039948a5]*/
Antoine Pitrou5db1bb82014-12-07 01:28:27 +01001857{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001858 return PyBool_FromLong(_Py_IsFinalizing());
Antoine Pitrou5db1bb82014-12-07 01:28:27 +01001859}
1860
Victor Stinnerd6958ac2016-12-02 01:13:46 +01001861#ifdef ANDROID_API_LEVEL
Tal Einatede0b6f2018-12-31 17:12:08 +02001862/*[clinic input]
1863sys.getandroidapilevel
1864
1865Return the build time API version of Android as an integer.
1866[clinic start generated code]*/
Victor Stinnerd6958ac2016-12-02 01:13:46 +01001867
1868static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001869sys_getandroidapilevel_impl(PyObject *module)
1870/*[clinic end generated code: output=214abf183a1c70c1 input=3e6d6c9fcdd24ac6]*/
Victor Stinnerd6958ac2016-12-02 01:13:46 +01001871{
1872 return PyLong_FromLong(ANDROID_API_LEVEL);
1873}
1874#endif /* ANDROID_API_LEVEL */
1875
1876
Steve Dowerb82e17e2019-05-23 08:45:22 -07001877
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001878static PyMethodDef sys_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 /* Might as well keep this in alphabetic order */
Steve Dowerb82e17e2019-05-23 08:45:22 -07001880 SYS_ADDAUDITHOOK_METHODDEF
1881 {"audit", (PyCFunction)(void(*)(void))sys_audit, METH_FASTCALL, audit_doc },
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001882 {"breakpointhook", (PyCFunction)(void(*)(void))sys_breakpointhook,
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001883 METH_FASTCALL | METH_KEYWORDS, breakpointhook_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001884 SYS__CLEAR_TYPE_CACHE_METHODDEF
1885 SYS__CURRENT_FRAMES_METHODDEF
1886 SYS_DISPLAYHOOK_METHODDEF
1887 SYS_EXC_INFO_METHODDEF
1888 SYS_EXCEPTHOOK_METHODDEF
1889 SYS_EXIT_METHODDEF
1890 SYS_GETDEFAULTENCODING_METHODDEF
1891 SYS_GETDLOPENFLAGS_METHODDEF
1892 SYS_GETALLOCATEDBLOCKS_METHODDEF
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001893#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 {"getdxp", _Py_GetDXProfile, METH_VARARGS},
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001895#endif
Tal Einatede0b6f2018-12-31 17:12:08 +02001896 SYS_GETFILESYSTEMENCODING_METHODDEF
1897 SYS_GETFILESYSTEMENCODEERRORS_METHODDEF
Guido van Rossum7f3f2c11996-05-23 22:45:41 +00001898#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 {"getobjects", _Py_GetObjects, METH_VARARGS},
Tim Peters4be93d02002-07-07 19:59:50 +00001900#endif
Tal Einatede0b6f2018-12-31 17:12:08 +02001901 SYS_GETTOTALREFCOUNT_METHODDEF
1902 SYS_GETREFCOUNT_METHODDEF
1903 SYS_GETRECURSIONLIMIT_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001904 {"getsizeof", (PyCFunction)(void(*)(void))sys_getsizeof,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 METH_VARARGS | METH_KEYWORDS, getsizeof_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001906 SYS__GETFRAME_METHODDEF
1907 SYS_GETWINDOWSVERSION_METHODDEF
1908 SYS__ENABLELEGACYWINDOWSFSENCODING_METHODDEF
1909 SYS_INTERN_METHODDEF
1910 SYS_IS_FINALIZING_METHODDEF
1911 SYS_MDEBUG_METHODDEF
Tal Einatede0b6f2018-12-31 17:12:08 +02001912 SYS_SETSWITCHINTERVAL_METHODDEF
1913 SYS_GETSWITCHINTERVAL_METHODDEF
1914 SYS_SETDLOPENFLAGS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 {"setprofile", sys_setprofile, METH_O, setprofile_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001916 SYS_GETPROFILE_METHODDEF
1917 SYS_SETRECURSIONLIMIT_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 {"settrace", sys_settrace, METH_O, settrace_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001919 SYS_GETTRACE_METHODDEF
1920 SYS_CALL_TRACING_METHODDEF
1921 SYS__DEBUGMALLOCSTATS_METHODDEF
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001922 SYS_SET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF
1923 SYS_GET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001924 {"set_asyncgen_hooks", (PyCFunction)(void(*)(void))sys_set_asyncgen_hooks,
Yury Selivanoveb636452016-09-08 22:01:51 -07001925 METH_VARARGS | METH_KEYWORDS, set_asyncgen_hooks_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001926 SYS_GET_ASYNCGEN_HOOKS_METHODDEF
1927 SYS_GETANDROIDAPILEVEL_METHODDEF
Victor Stinneref9d9b62019-05-22 11:28:22 +02001928 SYS_UNRAISABLEHOOK_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 {NULL, NULL} /* sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001930};
1931
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001932static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001933list_builtin_module_names(void)
Guido van Rossum34679b71993-01-26 13:33:44 +00001934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 PyObject *list = PyList_New(0);
1936 int i;
1937 if (list == NULL)
1938 return NULL;
1939 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1940 PyObject *name = PyUnicode_FromString(
1941 PyImport_Inittab[i].name);
1942 if (name == NULL)
1943 break;
1944 PyList_Append(list, name);
1945 Py_DECREF(name);
1946 }
1947 if (PyList_Sort(list) != 0) {
1948 Py_DECREF(list);
1949 list = NULL;
1950 }
1951 if (list) {
1952 PyObject *v = PyList_AsTuple(list);
1953 Py_DECREF(list);
1954 list = v;
1955 }
1956 return list;
Guido van Rossum34679b71993-01-26 13:33:44 +00001957}
1958
Nick Coghlanbc77eff2018-03-25 20:44:30 +10001959/* Pre-initialization support for sys.warnoptions and sys._xoptions
1960 *
1961 * Modern internal code paths:
1962 * These APIs get called after _Py_InitializeCore and get to use the
1963 * regular CPython list, dict, and unicode APIs.
1964 *
1965 * Legacy embedding code paths:
1966 * The multi-phase initialization API isn't public yet, so embedding
1967 * apps still need to be able configure sys.warnoptions and sys._xoptions
1968 * before they call Py_Initialize. To support this, we stash copies of
1969 * the supplied wchar * sequences in linked lists, and then migrate the
1970 * contents of those lists to the sys module in _PyInitializeCore.
1971 *
1972 */
1973
1974struct _preinit_entry {
1975 wchar_t *value;
1976 struct _preinit_entry *next;
1977};
1978
1979typedef struct _preinit_entry *_Py_PreInitEntry;
1980
1981static _Py_PreInitEntry _preinit_warnoptions = NULL;
1982static _Py_PreInitEntry _preinit_xoptions = NULL;
1983
1984static _Py_PreInitEntry
1985_alloc_preinit_entry(const wchar_t *value)
1986{
1987 /* To get this to work, we have to initialize the runtime implicitly */
1988 _PyRuntime_Initialize();
1989
1990 /* Force default allocator, so we can ensure that it also gets used to
1991 * destroy the linked list in _clear_preinit_entries.
1992 */
1993 PyMemAllocatorEx old_alloc;
1994 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1995
1996 _Py_PreInitEntry node = PyMem_RawCalloc(1, sizeof(*node));
1997 if (node != NULL) {
1998 node->value = _PyMem_RawWcsdup(value);
1999 if (node->value == NULL) {
2000 PyMem_RawFree(node);
2001 node = NULL;
2002 };
2003 };
2004
2005 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2006 return node;
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002007}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002008
2009static int
2010_append_preinit_entry(_Py_PreInitEntry *optionlist, const wchar_t *value)
2011{
2012 _Py_PreInitEntry new_entry = _alloc_preinit_entry(value);
2013 if (new_entry == NULL) {
2014 return -1;
2015 }
2016 /* We maintain the linked list in this order so it's easy to play back
2017 * the add commands in the same order later on in _Py_InitializeCore
2018 */
2019 _Py_PreInitEntry last_entry = *optionlist;
2020 if (last_entry == NULL) {
2021 *optionlist = new_entry;
2022 } else {
2023 while (last_entry->next != NULL) {
2024 last_entry = last_entry->next;
2025 }
2026 last_entry->next = new_entry;
2027 }
2028 return 0;
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002029}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002030
2031static void
2032_clear_preinit_entries(_Py_PreInitEntry *optionlist)
2033{
2034 _Py_PreInitEntry current = *optionlist;
2035 *optionlist = NULL;
2036 /* Deallocate the nodes and their contents using the default allocator */
2037 PyMemAllocatorEx old_alloc;
2038 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2039 while (current != NULL) {
2040 _Py_PreInitEntry next = current->next;
2041 PyMem_RawFree(current->value);
2042 PyMem_RawFree(current);
2043 current = next;
2044 }
2045 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002046}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002047
Victor Stinner120b7072019-08-23 18:03:08 +01002048
2049PyStatus
Victor Stinnerfb4ae152019-09-30 01:40:17 +02002050_PySys_ReadPreinitWarnOptions(PyWideStringList *options)
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002051{
Victor Stinner120b7072019-08-23 18:03:08 +01002052 PyStatus status;
2053 _Py_PreInitEntry entry;
2054
2055 for (entry = _preinit_warnoptions; entry != NULL; entry = entry->next) {
Victor Stinnerfb4ae152019-09-30 01:40:17 +02002056 status = PyWideStringList_Append(options, entry->value);
Victor Stinner120b7072019-08-23 18:03:08 +01002057 if (_PyStatus_EXCEPTION(status)) {
2058 return status;
2059 }
2060 }
2061
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002062 _clear_preinit_entries(&_preinit_warnoptions);
Victor Stinner120b7072019-08-23 18:03:08 +01002063 return _PyStatus_OK();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002064}
2065
Victor Stinner120b7072019-08-23 18:03:08 +01002066
2067PyStatus
2068_PySys_ReadPreinitXOptions(PyConfig *config)
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002069{
Victor Stinner120b7072019-08-23 18:03:08 +01002070 PyStatus status;
2071 _Py_PreInitEntry entry;
2072
2073 for (entry = _preinit_xoptions; entry != NULL; entry = entry->next) {
2074 status = PyWideStringList_Append(&config->xoptions, entry->value);
2075 if (_PyStatus_EXCEPTION(status)) {
2076 return status;
2077 }
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002078 }
2079
Victor Stinner120b7072019-08-23 18:03:08 +01002080 _clear_preinit_entries(&_preinit_xoptions);
2081 return _PyStatus_OK();
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002082}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002083
Victor Stinner120b7072019-08-23 18:03:08 +01002084
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002085static PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +02002086get_warnoptions(PyThreadState *tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002087{
Victor Stinner838f2642019-06-13 22:41:23 +02002088 PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002089 if (warnoptions == NULL || !PyList_Check(warnoptions)) {
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002090 /* PEP432 TODO: we can reach this if warnoptions is NULL in the main
2091 * interpreter config. When that happens, we need to properly set
2092 * the `warnoptions` reference in the main interpreter config as well.
2093 *
2094 * For Python 3.7, we shouldn't be able to get here due to the
2095 * combination of how _PyMainInterpreter_ReadConfig and _PySys_EndInit
2096 * work, but we expect 3.8+ to make the _PyMainInterpreter_ReadConfig
2097 * call optional for embedding applications, thus making this
2098 * reachable again.
2099 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002100 warnoptions = PyList_New(0);
Victor Stinner838f2642019-06-13 22:41:23 +02002101 if (warnoptions == NULL) {
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002102 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02002103 }
2104 if (sys_set_object_id(tstate, &PyId_warnoptions, warnoptions)) {
Eric Snowdae02762017-09-14 00:35:58 -07002105 Py_DECREF(warnoptions);
2106 return NULL;
2107 }
2108 Py_DECREF(warnoptions);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002109 }
2110 return warnoptions;
2111}
Guido van Rossum23fff912000-12-15 22:02:05 +00002112
2113void
2114PySys_ResetWarnOptions(void)
2115{
Victor Stinner50b48572018-11-01 01:51:40 +01002116 PyThreadState *tstate = _PyThreadState_GET();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002117 if (tstate == NULL) {
2118 _clear_preinit_entries(&_preinit_warnoptions);
2119 return;
2120 }
2121
Victor Stinner838f2642019-06-13 22:41:23 +02002122 PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 if (warnoptions == NULL || !PyList_Check(warnoptions))
2124 return;
2125 PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
Guido van Rossum23fff912000-12-15 22:02:05 +00002126}
2127
Victor Stinnere1b29952018-10-30 14:31:42 +01002128static int
Victor Stinner838f2642019-06-13 22:41:23 +02002129_PySys_AddWarnOptionWithError(PyThreadState *tstate, PyObject *option)
Guido van Rossum23fff912000-12-15 22:02:05 +00002130{
Victor Stinner838f2642019-06-13 22:41:23 +02002131 PyObject *warnoptions = get_warnoptions(tstate);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002132 if (warnoptions == NULL) {
2133 return -1;
2134 }
2135 if (PyList_Append(warnoptions, option)) {
2136 return -1;
2137 }
2138 return 0;
2139}
2140
2141void
2142PySys_AddWarnOptionUnicode(PyObject *option)
2143{
Victor Stinner838f2642019-06-13 22:41:23 +02002144 PyThreadState *tstate = _PyThreadState_GET();
2145 if (_PySys_AddWarnOptionWithError(tstate, option) < 0) {
Victor Stinnere1b29952018-10-30 14:31:42 +01002146 /* No return value, therefore clear error state if possible */
Victor Stinner838f2642019-06-13 22:41:23 +02002147 if (tstate) {
2148 _PyErr_Clear(tstate);
Victor Stinnere1b29952018-10-30 14:31:42 +01002149 }
2150 }
Victor Stinner9ca9c252010-05-19 16:53:30 +00002151}
2152
2153void
2154PySys_AddWarnOption(const wchar_t *s)
2155{
Victor Stinner50b48572018-11-01 01:51:40 +01002156 PyThreadState *tstate = _PyThreadState_GET();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002157 if (tstate == NULL) {
2158 _append_preinit_entry(&_preinit_warnoptions, s);
2159 return;
2160 }
Victor Stinner9ca9c252010-05-19 16:53:30 +00002161 PyObject *unicode;
2162 unicode = PyUnicode_FromWideChar(s, -1);
2163 if (unicode == NULL)
2164 return;
2165 PySys_AddWarnOptionUnicode(unicode);
2166 Py_DECREF(unicode);
Guido van Rossum23fff912000-12-15 22:02:05 +00002167}
2168
Christian Heimes33fe8092008-04-13 13:53:33 +00002169int
2170PySys_HasWarnOptions(void)
2171{
Victor Stinner838f2642019-06-13 22:41:23 +02002172 PyThreadState *tstate = _PyThreadState_GET();
2173 PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions);
Serhiy Storchakadffccc62018-12-10 13:50:22 +02002174 return (warnoptions != NULL && PyList_Check(warnoptions)
2175 && PyList_GET_SIZE(warnoptions) > 0);
Christian Heimes33fe8092008-04-13 13:53:33 +00002176}
2177
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002178static PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +02002179get_xoptions(PyThreadState *tstate)
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002180{
Victor Stinner838f2642019-06-13 22:41:23 +02002181 PyObject *xoptions = sys_get_object_id(tstate, &PyId__xoptions);
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002182 if (xoptions == NULL || !PyDict_Check(xoptions)) {
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002183 /* PEP432 TODO: we can reach this if xoptions is NULL in the main
2184 * interpreter config. When that happens, we need to properly set
2185 * the `xoptions` reference in the main interpreter config as well.
2186 *
2187 * For Python 3.7, we shouldn't be able to get here due to the
2188 * combination of how _PyMainInterpreter_ReadConfig and _PySys_EndInit
2189 * work, but we expect 3.8+ to make the _PyMainInterpreter_ReadConfig
2190 * call optional for embedding applications, thus making this
2191 * reachable again.
2192 */
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002193 xoptions = PyDict_New();
Victor Stinner838f2642019-06-13 22:41:23 +02002194 if (xoptions == NULL) {
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002195 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02002196 }
2197 if (sys_set_object_id(tstate, &PyId__xoptions, xoptions)) {
Eric Snowdae02762017-09-14 00:35:58 -07002198 Py_DECREF(xoptions);
2199 return NULL;
2200 }
2201 Py_DECREF(xoptions);
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002202 }
2203 return xoptions;
2204}
2205
Victor Stinnere1b29952018-10-30 14:31:42 +01002206static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002207_PySys_AddXOptionWithError(const wchar_t *s)
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002208{
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002209 PyObject *name = NULL, *value = NULL;
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002210
Victor Stinner838f2642019-06-13 22:41:23 +02002211 PyThreadState *tstate = _PyThreadState_GET();
2212 PyObject *opts = get_xoptions(tstate);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002213 if (opts == NULL) {
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002214 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002215 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002216
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002217 const wchar_t *name_end = wcschr(s, L'=');
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002218 if (!name_end) {
2219 name = PyUnicode_FromWideChar(s, -1);
2220 value = Py_True;
2221 Py_INCREF(value);
2222 }
2223 else {
2224 name = PyUnicode_FromWideChar(s, name_end - s);
2225 value = PyUnicode_FromWideChar(name_end + 1, -1);
2226 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002227 if (name == NULL || value == NULL) {
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002228 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002229 }
2230 if (PyDict_SetItem(opts, name, value) < 0) {
2231 goto error;
2232 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002233 Py_DECREF(name);
2234 Py_DECREF(value);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002235 return 0;
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002236
2237error:
2238 Py_XDECREF(name);
2239 Py_XDECREF(value);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002240 return -1;
2241}
2242
2243void
2244PySys_AddXOption(const wchar_t *s)
2245{
Victor Stinner50b48572018-11-01 01:51:40 +01002246 PyThreadState *tstate = _PyThreadState_GET();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002247 if (tstate == NULL) {
2248 _append_preinit_entry(&_preinit_xoptions, s);
2249 return;
2250 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002251 if (_PySys_AddXOptionWithError(s) < 0) {
2252 /* No return value, therefore clear error state if possible */
Victor Stinner120b7072019-08-23 18:03:08 +01002253 _PyErr_Clear(tstate);
Victor Stinner0cae6092016-11-11 01:43:56 +01002254 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002255}
2256
2257PyObject *
2258PySys_GetXOptions(void)
2259{
Victor Stinner838f2642019-06-13 22:41:23 +02002260 PyThreadState *tstate = _PyThreadState_GET();
2261 return get_xoptions(tstate);
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002262}
2263
Guido van Rossum40552d01998-08-06 03:34:39 +00002264/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
2265 Two literals concatenated works just fine. If you have a K&R compiler
2266 or other abomination that however *does* understand longer strings,
2267 get rid of the !!! comment in the middle and the quotes that surround it. */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002268PyDoc_VAR(sys_doc) =
2269PyDoc_STR(
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002270"This module provides access to some objects used or maintained by the\n\
2271interpreter and to functions that interact strongly with the interpreter.\n\
2272\n\
2273Dynamic objects:\n\
2274\n\
2275argv -- command line arguments; argv[0] is the script pathname if known\n\
2276path -- module search path; path[0] is the script directory, else ''\n\
2277modules -- dictionary of loaded modules\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002278\n\
2279displayhook -- called to show results in an interactive session\n\
2280excepthook -- called to handle any uncaught exception other than SystemExit\n\
2281 To customize printing in an interactive session or to install a custom\n\
2282 top-level exception handler, assign other functions to replace these.\n\
2283\n\
Benjamin Peterson06157a42008-07-15 00:28:36 +00002284stdin -- standard input file object; used by input()\n\
Georg Brandl88fc6642007-02-09 21:28:07 +00002285stdout -- standard output file object; used by print()\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002286stderr -- standard error object; used for error messages\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002287 By assigning other file objects (or objects that behave like files)\n\
2288 to these, it is possible to redirect all of the interpreter's I/O.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002289\n\
2290last_type -- type of last uncaught exception\n\
2291last_value -- value of last uncaught exception\n\
2292last_traceback -- traceback of last uncaught exception\n\
2293 These three are only available in an interactive session after a\n\
2294 traceback has been printed.\n\
Guido van Rossuma71b5f41999-01-14 19:07:00 +00002295"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002296)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002297/* concatenating string here */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002298PyDoc_STR(
Guido van Rossuma71b5f41999-01-14 19:07:00 +00002299"\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002300Static objects:\n\
2301\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002302builtin_module_names -- tuple of module names built into this interpreter\n\
2303copyright -- copyright notice pertaining to this interpreter\n\
2304exec_prefix -- prefix used to find the machine-specific Python library\n\
Petri Lehtinen4b0eab62012-02-02 21:23:15 +02002305executable -- absolute path of the executable binary of the Python interpreter\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07002306float_info -- a named tuple with information about the float implementation.\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002307float_repr_style -- string indicating the style of repr() output for floats\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07002308hash_info -- a named tuple with information about the hash algorithm.\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002309hexversion -- version information encoded as a single integer\n\
Barry Warsaw409da152012-06-03 16:18:47 -04002310implementation -- Python implementation information.\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07002311int_info -- a named tuple with information about the int implementation.\n\
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002312maxsize -- the largest supported length of containers.\n\
Serhiy Storchakad3faf432015-01-18 11:28:37 +02002313maxunicode -- the value of the largest Unicode code point\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002314platform -- platform identifier\n\
2315prefix -- prefix used to find the Python library\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07002316thread_info -- a named tuple with information about the thread implementation.\n\
Fred Drake801c08d2000-04-13 15:29:10 +00002317version -- the version of this interpreter as a string\n\
Eric Smith0e5b5622009-02-06 01:32:42 +00002318version_info -- version information as a named tuple\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002319"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002320)
Steve Dowercc16be82016-09-08 10:35:16 -07002321#ifdef MS_COREDLL
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002322/* concatenating string here */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002323PyDoc_STR(
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002324"dllhandle -- [Windows only] integer handle of the Python DLL\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002325winver -- [Windows only] version number of the Python DLL\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002326"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002327)
Steve Dowercc16be82016-09-08 10:35:16 -07002328#endif /* MS_COREDLL */
2329#ifdef MS_WINDOWS
2330/* concatenating string here */
2331PyDoc_STR(
oldkaa0735f2018-02-02 16:52:55 +08002332"_enablelegacywindowsfsencoding -- [Windows only]\n\
Steve Dowercc16be82016-09-08 10:35:16 -07002333"
2334)
2335#endif
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002336PyDoc_STR(
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002337"__stdin__ -- the original stdin; don't touch!\n\
2338__stdout__ -- the original stdout; don't touch!\n\
2339__stderr__ -- the original stderr; don't touch!\n\
2340__displayhook__ -- the original displayhook; don't touch!\n\
2341__excepthook__ -- the original excepthook; don't touch!\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002342\n\
2343Functions:\n\
2344\n\
Georg Brandl1a3284e2007-12-02 09:40:06 +00002345displayhook() -- print an object to the screen, and save it in builtins._\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002346excepthook() -- print an exception and its traceback to sys.stderr\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002347exc_info() -- return thread-safe information about the current exception\n\
2348exit() -- exit the interpreter by raising SystemExit\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +00002349getdlopenflags() -- returns flags to be used for dlopen() calls\n\
Christian Heimes9bd667a2008-01-20 15:14:11 +00002350getprofile() -- get the global profiling function\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002351getrefcount() -- return the reference count for an object (plus one :-)\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00002352getrecursionlimit() -- return the max recursion depth for the interpreter\n\
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002353getsizeof() -- return the size of an object in bytes\n\
Christian Heimes9bd667a2008-01-20 15:14:11 +00002354gettrace() -- get the global debug tracing function\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +00002355setdlopenflags() -- set the flags to be used for dlopen() calls\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002356setprofile() -- set the global profiling function\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00002357setrecursionlimit() -- set the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002358settrace() -- set the global debug tracing function\n\
Fred Drakeccede592000-08-14 20:59:57 +00002359"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002360)
Fred Drakeccede592000-08-14 20:59:57 +00002361/* end of sys_doc */ ;
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002362
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002363
2364PyDoc_STRVAR(flags__doc__,
2365"sys.flags\n\
2366\n\
2367Flags provided through command line arguments or environment vars.");
2368
2369static PyTypeObject FlagsType;
2370
2371static PyStructSequence_Field flags_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 {"debug", "-d"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 {"inspect", "-i"},
2374 {"interactive", "-i"},
2375 {"optimize", "-O or -OO"},
2376 {"dont_write_bytecode", "-B"},
2377 {"no_user_site", "-s"},
2378 {"no_site", "-S"},
2379 {"ignore_environment", "-E"},
2380 {"verbose", "-v"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 /* {"unbuffered", "-u"}, */
2382 /* {"skip_first", "-x"}, */
Georg Brandl8aa7e992010-12-28 18:30:18 +00002383 {"bytes_warning", "-b"},
2384 {"quiet", "-q"},
Georg Brandl09a7c722012-02-20 21:31:46 +01002385 {"hash_randomization", "-R"},
Christian Heimesad73a9c2013-08-10 16:36:18 +02002386 {"isolated", "-I"},
Victor Stinner5e3806f2017-11-30 11:40:24 +01002387 {"dev_mode", "-X dev"},
Victor Stinner91106cd2017-12-13 12:29:09 +01002388 {"utf8_mode", "-X utf8"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 {0}
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002390};
2391
2392static PyStructSequence_Desc flags_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 "sys.flags", /* name */
2394 flags__doc__, /* doc */
2395 flags_fields, /* fields */
Victor Stinner91106cd2017-12-13 12:29:09 +01002396 15
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002397};
2398
2399static PyObject*
Victor Stinner01b1cc12019-11-20 02:27:56 +01002400make_flags(PyThreadState *tstate)
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002401{
Victor Stinner01b1cc12019-11-20 02:27:56 +01002402 PyInterpreterState *interp = tstate->interp;
2403 const PyPreConfig *preconfig = &interp->runtime->preconfig;
2404 const PyConfig *config = &interp->config;
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002405
Victor Stinner01b1cc12019-11-20 02:27:56 +01002406 PyObject *seq = PyStructSequence_New(&FlagsType);
2407 if (seq == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002408 return NULL;
Victor Stinner01b1cc12019-11-20 02:27:56 +01002409 }
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002410
Victor Stinner01b1cc12019-11-20 02:27:56 +01002411 int pos = 0;
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002412#define SetFlag(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag))
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002414
Victor Stinnerfbca9082018-08-30 00:50:45 +02002415 SetFlag(config->parser_debug);
2416 SetFlag(config->inspect);
2417 SetFlag(config->interactive);
2418 SetFlag(config->optimization_level);
2419 SetFlag(!config->write_bytecode);
2420 SetFlag(!config->user_site_directory);
2421 SetFlag(!config->site_import);
Victor Stinner20004952019-03-26 02:31:11 +01002422 SetFlag(!config->use_environment);
Victor Stinnerfbca9082018-08-30 00:50:45 +02002423 SetFlag(config->verbose);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 /* SetFlag(saw_unbuffered_flag); */
2425 /* SetFlag(skipfirstline); */
Victor Stinnerfbca9082018-08-30 00:50:45 +02002426 SetFlag(config->bytes_warning);
2427 SetFlag(config->quiet);
2428 SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0);
Victor Stinner20004952019-03-26 02:31:11 +01002429 SetFlag(config->isolated);
2430 PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode));
2431 SetFlag(preconfig->utf8_mode);
Victor Stinner91106cd2017-12-13 12:29:09 +01002432#undef SetFlag
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002433
Victor Stinner838f2642019-06-13 22:41:23 +02002434 if (_PyErr_Occurred(tstate)) {
Serhiy Storchaka87a854d2013-12-17 14:59:42 +02002435 Py_DECREF(seq);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 return NULL;
2437 }
2438 return seq;
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002439}
2440
Eric Smith0e5b5622009-02-06 01:32:42 +00002441PyDoc_STRVAR(version_info__doc__,
2442"sys.version_info\n\
2443\n\
2444Version information as a named tuple.");
2445
2446static PyTypeObject VersionInfoType;
2447
2448static PyStructSequence_Field version_info_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 {"major", "Major release number"},
2450 {"minor", "Minor release number"},
2451 {"micro", "Patch release number"},
Ned Deilyda4887a2016-11-04 17:03:34 -04002452 {"releaselevel", "'alpha', 'beta', 'candidate', or 'final'"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 {"serial", "Serial release number"},
2454 {0}
Eric Smith0e5b5622009-02-06 01:32:42 +00002455};
2456
2457static PyStructSequence_Desc version_info_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 "sys.version_info", /* name */
2459 version_info__doc__, /* doc */
2460 version_info_fields, /* fields */
2461 5
Eric Smith0e5b5622009-02-06 01:32:42 +00002462};
2463
2464static PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +02002465make_version_info(PyThreadState *tstate)
Eric Smith0e5b5622009-02-06 01:32:42 +00002466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 PyObject *version_info;
2468 char *s;
2469 int pos = 0;
Eric Smith0e5b5622009-02-06 01:32:42 +00002470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 version_info = PyStructSequence_New(&VersionInfoType);
2472 if (version_info == NULL) {
2473 return NULL;
2474 }
Eric Smith0e5b5622009-02-06 01:32:42 +00002475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 /*
2477 * These release level checks are mutually exclusive and cover
2478 * the field, so don't get too fancy with the pre-processor!
2479 */
Eric Smith0e5b5622009-02-06 01:32:42 +00002480#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 s = "alpha";
Eric Smith0e5b5622009-02-06 01:32:42 +00002482#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 s = "beta";
Eric Smith0e5b5622009-02-06 01:32:42 +00002484#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 s = "candidate";
Eric Smith0e5b5622009-02-06 01:32:42 +00002486#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 s = "final";
Eric Smith0e5b5622009-02-06 01:32:42 +00002488#endif
2489
2490#define SetIntItem(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 PyStructSequence_SET_ITEM(version_info, pos++, PyLong_FromLong(flag))
Eric Smith0e5b5622009-02-06 01:32:42 +00002492#define SetStrItem(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 PyStructSequence_SET_ITEM(version_info, pos++, PyUnicode_FromString(flag))
Eric Smith0e5b5622009-02-06 01:32:42 +00002494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 SetIntItem(PY_MAJOR_VERSION);
2496 SetIntItem(PY_MINOR_VERSION);
2497 SetIntItem(PY_MICRO_VERSION);
2498 SetStrItem(s);
2499 SetIntItem(PY_RELEASE_SERIAL);
Eric Smith0e5b5622009-02-06 01:32:42 +00002500#undef SetIntItem
2501#undef SetStrItem
2502
Victor Stinner838f2642019-06-13 22:41:23 +02002503 if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 Py_CLEAR(version_info);
2505 return NULL;
2506 }
2507 return version_info;
Eric Smith0e5b5622009-02-06 01:32:42 +00002508}
2509
Brett Cannon3adc7b72012-07-09 14:22:12 -04002510/* sys.implementation values */
2511#define NAME "cpython"
2512const char *_PySys_ImplName = NAME;
Victor Stinnercf01b682015-11-05 11:21:38 +01002513#define MAJOR Py_STRINGIFY(PY_MAJOR_VERSION)
2514#define MINOR Py_STRINGIFY(PY_MINOR_VERSION)
Ned Deily529ea5d2014-06-30 23:31:14 -07002515#define TAG NAME "-" MAJOR MINOR
Brett Cannon3adc7b72012-07-09 14:22:12 -04002516const char *_PySys_ImplCacheTag = TAG;
2517#undef NAME
Brett Cannon3adc7b72012-07-09 14:22:12 -04002518#undef MAJOR
2519#undef MINOR
2520#undef TAG
2521
Barry Warsaw409da152012-06-03 16:18:47 -04002522static PyObject *
2523make_impl_info(PyObject *version_info)
2524{
2525 int res;
2526 PyObject *impl_info, *value, *ns;
2527
2528 impl_info = PyDict_New();
2529 if (impl_info == NULL)
2530 return NULL;
2531
2532 /* populate the dict */
2533
Brett Cannon3adc7b72012-07-09 14:22:12 -04002534 value = PyUnicode_FromString(_PySys_ImplName);
Barry Warsaw409da152012-06-03 16:18:47 -04002535 if (value == NULL)
2536 goto error;
2537 res = PyDict_SetItemString(impl_info, "name", value);
2538 Py_DECREF(value);
2539 if (res < 0)
2540 goto error;
2541
Brett Cannon3adc7b72012-07-09 14:22:12 -04002542 value = PyUnicode_FromString(_PySys_ImplCacheTag);
Barry Warsaw409da152012-06-03 16:18:47 -04002543 if (value == NULL)
2544 goto error;
2545 res = PyDict_SetItemString(impl_info, "cache_tag", value);
2546 Py_DECREF(value);
2547 if (res < 0)
2548 goto error;
Barry Warsaw409da152012-06-03 16:18:47 -04002549
2550 res = PyDict_SetItemString(impl_info, "version", version_info);
2551 if (res < 0)
2552 goto error;
2553
2554 value = PyLong_FromLong(PY_VERSION_HEX);
2555 if (value == NULL)
2556 goto error;
2557 res = PyDict_SetItemString(impl_info, "hexversion", value);
2558 Py_DECREF(value);
2559 if (res < 0)
2560 goto error;
2561
doko@ubuntu.com55532312016-06-14 08:55:19 +02002562#ifdef MULTIARCH
2563 value = PyUnicode_FromString(MULTIARCH);
2564 if (value == NULL)
2565 goto error;
2566 res = PyDict_SetItemString(impl_info, "_multiarch", value);
2567 Py_DECREF(value);
2568 if (res < 0)
2569 goto error;
2570#endif
2571
Barry Warsaw409da152012-06-03 16:18:47 -04002572 /* dict ready */
2573
2574 ns = _PyNamespace_New(impl_info);
2575 Py_DECREF(impl_info);
2576 return ns;
2577
2578error:
2579 Py_CLEAR(impl_info);
2580 return NULL;
2581}
2582
Martin v. Löwis1a214512008-06-11 05:26:20 +00002583static struct PyModuleDef sysmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 PyModuleDef_HEAD_INIT,
2585 "sys",
2586 sys_doc,
2587 -1, /* multiple "initialization" just copies the module dict. */
2588 sys_methods,
2589 NULL,
2590 NULL,
2591 NULL,
2592 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002593};
2594
Eric Snow6b4be192017-05-22 21:36:03 -07002595/* Updating the sys namespace, returning NULL pointer on error */
Victor Stinner8fea2522013-10-27 17:15:42 +01002596#define SET_SYS_FROM_STRING_BORROW(key, value) \
Victor Stinner58049602013-07-22 22:40:00 +02002597 do { \
Victor Stinner58049602013-07-22 22:40:00 +02002598 PyObject *v = (value); \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002599 if (v == NULL) { \
2600 goto err_occurred; \
2601 } \
Victor Stinner58049602013-07-22 22:40:00 +02002602 res = PyDict_SetItemString(sysdict, key, v); \
2603 if (res < 0) { \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002604 goto err_occurred; \
Victor Stinner8fea2522013-10-27 17:15:42 +01002605 } \
2606 } while (0)
2607#define SET_SYS_FROM_STRING(key, value) \
2608 do { \
Victor Stinner8fea2522013-10-27 17:15:42 +01002609 PyObject *v = (value); \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002610 if (v == NULL) { \
2611 goto err_occurred; \
2612 } \
Victor Stinner8fea2522013-10-27 17:15:42 +01002613 res = PyDict_SetItemString(sysdict, key, v); \
2614 Py_DECREF(v); \
2615 if (res < 0) { \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002616 goto err_occurred; \
Victor Stinner58049602013-07-22 22:40:00 +02002617 } \
2618 } while (0)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002619
Victor Stinner331a6a52019-05-27 16:39:22 +02002620static PyStatus
Victor Stinner01b1cc12019-11-20 02:27:56 +01002621_PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
Eric Snow6b4be192017-05-22 21:36:03 -07002622{
Victor Stinnerab672812019-01-23 15:04:40 +01002623 PyObject *version_info;
Eric Snow6b4be192017-05-22 21:36:03 -07002624 int res;
2625
Nick Coghland6009512014-11-20 21:39:37 +10002626 /* stdin/stdout/stderr are set in pylifecycle.c */
Martin v. Löwis5467d4c2003-05-10 07:10:12 +00002627
Victor Stinner8fea2522013-10-27 17:15:42 +01002628 SET_SYS_FROM_STRING_BORROW("__displayhook__",
2629 PyDict_GetItemString(sysdict, "displayhook"));
2630 SET_SYS_FROM_STRING_BORROW("__excepthook__",
2631 PyDict_GetItemString(sysdict, "excepthook"));
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04002632 SET_SYS_FROM_STRING_BORROW(
2633 "__breakpointhook__",
2634 PyDict_GetItemString(sysdict, "breakpointhook"));
Victor Stinneref9d9b62019-05-22 11:28:22 +02002635 SET_SYS_FROM_STRING_BORROW("__unraisablehook__",
2636 PyDict_GetItemString(sysdict, "unraisablehook"));
2637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 SET_SYS_FROM_STRING("version",
2639 PyUnicode_FromString(Py_GetVersion()));
2640 SET_SYS_FROM_STRING("hexversion",
2641 PyLong_FromLong(PY_VERSION_HEX));
Ned Deily5c4b0d02017-03-04 00:19:55 -05002642 SET_SYS_FROM_STRING("_git",
2643 Py_BuildValue("(szz)", "CPython", _Py_gitidentifier(),
2644 _Py_gitversion()));
INADA Naoki6b42eb12017-06-29 15:31:38 +09002645 SET_SYS_FROM_STRING("_framework", PyUnicode_FromString(_PYTHONFRAMEWORK));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 SET_SYS_FROM_STRING("api_version",
2647 PyLong_FromLong(PYTHON_API_VERSION));
2648 SET_SYS_FROM_STRING("copyright",
2649 PyUnicode_FromString(Py_GetCopyright()));
2650 SET_SYS_FROM_STRING("platform",
2651 PyUnicode_FromString(Py_GetPlatform()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 SET_SYS_FROM_STRING("maxsize",
2653 PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2654 SET_SYS_FROM_STRING("float_info",
2655 PyFloat_GetInfo());
2656 SET_SYS_FROM_STRING("int_info",
2657 PyLong_GetInfo());
Mark Dickinsondc787d22010-05-23 13:33:13 +00002658 /* initialize hash_info */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002659 if (Hash_InfoType.tp_name == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002660 if (PyStructSequence_InitType2(&Hash_InfoType, &hash_info_desc) < 0) {
2661 goto type_init_failed;
2662 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02002663 }
Mark Dickinsondc787d22010-05-23 13:33:13 +00002664 SET_SYS_FROM_STRING("hash_info",
Victor Stinner838f2642019-06-13 22:41:23 +02002665 get_hash_info(tstate));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 SET_SYS_FROM_STRING("maxunicode",
Ezio Melotti48a2f8f2011-09-29 00:18:19 +03002667 PyLong_FromLong(0x10FFFF));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 SET_SYS_FROM_STRING("builtin_module_names",
2669 list_builtin_module_names());
Christian Heimes743e0cd2012-10-17 23:52:17 +02002670#if PY_BIG_ENDIAN
2671 SET_SYS_FROM_STRING("byteorder",
2672 PyUnicode_FromString("big"));
2673#else
2674 SET_SYS_FROM_STRING("byteorder",
2675 PyUnicode_FromString("little"));
2676#endif
Fred Drake099325e2000-08-14 15:47:03 +00002677
Guido van Rossum8b9ea871996-08-23 18:14:47 +00002678#ifdef MS_COREDLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 SET_SYS_FROM_STRING("dllhandle",
2680 PyLong_FromVoidPtr(PyWin_DLLhModule));
2681 SET_SYS_FROM_STRING("winver",
2682 PyUnicode_FromString(PyWin_DLLVersionString));
Guido van Rossumc606fe11996-04-09 02:37:57 +00002683#endif
Barry Warsaw8cf4eae2010-10-16 01:04:07 +00002684#ifdef ABIFLAGS
2685 SET_SYS_FROM_STRING("abiflags",
2686 PyUnicode_FromString(ABIFLAGS));
2687#endif
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 /* version_info */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002690 if (VersionInfoType.tp_name == NULL) {
2691 if (PyStructSequence_InitType2(&VersionInfoType,
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002692 &version_info_desc) < 0) {
2693 goto type_init_failed;
2694 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02002695 }
Victor Stinner838f2642019-06-13 22:41:23 +02002696 version_info = make_version_info(tstate);
Barry Warsaw409da152012-06-03 16:18:47 -04002697 SET_SYS_FROM_STRING("version_info", version_info);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 /* prevent user from creating new instances */
2699 VersionInfoType.tp_init = NULL;
2700 VersionInfoType.tp_new = NULL;
Antoine Pitrou871dfc42014-04-28 13:07:06 +02002701 res = PyDict_DelItemString(VersionInfoType.tp_dict, "__new__");
Victor Stinner838f2642019-06-13 22:41:23 +02002702 if (res < 0 && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2703 _PyErr_Clear(tstate);
2704 }
Eric Smith0e5b5622009-02-06 01:32:42 +00002705
Barry Warsaw409da152012-06-03 16:18:47 -04002706 /* implementation */
2707 SET_SYS_FROM_STRING("implementation", make_impl_info(version_info));
2708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 /* flags */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002710 if (FlagsType.tp_name == 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002711 if (PyStructSequence_InitType2(&FlagsType, &flags_desc) < 0) {
2712 goto type_init_failed;
2713 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02002714 }
Victor Stinner43125222019-04-24 18:23:53 +02002715 /* Set flags to their default values (updated by _PySys_InitMain()) */
Victor Stinner01b1cc12019-11-20 02:27:56 +01002716 SET_SYS_FROM_STRING("flags", make_flags(tstate));
Eric Smithf7bb5782010-01-27 00:44:57 +00002717
2718#if defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 /* getwindowsversion */
2720 if (WindowsVersionType.tp_name == 0)
Victor Stinner1c8f0592013-07-22 22:24:54 +02002721 if (PyStructSequence_InitType2(&WindowsVersionType,
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002722 &windows_version_desc) < 0) {
2723 goto type_init_failed;
2724 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 /* prevent user from creating new instances */
2726 WindowsVersionType.tp_init = NULL;
2727 WindowsVersionType.tp_new = NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02002728 assert(!_PyErr_Occurred(tstate));
Antoine Pitrou871dfc42014-04-28 13:07:06 +02002729 res = PyDict_DelItemString(WindowsVersionType.tp_dict, "__new__");
Victor Stinner838f2642019-06-13 22:41:23 +02002730 if (res < 0 && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2731 _PyErr_Clear(tstate);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002732 }
Eric Smithf7bb5782010-01-27 00:44:57 +00002733#endif
2734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00002736#ifndef PY_NO_SHORT_FLOAT_REPR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 SET_SYS_FROM_STRING("float_repr_style",
2738 PyUnicode_FromString("short"));
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00002739#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 SET_SYS_FROM_STRING("float_repr_style",
2741 PyUnicode_FromString("legacy"));
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00002742#endif
2743
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002744 SET_SYS_FROM_STRING("thread_info", PyThread_GetInfo());
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002745
Yury Selivanoveb636452016-09-08 22:01:51 -07002746 /* initialize asyncgen_hooks */
2747 if (AsyncGenHooksType.tp_name == NULL) {
2748 if (PyStructSequence_InitType2(
2749 &AsyncGenHooksType, &asyncgen_hooks_desc) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002750 goto type_init_failed;
Yury Selivanoveb636452016-09-08 22:01:51 -07002751 }
2752 }
2753
Victor Stinner838f2642019-06-13 22:41:23 +02002754 if (_PyErr_Occurred(tstate)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002755 goto err_occurred;
2756 }
Victor Stinner331a6a52019-05-27 16:39:22 +02002757 return _PyStatus_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002758
2759type_init_failed:
Victor Stinner331a6a52019-05-27 16:39:22 +02002760 return _PyStatus_ERR("failed to initialize a type");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002761
2762err_occurred:
Victor Stinner331a6a52019-05-27 16:39:22 +02002763 return _PyStatus_ERR("can't initialize sys module");
Guido van Rossum5b3138b1990-11-18 17:41:40 +00002764}
2765
Eric Snow6b4be192017-05-22 21:36:03 -07002766/* Updating the sys namespace, returning integer error codes */
Eric Snow6b4be192017-05-22 21:36:03 -07002767#define SET_SYS_FROM_STRING_INT_RESULT(key, value) \
2768 do { \
2769 PyObject *v = (value); \
2770 if (v == NULL) \
2771 return -1; \
2772 res = PyDict_SetItemString(sysdict, key, v); \
2773 Py_DECREF(v); \
2774 if (res < 0) { \
2775 return res; \
2776 } \
2777 } while (0)
2778
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002779
2780static int
2781sys_add_xoption(PyObject *opts, const wchar_t *s)
2782{
2783 PyObject *name, *value;
2784
2785 const wchar_t *name_end = wcschr(s, L'=');
2786 if (!name_end) {
2787 name = PyUnicode_FromWideChar(s, -1);
2788 value = Py_True;
2789 Py_INCREF(value);
2790 }
2791 else {
2792 name = PyUnicode_FromWideChar(s, name_end - s);
2793 value = PyUnicode_FromWideChar(name_end + 1, -1);
2794 }
2795 if (name == NULL || value == NULL) {
2796 goto error;
2797 }
2798 if (PyDict_SetItem(opts, name, value) < 0) {
2799 goto error;
2800 }
2801 Py_DECREF(name);
2802 Py_DECREF(value);
2803 return 0;
2804
2805error:
2806 Py_XDECREF(name);
2807 Py_XDECREF(value);
2808 return -1;
2809}
2810
2811
2812static PyObject*
Victor Stinner331a6a52019-05-27 16:39:22 +02002813sys_create_xoptions_dict(const PyConfig *config)
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002814{
2815 Py_ssize_t nxoption = config->xoptions.length;
2816 wchar_t * const * xoptions = config->xoptions.items;
2817 PyObject *dict = PyDict_New();
2818 if (dict == NULL) {
2819 return NULL;
2820 }
2821
2822 for (Py_ssize_t i=0; i < nxoption; i++) {
2823 const wchar_t *option = xoptions[i];
2824 if (sys_add_xoption(dict, option) < 0) {
2825 Py_DECREF(dict);
2826 return NULL;
2827 }
2828 }
2829
2830 return dict;
2831}
2832
2833
Eric Snow6b4be192017-05-22 21:36:03 -07002834int
Victor Stinner01b1cc12019-11-20 02:27:56 +01002835_PySys_InitMain(PyThreadState *tstate)
Eric Snow6b4be192017-05-22 21:36:03 -07002836{
Victor Stinner838f2642019-06-13 22:41:23 +02002837 PyObject *sysdict = tstate->interp->sysdict;
2838 const PyConfig *config = &tstate->interp->config;
Eric Snow6b4be192017-05-22 21:36:03 -07002839 int res;
2840
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002841#define COPY_LIST(KEY, VALUE) \
Victor Stinner37cd9822018-11-16 11:55:35 +01002842 do { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002843 PyObject *list = _PyWideStringList_AsList(&(VALUE)); \
Victor Stinner37cd9822018-11-16 11:55:35 +01002844 if (list == NULL) { \
2845 return -1; \
2846 } \
2847 SET_SYS_FROM_STRING_BORROW(KEY, list); \
2848 Py_DECREF(list); \
2849 } while (0)
2850
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002851#define SET_SYS_FROM_WSTR(KEY, VALUE) \
2852 do { \
2853 PyObject *str = PyUnicode_FromWideChar(VALUE, -1); \
2854 if (str == NULL) { \
2855 return -1; \
2856 } \
2857 SET_SYS_FROM_STRING_BORROW(KEY, str); \
2858 Py_DECREF(str); \
2859 } while (0)
Victor Stinner37cd9822018-11-16 11:55:35 +01002860
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002861 COPY_LIST("path", config->module_search_paths);
2862
2863 SET_SYS_FROM_WSTR("executable", config->executable);
Steve Dower9048c492019-06-29 10:34:11 -07002864 SET_SYS_FROM_WSTR("_base_executable", config->base_executable);
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002865 SET_SYS_FROM_WSTR("prefix", config->prefix);
2866 SET_SYS_FROM_WSTR("base_prefix", config->base_prefix);
2867 SET_SYS_FROM_WSTR("exec_prefix", config->exec_prefix);
2868 SET_SYS_FROM_WSTR("base_exec_prefix", config->base_exec_prefix);
Victor Stinner8510f432020-03-10 09:53:09 +01002869 {
2870 PyObject *str = PyUnicode_FromString(PLATLIBDIR);
2871 if (str == NULL) {
2872 return -1;
2873 }
2874 SET_SYS_FROM_STRING("platlibdir", str);
2875 }
Victor Stinner41264f12017-12-15 02:05:29 +01002876
Carl Meyerb193fa92018-06-15 22:40:56 -06002877 if (config->pycache_prefix != NULL) {
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002878 SET_SYS_FROM_WSTR("pycache_prefix", config->pycache_prefix);
Carl Meyerb193fa92018-06-15 22:40:56 -06002879 } else {
2880 PyDict_SetItemString(sysdict, "pycache_prefix", Py_None);
2881 }
2882
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002883 COPY_LIST("argv", config->argv);
2884 COPY_LIST("warnoptions", config->warnoptions);
2885
2886 PyObject *xoptions = sys_create_xoptions_dict(config);
2887 if (xoptions == NULL) {
2888 return -1;
Victor Stinner41264f12017-12-15 02:05:29 +01002889 }
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002890 SET_SYS_FROM_STRING_BORROW("_xoptions", xoptions);
Pablo Galindo34ef64f2019-03-27 12:43:47 +00002891 Py_DECREF(xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002892
Victor Stinner37cd9822018-11-16 11:55:35 +01002893#undef COPY_LIST
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002894#undef SET_SYS_FROM_WSTR
Victor Stinner37cd9822018-11-16 11:55:35 +01002895
Victor Stinner8510f432020-03-10 09:53:09 +01002896
Eric Snow6b4be192017-05-22 21:36:03 -07002897 /* Set flags to their final values */
Victor Stinner01b1cc12019-11-20 02:27:56 +01002898 SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(tstate));
Eric Snow6b4be192017-05-22 21:36:03 -07002899 /* prevent user from creating new instances */
2900 FlagsType.tp_init = NULL;
2901 FlagsType.tp_new = NULL;
2902 res = PyDict_DelItemString(FlagsType.tp_dict, "__new__");
2903 if (res < 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02002904 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Eric Snow6b4be192017-05-22 21:36:03 -07002905 return res;
2906 }
Victor Stinner838f2642019-06-13 22:41:23 +02002907 _PyErr_Clear(tstate);
Eric Snow6b4be192017-05-22 21:36:03 -07002908 }
2909
2910 SET_SYS_FROM_STRING_INT_RESULT("dont_write_bytecode",
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002911 PyBool_FromLong(!config->write_bytecode));
Eric Snow6b4be192017-05-22 21:36:03 -07002912
Victor Stinner838f2642019-06-13 22:41:23 +02002913 if (get_warnoptions(tstate) == NULL) {
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002914 return -1;
Victor Stinner838f2642019-06-13 22:41:23 +02002915 }
Victor Stinner865de272017-06-08 13:27:47 +02002916
Victor Stinner838f2642019-06-13 22:41:23 +02002917 if (get_xoptions(tstate) == NULL)
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002918 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -07002919
Victor Stinner838f2642019-06-13 22:41:23 +02002920 if (_PyErr_Occurred(tstate)) {
2921 goto err_occurred;
2922 }
2923
Eric Snow6b4be192017-05-22 21:36:03 -07002924 return 0;
Victor Stinner41264f12017-12-15 02:05:29 +01002925
2926err_occurred:
2927 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -07002928}
2929
Victor Stinner8510f432020-03-10 09:53:09 +01002930#undef SET_SYS_FROM_STRING
Victor Stinner41264f12017-12-15 02:05:29 +01002931#undef SET_SYS_FROM_STRING_BORROW
Eric Snow6b4be192017-05-22 21:36:03 -07002932#undef SET_SYS_FROM_STRING_INT_RESULT
Eric Snow6b4be192017-05-22 21:36:03 -07002933
Victor Stinnerab672812019-01-23 15:04:40 +01002934
2935/* Set up a preliminary stderr printer until we have enough
2936 infrastructure for the io module in place.
2937
2938 Use UTF-8/surrogateescape and ignore EAGAIN errors. */
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002939static PyStatus
Victor Stinnerab672812019-01-23 15:04:40 +01002940_PySys_SetPreliminaryStderr(PyObject *sysdict)
2941{
2942 PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr));
2943 if (pstderr == NULL) {
2944 goto error;
2945 }
2946 if (_PyDict_SetItemId(sysdict, &PyId_stderr, pstderr) < 0) {
2947 goto error;
2948 }
2949 if (PyDict_SetItemString(sysdict, "__stderr__", pstderr) < 0) {
2950 goto error;
2951 }
2952 Py_DECREF(pstderr);
Victor Stinner331a6a52019-05-27 16:39:22 +02002953 return _PyStatus_OK();
Victor Stinnerab672812019-01-23 15:04:40 +01002954
2955error:
2956 Py_XDECREF(pstderr);
Victor Stinner331a6a52019-05-27 16:39:22 +02002957 return _PyStatus_ERR("can't set preliminary stderr");
Victor Stinnerab672812019-01-23 15:04:40 +01002958}
2959
2960
2961/* Create sys module without all attributes: _PySys_InitMain() should be called
2962 later to add remaining attributes. */
Victor Stinner331a6a52019-05-27 16:39:22 +02002963PyStatus
Victor Stinner01b1cc12019-11-20 02:27:56 +01002964_PySys_Create(PyThreadState *tstate, PyObject **sysmod_p)
Victor Stinnerab672812019-01-23 15:04:40 +01002965{
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002966 assert(!_PyErr_Occurred(tstate));
2967
Victor Stinnerb45d2592019-06-20 00:05:23 +02002968 PyInterpreterState *interp = tstate->interp;
Victor Stinner838f2642019-06-13 22:41:23 +02002969
Victor Stinnerab672812019-01-23 15:04:40 +01002970 PyObject *modules = PyDict_New();
2971 if (modules == NULL) {
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002972 goto error;
Victor Stinnerab672812019-01-23 15:04:40 +01002973 }
2974 interp->modules = modules;
2975
2976 PyObject *sysmod = _PyModule_CreateInitialized(&sysmodule, PYTHON_API_VERSION);
2977 if (sysmod == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002978 return _PyStatus_ERR("failed to create a module object");
Victor Stinnerab672812019-01-23 15:04:40 +01002979 }
2980
2981 PyObject *sysdict = PyModule_GetDict(sysmod);
2982 if (sysdict == NULL) {
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002983 goto error;
Victor Stinnerab672812019-01-23 15:04:40 +01002984 }
2985 Py_INCREF(sysdict);
2986 interp->sysdict = sysdict;
2987
2988 if (PyDict_SetItemString(sysdict, "modules", interp->modules) < 0) {
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002989 goto error;
Victor Stinnerab672812019-01-23 15:04:40 +01002990 }
2991
Victor Stinner331a6a52019-05-27 16:39:22 +02002992 PyStatus status = _PySys_SetPreliminaryStderr(sysdict);
2993 if (_PyStatus_EXCEPTION(status)) {
2994 return status;
Victor Stinnerab672812019-01-23 15:04:40 +01002995 }
2996
Victor Stinner01b1cc12019-11-20 02:27:56 +01002997 status = _PySys_InitCore(tstate, sysdict);
Victor Stinner331a6a52019-05-27 16:39:22 +02002998 if (_PyStatus_EXCEPTION(status)) {
2999 return status;
Victor Stinnerab672812019-01-23 15:04:40 +01003000 }
3001
Victor Stinner81fe5bd2019-12-06 02:43:30 +01003002 if (_PyImport_FixupBuiltin(sysmod, "sys", interp->modules) < 0) {
3003 goto error;
3004 }
3005
3006 assert(!_PyErr_Occurred(tstate));
Victor Stinnerab672812019-01-23 15:04:40 +01003007
3008 *sysmod_p = sysmod;
Victor Stinner331a6a52019-05-27 16:39:22 +02003009 return _PyStatus_OK();
Victor Stinner81fe5bd2019-12-06 02:43:30 +01003010
3011error:
3012 return _PyStatus_ERR("can't initialize sys module");
Victor Stinnerab672812019-01-23 15:04:40 +01003013}
3014
3015
Guido van Rossum65bf9f21997-04-29 18:33:38 +00003016static PyObject *
Martin v. Löwis790465f2008-04-05 20:41:37 +00003017makepathobject(const wchar_t *path, wchar_t delim)
Guido van Rossum5b3138b1990-11-18 17:41:40 +00003018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 int i, n;
3020 const wchar_t *p;
3021 PyObject *v, *w;
Tim Peters216b78b2006-01-06 02:40:53 +00003022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 n = 1;
3024 p = path;
3025 while ((p = wcschr(p, delim)) != NULL) {
3026 n++;
3027 p++;
3028 }
3029 v = PyList_New(n);
3030 if (v == NULL)
3031 return NULL;
3032 for (i = 0; ; i++) {
3033 p = wcschr(path, delim);
3034 if (p == NULL)
3035 p = path + wcslen(path); /* End of string */
3036 w = PyUnicode_FromWideChar(path, (Py_ssize_t)(p - path));
3037 if (w == NULL) {
3038 Py_DECREF(v);
3039 return NULL;
3040 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07003041 PyList_SET_ITEM(v, i, w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 if (*p == '\0')
3043 break;
3044 path = p+1;
3045 }
3046 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003047}
3048
3049void
Martin v. Löwis790465f2008-04-05 20:41:37 +00003050PySys_SetPath(const wchar_t *path)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 PyObject *v;
3053 if ((v = makepathobject(path, DELIM)) == NULL)
3054 Py_FatalError("can't create sys.path");
Victor Stinner838f2642019-06-13 22:41:23 +02003055 PyThreadState *tstate = _PyThreadState_GET();
3056 if (sys_set_object_id(tstate, &PyId_path, v) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 Py_FatalError("can't assign sys.path");
Victor Stinner838f2642019-06-13 22:41:23 +02003058 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003059 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003060}
3061
Guido van Rossum65bf9f21997-04-29 18:33:38 +00003062static PyObject *
Victor Stinner74f65682019-03-15 15:08:05 +01003063make_sys_argv(int argc, wchar_t * const * argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003064{
Victor Stinner74f65682019-03-15 15:08:05 +01003065 PyObject *list = PyList_New(argc);
3066 if (list == NULL) {
3067 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 }
Victor Stinner74f65682019-03-15 15:08:05 +01003069
3070 for (Py_ssize_t i = 0; i < argc; i++) {
3071 PyObject *v = PyUnicode_FromWideChar(argv[i], -1);
3072 if (v == NULL) {
3073 Py_DECREF(list);
3074 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003075 }
Victor Stinner74f65682019-03-15 15:08:05 +01003076 PyList_SET_ITEM(list, i, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 }
Victor Stinner74f65682019-03-15 15:08:05 +01003078 return list;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003079}
3080
Victor Stinner11a247d2017-12-13 21:05:57 +01003081void
3082PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
Victor Stinnerd5dda982017-12-13 17:31:16 +01003083{
Victor Stinnerc4868252019-08-23 11:04:16 +01003084 wchar_t* empty_argv[1] = {L""};
Victor Stinner838f2642019-06-13 22:41:23 +02003085 PyThreadState *tstate = _PyThreadState_GET();
3086
Victor Stinner74f65682019-03-15 15:08:05 +01003087 if (argc < 1 || argv == NULL) {
3088 /* Ensure at least one (empty) argument is seen */
Victor Stinner74f65682019-03-15 15:08:05 +01003089 argv = empty_argv;
3090 argc = 1;
3091 }
3092
3093 PyObject *av = make_sys_argv(argc, argv);
Victor Stinnerd5dda982017-12-13 17:31:16 +01003094 if (av == NULL) {
Victor Stinner11a247d2017-12-13 21:05:57 +01003095 Py_FatalError("no mem for sys.argv");
Victor Stinnerd5dda982017-12-13 17:31:16 +01003096 }
Victor Stinner838f2642019-06-13 22:41:23 +02003097 if (sys_set_object(tstate, "argv", av) != 0) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01003098 Py_DECREF(av);
Victor Stinner11a247d2017-12-13 21:05:57 +01003099 Py_FatalError("can't assign sys.argv");
Victor Stinnerd5dda982017-12-13 17:31:16 +01003100 }
3101 Py_DECREF(av);
3102
3103 if (updatepath) {
3104 /* If argv[0] is not '-c' nor '-m', prepend argv[0] to sys.path.
3105 If argv[0] is a symlink, use the real path. */
Victor Stinner331a6a52019-05-27 16:39:22 +02003106 const PyWideStringList argv_list = {.length = argc, .items = argv};
Victor Stinnerdcf61712019-03-19 16:09:27 +01003107 PyObject *path0 = NULL;
3108 if (_PyPathConfig_ComputeSysPath0(&argv_list, &path0)) {
3109 if (path0 == NULL) {
3110 Py_FatalError("can't compute path0 from argv");
Victor Stinner11a247d2017-12-13 21:05:57 +01003111 }
Victor Stinnerdcf61712019-03-19 16:09:27 +01003112
Victor Stinner838f2642019-06-13 22:41:23 +02003113 PyObject *sys_path = sys_get_object_id(tstate, &PyId_path);
Victor Stinnerdcf61712019-03-19 16:09:27 +01003114 if (sys_path != NULL) {
3115 if (PyList_Insert(sys_path, 0, path0) < 0) {
3116 Py_DECREF(path0);
3117 Py_FatalError("can't prepend path0 to sys.path");
3118 }
3119 }
3120 Py_DECREF(path0);
Victor Stinner11a247d2017-12-13 21:05:57 +01003121 }
Victor Stinnerd5dda982017-12-13 17:31:16 +01003122 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003123}
Guido van Rossuma890e681998-05-12 14:59:24 +00003124
Antoine Pitrouf978fac2010-05-21 17:25:34 +00003125void
3126PySys_SetArgv(int argc, wchar_t **argv)
3127{
Christian Heimesad73a9c2013-08-10 16:36:18 +02003128 PySys_SetArgvEx(argc, argv, Py_IsolatedFlag == 0);
Antoine Pitrouf978fac2010-05-21 17:25:34 +00003129}
3130
Victor Stinner14284c22010-04-23 12:02:30 +00003131/* Reimplementation of PyFile_WriteString() no calling indirectly
3132 PyErr_CheckSignals(): avoid the call to PyObject_Str(). */
3133
3134static int
Victor Stinner79766632010-08-16 17:36:42 +00003135sys_pyfile_write_unicode(PyObject *unicode, PyObject *file)
Victor Stinner14284c22010-04-23 12:02:30 +00003136{
Victor Stinnerecccc4f2010-06-08 20:46:00 +00003137 if (file == NULL)
3138 return -1;
Jeroen Demeyerb1263d52019-06-28 11:49:00 +02003139 assert(unicode != NULL);
Jeroen Demeyer59ad1102019-07-11 10:59:05 +02003140 PyObject *result = _PyObject_CallMethodIdOneArg(file, &PyId_write, unicode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 if (result == NULL) {
Jeroen Demeyerb1263d52019-06-28 11:49:00 +02003142 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 }
Jeroen Demeyerb1263d52019-06-28 11:49:00 +02003144 Py_DECREF(result);
3145 return 0;
Victor Stinner14284c22010-04-23 12:02:30 +00003146}
3147
Victor Stinner79766632010-08-16 17:36:42 +00003148static int
3149sys_pyfile_write(const char *text, PyObject *file)
3150{
3151 PyObject *unicode = NULL;
3152 int err;
3153
3154 if (file == NULL)
3155 return -1;
3156
3157 unicode = PyUnicode_FromString(text);
3158 if (unicode == NULL)
3159 return -1;
3160
3161 err = sys_pyfile_write_unicode(unicode, file);
3162 Py_DECREF(unicode);
3163 return err;
3164}
Guido van Rossuma890e681998-05-12 14:59:24 +00003165
3166/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
3167 Adapted from code submitted by Just van Rossum.
3168
3169 PySys_WriteStdout(format, ...)
3170 PySys_WriteStderr(format, ...)
3171
3172 The first function writes to sys.stdout; the second to sys.stderr. When
3173 there is a problem, they write to the real (C level) stdout or stderr;
Guido van Rossum8442af31998-10-12 18:22:10 +00003174 no exceptions are raised.
Guido van Rossuma890e681998-05-12 14:59:24 +00003175
Victor Stinner14284c22010-04-23 12:02:30 +00003176 PyErr_CheckSignals() is not called to avoid the execution of the Python
Victor Stinner79766632010-08-16 17:36:42 +00003177 signal handlers: they may raise a new exception whereas sys_write()
3178 ignores all exceptions.
Victor Stinner14284c22010-04-23 12:02:30 +00003179
Guido van Rossuma890e681998-05-12 14:59:24 +00003180 Both take a printf-style format string as their first argument followed
3181 by a variable length argument list determined by the format string.
3182
3183 *** WARNING ***
3184
3185 The format should limit the total size of the formatted output string to
3186 1000 bytes. In particular, this means that no unrestricted "%s" formats
3187 should occur; these should be limited using "%.<N>s where <N> is a
3188 decimal number calculated so that <N> plus the maximum size of other
3189 formatted text does not exceed 1000 bytes. Also watch out for "%f",
3190 which can print hundreds of digits for very large numbers.
3191
3192 */
3193
3194static void
Victor Stinner09054372013-11-06 22:41:44 +01003195sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va)
Guido van Rossuma890e681998-05-12 14:59:24 +00003196{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 PyObject *file;
3198 PyObject *error_type, *error_value, *error_traceback;
3199 char buffer[1001];
3200 int written;
Victor Stinner838f2642019-06-13 22:41:23 +02003201 PyThreadState *tstate = _PyThreadState_GET();
Guido van Rossuma890e681998-05-12 14:59:24 +00003202
Victor Stinner838f2642019-06-13 22:41:23 +02003203 _PyErr_Fetch(tstate, &error_type, &error_value, &error_traceback);
3204 file = sys_get_object_id(tstate, key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
3206 if (sys_pyfile_write(buffer, file) != 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02003207 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003208 fputs(buffer, fp);
3209 }
3210 if (written < 0 || (size_t)written >= sizeof(buffer)) {
3211 const char *truncated = "... truncated";
Victor Stinner79766632010-08-16 17:36:42 +00003212 if (sys_pyfile_write(truncated, file) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213 fputs(truncated, fp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 }
Victor Stinner838f2642019-06-13 22:41:23 +02003215 _PyErr_Restore(tstate, error_type, error_value, error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +00003216}
3217
3218void
Guido van Rossuma890e681998-05-12 14:59:24 +00003219PySys_WriteStdout(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00003220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 va_list va;
Guido van Rossuma890e681998-05-12 14:59:24 +00003222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003224 sys_write(&PyId_stdout, stdout, format, va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003225 va_end(va);
Guido van Rossuma890e681998-05-12 14:59:24 +00003226}
3227
3228void
Guido van Rossuma890e681998-05-12 14:59:24 +00003229PySys_WriteStderr(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_stderr, stderr, format, va);
Victor Stinner79766632010-08-16 17:36:42 +00003235 va_end(va);
3236}
3237
3238static void
Victor Stinner09054372013-11-06 22:41:44 +01003239sys_format(_Py_Identifier *key, FILE *fp, const char *format, va_list va)
Victor Stinner79766632010-08-16 17:36:42 +00003240{
3241 PyObject *file, *message;
3242 PyObject *error_type, *error_value, *error_traceback;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02003243 const char *utf8;
Victor Stinner838f2642019-06-13 22:41:23 +02003244 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner79766632010-08-16 17:36:42 +00003245
Victor Stinner838f2642019-06-13 22:41:23 +02003246 _PyErr_Fetch(tstate, &error_type, &error_value, &error_traceback);
3247 file = sys_get_object_id(tstate, key);
Victor Stinner79766632010-08-16 17:36:42 +00003248 message = PyUnicode_FromFormatV(format, va);
3249 if (message != NULL) {
3250 if (sys_pyfile_write_unicode(message, file) != 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02003251 _PyErr_Clear(tstate);
Serhiy Storchaka06515832016-11-20 09:13:07 +02003252 utf8 = PyUnicode_AsUTF8(message);
Victor Stinner79766632010-08-16 17:36:42 +00003253 if (utf8 != NULL)
3254 fputs(utf8, fp);
3255 }
3256 Py_DECREF(message);
3257 }
Victor Stinner838f2642019-06-13 22:41:23 +02003258 _PyErr_Restore(tstate, error_type, error_value, error_traceback);
Victor Stinner79766632010-08-16 17:36:42 +00003259}
3260
3261void
3262PySys_FormatStdout(const char *format, ...)
3263{
3264 va_list va;
3265
3266 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003267 sys_format(&PyId_stdout, stdout, format, va);
Victor Stinner79766632010-08-16 17:36:42 +00003268 va_end(va);
3269}
3270
3271void
3272PySys_FormatStderr(const char *format, ...)
3273{
3274 va_list va;
3275
3276 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003277 sys_format(&PyId_stderr, stderr, format, va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 va_end(va);
Guido van Rossuma890e681998-05-12 14:59:24 +00003279}