blob: 6b3a1c38b9d9b902b80d0779fdfc08cd9989e1fd [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 Stinner4a3fe082020-04-14 14:26:24 +020020#include "pycore_ceval.h" // _Py_RecursionLimitLowerWaterMark()
21#include "pycore_pystate.h" // _PyThreadState_GET()
22#include "pycore_tupleobject.h"
Victor Stinner331a6a52019-05-27 16:39:22 +020023#include "pycore_initconfig.h"
Victor Stinner838f2642019-06-13 22:41:23 +020024#include "pycore_pathconfig.h"
25#include "pycore_pyerrors.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010026#include "pycore_pylifecycle.h"
27#include "pycore_pymem.h"
Steve Dowerb82e17e2019-05-23 08:45:22 -070028#include "pycore_tupleobject.h"
Victor Stinnerd5c355c2011-04-30 14:53:09 +020029#include "pythread.h"
Steve Dowerb82e17e2019-05-23 08:45:22 -070030#include "pydtrace.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031
Guido van Rossume2437a11992-03-23 18:20:18 +000032#include "osdefs.h"
Stefan Krah1845d142016-04-25 21:38:53 +020033#include <locale.h>
Guido van Rossum3f5da241990-12-20 15:06:42 +000034
Mark Hammond8696ebc2002-10-08 02:44:31 +000035#ifdef MS_WINDOWS
36#define WIN32_LEAN_AND_MEAN
Amaury Forgeot d'Arc06cfe952007-11-10 13:55:44 +000037#include <windows.h>
Mark Hammond8696ebc2002-10-08 02:44:31 +000038#endif /* MS_WINDOWS */
39
Guido van Rossum9b38a141996-09-11 23:12:24 +000040#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000041extern void *PyWin_DLLhModule;
Guido van Rossum6c1e5f21997-09-29 23:34:23 +000042/* A string loaded from the DLL at startup: */
43extern const char *PyWin_DLLVersionString;
Guido van Rossumc606fe11996-04-09 02:37:57 +000044#endif
45
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -080046/*[clinic input]
47module sys
48[clinic start generated code]*/
49/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3726b388feee8cea]*/
50
51#include "clinic/sysmodule.c.h"
52
Victor Stinnerbd303c12013-11-07 23:07:29 +010053_Py_IDENTIFIER(_);
54_Py_IDENTIFIER(__sizeof__);
Eric Snowdae02762017-09-14 00:35:58 -070055_Py_IDENTIFIER(_xoptions);
Victor Stinnerbd303c12013-11-07 23:07:29 +010056_Py_IDENTIFIER(buffer);
57_Py_IDENTIFIER(builtins);
58_Py_IDENTIFIER(encoding);
59_Py_IDENTIFIER(path);
60_Py_IDENTIFIER(stdout);
61_Py_IDENTIFIER(stderr);
Eric Snowdae02762017-09-14 00:35:58 -070062_Py_IDENTIFIER(warnoptions);
Victor Stinnerbd303c12013-11-07 23:07:29 +010063_Py_IDENTIFIER(write);
64
Victor Stinner838f2642019-06-13 22:41:23 +020065static PyObject *
66sys_get_object_id(PyThreadState *tstate, _Py_Identifier *key)
Victor Stinnerd67bd452013-11-06 22:36:40 +010067{
Victor Stinner838f2642019-06-13 22:41:23 +020068 PyObject *sd = tstate->interp->sysdict;
Victor Stinnercaba55b2018-08-03 15:33:52 +020069 if (sd == NULL) {
Victor Stinnerd67bd452013-11-06 22:36:40 +010070 return NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +020071 }
Victor Stinnerd67bd452013-11-06 22:36:40 +010072 return _PyDict_GetItemId(sd, key);
73}
74
75PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +020076_PySys_GetObjectId(_Py_Identifier *key)
77{
78 PyThreadState *tstate = _PyThreadState_GET();
79 return sys_get_object_id(tstate, key);
80}
81
82PyObject *
Neal Norwitzf3081322007-08-25 00:32:45 +000083PySys_GetObject(const char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084{
Victor Stinner838f2642019-06-13 22:41:23 +020085 PyThreadState *tstate = _PyThreadState_GET();
86 PyObject *sd = tstate->interp->sysdict;
Victor Stinnercaba55b2018-08-03 15:33:52 +020087 if (sd == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 return NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +020089 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 return PyDict_GetItemString(sd, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091}
92
Victor Stinner838f2642019-06-13 22:41:23 +020093static int
94sys_set_object_id(PyThreadState *tstate, _Py_Identifier *key, PyObject *v)
Victor Stinnerd67bd452013-11-06 22:36:40 +010095{
Victor Stinner838f2642019-06-13 22:41:23 +020096 PyObject *sd = tstate->interp->sysdict;
Victor Stinnerd67bd452013-11-06 22:36:40 +010097 if (v == NULL) {
Victor Stinnercaba55b2018-08-03 15:33:52 +020098 if (_PyDict_GetItemId(sd, key) == NULL) {
Victor Stinnerd67bd452013-11-06 22:36:40 +010099 return 0;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200100 }
101 else {
Victor Stinnerd67bd452013-11-06 22:36:40 +0100102 return _PyDict_DelItemId(sd, key);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200103 }
Victor Stinnerd67bd452013-11-06 22:36:40 +0100104 }
Victor Stinnercaba55b2018-08-03 15:33:52 +0200105 else {
Victor Stinnerd67bd452013-11-06 22:36:40 +0100106 return _PyDict_SetItemId(sd, key, v);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200107 }
Victor Stinnerd67bd452013-11-06 22:36:40 +0100108}
109
110int
Victor Stinner838f2642019-06-13 22:41:23 +0200111_PySys_SetObjectId(_Py_Identifier *key, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112{
Victor Stinner838f2642019-06-13 22:41:23 +0200113 PyThreadState *tstate = _PyThreadState_GET();
114 return sys_set_object_id(tstate, key, v);
115}
116
117static int
118sys_set_object(PyThreadState *tstate, const char *name, PyObject *v)
119{
120 PyObject *sd = tstate->interp->sysdict;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 if (v == NULL) {
Victor Stinnercaba55b2018-08-03 15:33:52 +0200122 if (PyDict_GetItemString(sd, name) == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 return 0;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200124 }
125 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 return PyDict_DelItemString(sd, name);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200127 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 }
Victor Stinnercaba55b2018-08-03 15:33:52 +0200129 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 return PyDict_SetItemString(sd, name, v);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200131 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132}
133
Victor Stinner838f2642019-06-13 22:41:23 +0200134int
135PySys_SetObject(const char *name, PyObject *v)
Steve Dowerb82e17e2019-05-23 08:45:22 -0700136{
Victor Stinner838f2642019-06-13 22:41:23 +0200137 PyThreadState *tstate = _PyThreadState_GET();
138 return sys_set_object(tstate, name, v);
139}
140
Victor Stinner08faf002020-03-26 18:57:32 +0100141
Victor Stinner838f2642019-06-13 22:41:23 +0200142static int
Victor Stinner08faf002020-03-26 18:57:32 +0100143should_audit(PyInterpreterState *is)
Victor Stinner838f2642019-06-13 22:41:23 +0200144{
Victor Stinner08faf002020-03-26 18:57:32 +0100145 /* tstate->interp cannot be NULL, but test it just in case
146 for extra safety */
147 assert(is != NULL);
148 if (!is) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700149 return 0;
150 }
Victor Stinner08faf002020-03-26 18:57:32 +0100151 return (is->runtime->audit_hook_head
152 || is->audit_hooks
153 || PyDTrace_AUDIT_ENABLED());
Steve Dowerb82e17e2019-05-23 08:45:22 -0700154}
155
Steve Dowerb82e17e2019-05-23 08:45:22 -0700156
Victor Stinner08faf002020-03-26 18:57:32 +0100157static int
158sys_audit_tstate(PyThreadState *ts, const char *event,
159 const char *argFormat, va_list vargs)
160{
Steve Dowerb82e17e2019-05-23 08:45:22 -0700161 /* N format is inappropriate, because you do not know
162 whether the reference is consumed by the call.
163 Assert rather than exception for perf reasons */
164 assert(!argFormat || !strchr(argFormat, 'N'));
165
Victor Stinner08faf002020-03-26 18:57:32 +0100166 if (!ts) {
167 /* Audit hooks cannot be called with a NULL thread state */
Steve Dowerb82e17e2019-05-23 08:45:22 -0700168 return 0;
169 }
170
Victor Stinner08faf002020-03-26 18:57:32 +0100171 /* The current implementation cannot be called if tstate is not
172 the current Python thread state. */
173 assert(ts == _PyThreadState_GET());
174
175 /* Early exit when no hooks are registered */
176 PyInterpreterState *is = ts->interp;
177 if (!should_audit(is)) {
178 return 0;
179 }
180
181 PyObject *eventName = NULL;
182 PyObject *eventArgs = NULL;
183 PyObject *hooks = NULL;
184 PyObject *hook = NULL;
185 int res = -1;
186
Steve Dowerb82e17e2019-05-23 08:45:22 -0700187 int dtrace = PyDTrace_AUDIT_ENABLED();
188
189 PyObject *exc_type, *exc_value, *exc_tb;
Victor Stinner08faf002020-03-26 18:57:32 +0100190 _PyErr_Fetch(ts, &exc_type, &exc_value, &exc_tb);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700191
192 /* Initialize event args now */
193 if (argFormat && argFormat[0]) {
Victor Stinner08faf002020-03-26 18:57:32 +0100194 eventArgs = _Py_VaBuildValue_SizeT(argFormat, vargs);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700195 if (eventArgs && !PyTuple_Check(eventArgs)) {
196 PyObject *argTuple = PyTuple_Pack(1, eventArgs);
197 Py_DECREF(eventArgs);
198 eventArgs = argTuple;
199 }
Victor Stinner08faf002020-03-26 18:57:32 +0100200 }
201 else {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700202 eventArgs = PyTuple_New(0);
203 }
204 if (!eventArgs) {
205 goto exit;
206 }
207
208 /* Call global hooks */
Victor Stinner08faf002020-03-26 18:57:32 +0100209 _Py_AuditHookEntry *e = is->runtime->audit_hook_head;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700210 for (; e; e = e->next) {
211 if (e->hookCFunction(event, eventArgs, e->userData) < 0) {
212 goto exit;
213 }
214 }
215
216 /* Dtrace USDT point */
217 if (dtrace) {
Andy Lestere6be9b52020-02-11 20:28:35 -0600218 PyDTrace_AUDIT(event, (void *)eventArgs);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700219 }
220
221 /* Call interpreter hooks */
Victor Stinner08faf002020-03-26 18:57:32 +0100222 if (is->audit_hooks) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700223 eventName = PyUnicode_FromString(event);
224 if (!eventName) {
225 goto exit;
226 }
227
228 hooks = PyObject_GetIter(is->audit_hooks);
229 if (!hooks) {
230 goto exit;
231 }
232
233 /* Disallow tracing in hooks unless explicitly enabled */
234 ts->tracing++;
235 ts->use_tracing = 0;
236 while ((hook = PyIter_Next(hooks)) != NULL) {
Serhiy Storchaka41c57b32019-09-01 12:03:39 +0300237 _Py_IDENTIFIER(__cantrace__);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700238 PyObject *o;
Serhiy Storchaka41c57b32019-09-01 12:03:39 +0300239 int canTrace = _PyObject_LookupAttrId(hook, &PyId___cantrace__, &o);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700240 if (o) {
241 canTrace = PyObject_IsTrue(o);
242 Py_DECREF(o);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700243 }
244 if (canTrace < 0) {
245 break;
246 }
247 if (canTrace) {
248 ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc);
249 ts->tracing--;
250 }
Victor Stinner08faf002020-03-26 18:57:32 +0100251 PyObject* args[2] = {eventName, eventArgs};
252 o = _PyObject_FastCallTstate(ts, hook, args, 2);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700253 if (canTrace) {
254 ts->tracing++;
255 ts->use_tracing = 0;
256 }
257 if (!o) {
258 break;
259 }
260 Py_DECREF(o);
261 Py_CLEAR(hook);
262 }
263 ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc);
264 ts->tracing--;
Victor Stinner838f2642019-06-13 22:41:23 +0200265 if (_PyErr_Occurred(ts)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700266 goto exit;
267 }
268 }
269
270 res = 0;
271
272exit:
273 Py_XDECREF(hook);
274 Py_XDECREF(hooks);
275 Py_XDECREF(eventName);
276 Py_XDECREF(eventArgs);
277
Victor Stinner08faf002020-03-26 18:57:32 +0100278 if (!res) {
279 _PyErr_Restore(ts, exc_type, exc_value, exc_tb);
280 }
281 else {
282 assert(_PyErr_Occurred(ts));
283 Py_XDECREF(exc_type);
284 Py_XDECREF(exc_value);
285 Py_XDECREF(exc_tb);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700286 }
287
288 return res;
289}
290
Victor Stinner08faf002020-03-26 18:57:32 +0100291int
292_PySys_Audit(PyThreadState *tstate, const char *event,
293 const char *argFormat, ...)
294{
295 va_list vargs;
296#ifdef HAVE_STDARG_PROTOTYPES
297 va_start(vargs, argFormat);
298#else
299 va_start(vargs);
300#endif
301 int res = sys_audit_tstate(tstate, event, argFormat, vargs);
302 va_end(vargs);
303 return res;
304}
305
306int
307PySys_Audit(const char *event, const char *argFormat, ...)
308{
309 PyThreadState *tstate = _PyThreadState_GET();
310 va_list vargs;
311#ifdef HAVE_STDARG_PROTOTYPES
312 va_start(vargs, argFormat);
313#else
314 va_start(vargs);
315#endif
316 int res = sys_audit_tstate(tstate, event, argFormat, vargs);
317 va_end(vargs);
318 return res;
319}
320
Steve Dowerb82e17e2019-05-23 08:45:22 -0700321/* We expose this function primarily for our own cleanup during
322 * finalization. In general, it should not need to be called,
Victor Stinner08faf002020-03-26 18:57:32 +0100323 * and as such the function is not exported.
324 *
325 * Must be finalizing to clear hooks */
Victor Stinner838f2642019-06-13 22:41:23 +0200326void
Victor Stinner08faf002020-03-26 18:57:32 +0100327_PySys_ClearAuditHooks(PyThreadState *ts)
Victor Stinner838f2642019-06-13 22:41:23 +0200328{
Victor Stinner08faf002020-03-26 18:57:32 +0100329 assert(ts != NULL);
330 if (!ts) {
331 return;
332 }
333
334 _PyRuntimeState *runtime = ts->interp->runtime;
Victor Stinner7b3c2522020-03-07 00:24:23 +0100335 PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(runtime);
Victor Stinner08faf002020-03-26 18:57:32 +0100336 assert(finalizing == ts);
337 if (finalizing != ts) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700338 return;
Victor Stinner838f2642019-06-13 22:41:23 +0200339 }
Steve Dowerb82e17e2019-05-23 08:45:22 -0700340
Victor Stinnerda7933e2020-04-13 03:04:28 +0200341 const PyConfig *config = _PyInterpreterState_GetConfig(ts->interp);
Victor Stinner838f2642019-06-13 22:41:23 +0200342 if (config->verbose) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700343 PySys_WriteStderr("# clear sys.audit hooks\n");
344 }
345
346 /* Hooks can abort later hooks for this event, but cannot
347 abort the clear operation itself. */
Victor Stinner08faf002020-03-26 18:57:32 +0100348 _PySys_Audit(ts, "cpython._PySys_ClearAuditHooks", NULL);
Victor Stinner838f2642019-06-13 22:41:23 +0200349 _PyErr_Clear(ts);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700350
Victor Stinner08faf002020-03-26 18:57:32 +0100351 _Py_AuditHookEntry *e = runtime->audit_hook_head, *n;
352 runtime->audit_hook_head = NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700353 while (e) {
354 n = e->next;
355 PyMem_RawFree(e);
356 e = n;
357 }
358}
359
360int
361PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)
362{
Victor Stinner08faf002020-03-26 18:57:32 +0100363 /* tstate can be NULL, so access directly _PyRuntime:
364 PySys_AddAuditHook() can be called before Python is initialized. */
Victor Stinner838f2642019-06-13 22:41:23 +0200365 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner08faf002020-03-26 18:57:32 +0100366 PyThreadState *tstate;
367 if (runtime->initialized) {
368 tstate = _PyRuntimeState_GetThreadState(runtime);
369 }
370 else {
371 tstate = NULL;
372 }
Victor Stinner838f2642019-06-13 22:41:23 +0200373
Steve Dowerb82e17e2019-05-23 08:45:22 -0700374 /* Invoke existing audit hooks to allow them an opportunity to abort. */
375 /* Cannot invoke hooks until we are initialized */
Victor Stinner08faf002020-03-26 18:57:32 +0100376 if (tstate != NULL) {
377 if (_PySys_Audit(tstate, "sys.addaudithook", NULL) < 0) {
Steve Dowerbea33f52019-11-28 08:46:11 -0800378 if (_PyErr_ExceptionMatches(tstate, PyExc_RuntimeError)) {
379 /* We do not report errors derived from RuntimeError */
Victor Stinner838f2642019-06-13 22:41:23 +0200380 _PyErr_Clear(tstate);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700381 return 0;
382 }
383 return -1;
384 }
385 }
386
Victor Stinner08faf002020-03-26 18:57:32 +0100387 _Py_AuditHookEntry *e = runtime->audit_hook_head;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700388 if (!e) {
389 e = (_Py_AuditHookEntry*)PyMem_RawMalloc(sizeof(_Py_AuditHookEntry));
Victor Stinner08faf002020-03-26 18:57:32 +0100390 runtime->audit_hook_head = e;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700391 } else {
Victor Stinner838f2642019-06-13 22:41:23 +0200392 while (e->next) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700393 e = e->next;
Victor Stinner838f2642019-06-13 22:41:23 +0200394 }
Steve Dowerb82e17e2019-05-23 08:45:22 -0700395 e = e->next = (_Py_AuditHookEntry*)PyMem_RawMalloc(
396 sizeof(_Py_AuditHookEntry));
397 }
398
399 if (!e) {
Victor Stinner08faf002020-03-26 18:57:32 +0100400 if (tstate != NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200401 _PyErr_NoMemory(tstate);
402 }
Steve Dowerb82e17e2019-05-23 08:45:22 -0700403 return -1;
404 }
405
406 e->next = NULL;
407 e->hookCFunction = (Py_AuditHookFunction)hook;
408 e->userData = userData;
409
410 return 0;
411}
412
413/*[clinic input]
414sys.addaudithook
415
416 hook: object
417
418Adds a new audit hook callback.
419[clinic start generated code]*/
420
421static PyObject *
422sys_addaudithook_impl(PyObject *module, PyObject *hook)
423/*[clinic end generated code: output=4f9c17aaeb02f44e input=0f3e191217a45e34]*/
424{
Victor Stinner838f2642019-06-13 22:41:23 +0200425 PyThreadState *tstate = _PyThreadState_GET();
426
Steve Dowerb82e17e2019-05-23 08:45:22 -0700427 /* Invoke existing audit hooks to allow them an opportunity to abort. */
Victor Stinner08faf002020-03-26 18:57:32 +0100428 if (_PySys_Audit(tstate, "sys.addaudithook", NULL) < 0) {
Victor Stinner838f2642019-06-13 22:41:23 +0200429 if (_PyErr_ExceptionMatches(tstate, PyExc_Exception)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700430 /* We do not report errors derived from Exception */
Victor Stinner838f2642019-06-13 22:41:23 +0200431 _PyErr_Clear(tstate);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700432 Py_RETURN_NONE;
433 }
434 return NULL;
435 }
436
Victor Stinner838f2642019-06-13 22:41:23 +0200437 PyInterpreterState *is = tstate->interp;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700438 if (is->audit_hooks == NULL) {
439 is->audit_hooks = PyList_New(0);
440 if (is->audit_hooks == NULL) {
441 return NULL;
442 }
443 }
444
445 if (PyList_Append(is->audit_hooks, hook) < 0) {
446 return NULL;
447 }
448
449 Py_RETURN_NONE;
450}
451
452PyDoc_STRVAR(audit_doc,
453"audit(event, *args)\n\
454\n\
455Passes the event to any audit hooks that are attached.");
456
457static PyObject *
458sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc)
459{
Victor Stinner838f2642019-06-13 22:41:23 +0200460 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner08faf002020-03-26 18:57:32 +0100461 assert(tstate != NULL);
Victor Stinner838f2642019-06-13 22:41:23 +0200462
Steve Dowerb82e17e2019-05-23 08:45:22 -0700463 if (argc == 0) {
Victor Stinner838f2642019-06-13 22:41:23 +0200464 _PyErr_SetString(tstate, PyExc_TypeError,
465 "audit() missing 1 required positional argument: "
466 "'event'");
Steve Dowerb82e17e2019-05-23 08:45:22 -0700467 return NULL;
468 }
469
Victor Stinner08faf002020-03-26 18:57:32 +0100470 if (!should_audit(tstate->interp)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700471 Py_RETURN_NONE;
472 }
473
474 PyObject *auditEvent = args[0];
475 if (!auditEvent) {
Victor Stinner838f2642019-06-13 22:41:23 +0200476 _PyErr_SetString(tstate, PyExc_TypeError,
477 "expected str for argument 'event'");
Steve Dowerb82e17e2019-05-23 08:45:22 -0700478 return NULL;
479 }
480 if (!PyUnicode_Check(auditEvent)) {
Victor Stinner838f2642019-06-13 22:41:23 +0200481 _PyErr_Format(tstate, PyExc_TypeError,
482 "expected str for argument 'event', not %.200s",
483 Py_TYPE(auditEvent)->tp_name);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700484 return NULL;
485 }
486 const char *event = PyUnicode_AsUTF8(auditEvent);
487 if (!event) {
488 return NULL;
489 }
490
491 PyObject *auditArgs = _PyTuple_FromArray(args + 1, argc - 1);
492 if (!auditArgs) {
493 return NULL;
494 }
495
Victor Stinner08faf002020-03-26 18:57:32 +0100496 int res = _PySys_Audit(tstate, event, "O", auditArgs);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700497 Py_DECREF(auditArgs);
498
499 if (res < 0) {
500 return NULL;
501 }
502
503 Py_RETURN_NONE;
504}
505
506
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400507static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200508sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400509{
Victor Stinner838f2642019-06-13 22:41:23 +0200510 PyThreadState *tstate = _PyThreadState_GET();
511 assert(!_PyErr_Occurred(tstate));
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300512 char *envar = Py_GETENV("PYTHONBREAKPOINT");
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400513
514 if (envar == NULL || strlen(envar) == 0) {
515 envar = "pdb.set_trace";
516 }
517 else if (!strcmp(envar, "0")) {
518 /* The breakpoint is explicitly no-op'd. */
519 Py_RETURN_NONE;
520 }
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300521 /* According to POSIX the string returned by getenv() might be invalidated
522 * or the string content might be overwritten by a subsequent call to
523 * getenv(). Since importing a module can performs the getenv() calls,
524 * we need to save a copy of envar. */
525 envar = _PyMem_RawStrdup(envar);
526 if (envar == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200527 _PyErr_NoMemory(tstate);
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300528 return NULL;
529 }
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200530 const char *last_dot = strrchr(envar, '.');
531 const char *attrname = NULL;
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400532 PyObject *modulepath = NULL;
533
534 if (last_dot == NULL) {
535 /* The breakpoint is a built-in, e.g. PYTHONBREAKPOINT=int */
536 modulepath = PyUnicode_FromString("builtins");
537 attrname = envar;
538 }
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200539 else if (last_dot != envar) {
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400540 /* Split on the last dot; */
541 modulepath = PyUnicode_FromStringAndSize(envar, last_dot - envar);
542 attrname = last_dot + 1;
543 }
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200544 else {
545 goto warn;
546 }
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400547 if (modulepath == NULL) {
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300548 PyMem_RawFree(envar);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400549 return NULL;
550 }
551
Anthony Sottiledce345c2018-11-01 10:25:05 -0700552 PyObject *module = PyImport_Import(modulepath);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400553 Py_DECREF(modulepath);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400554
555 if (module == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200556 if (_PyErr_ExceptionMatches(tstate, PyExc_ImportError)) {
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200557 goto warn;
558 }
559 PyMem_RawFree(envar);
560 return NULL;
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400561 }
562
563 PyObject *hook = PyObject_GetAttrString(module, attrname);
564 Py_DECREF(module);
565
566 if (hook == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200567 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200568 goto warn;
569 }
570 PyMem_RawFree(envar);
571 return NULL;
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400572 }
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300573 PyMem_RawFree(envar);
Petr Viktorinffd97532020-02-11 17:46:57 +0100574 PyObject *retval = PyObject_Vectorcall(hook, args, nargs, keywords);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400575 Py_DECREF(hook);
576 return retval;
577
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200578 warn:
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400579 /* If any of the imports went wrong, then warn and ignore. */
Victor Stinner838f2642019-06-13 22:41:23 +0200580 _PyErr_Clear(tstate);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400581 int status = PyErr_WarnFormat(
582 PyExc_RuntimeWarning, 0,
583 "Ignoring unimportable $PYTHONBREAKPOINT: \"%s\"", envar);
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300584 PyMem_RawFree(envar);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400585 if (status < 0) {
586 /* Printing the warning raised an exception. */
587 return NULL;
588 }
589 /* The warning was (probably) issued. */
590 Py_RETURN_NONE;
591}
592
593PyDoc_STRVAR(breakpointhook_doc,
594"breakpointhook(*args, **kws)\n"
595"\n"
596"This hook function is called by built-in breakpoint().\n"
597);
598
Victor Stinner13d49ee2010-12-04 17:24:33 +0000599/* Write repr(o) to sys.stdout using sys.stdout.encoding and 'backslashreplace'
600 error handler. If sys.stdout has a buffer attribute, use
601 sys.stdout.buffer.write(encoded), otherwise redecode the string and use
602 sys.stdout.write(redecoded).
603
604 Helper function for sys_displayhook(). */
605static int
Andy Lesterda4d6562020-03-05 22:34:36 -0600606sys_displayhook_unencodable(PyObject *outf, PyObject *o)
Victor Stinner13d49ee2010-12-04 17:24:33 +0000607{
608 PyObject *stdout_encoding = NULL;
609 PyObject *encoded, *escaped_str, *repr_str, *buffer, *result;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +0200610 const char *stdout_encoding_str;
Victor Stinner13d49ee2010-12-04 17:24:33 +0000611 int ret;
612
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200613 stdout_encoding = _PyObject_GetAttrId(outf, &PyId_encoding);
Victor Stinner13d49ee2010-12-04 17:24:33 +0000614 if (stdout_encoding == NULL)
615 goto error;
Serhiy Storchaka06515832016-11-20 09:13:07 +0200616 stdout_encoding_str = PyUnicode_AsUTF8(stdout_encoding);
Victor Stinner13d49ee2010-12-04 17:24:33 +0000617 if (stdout_encoding_str == NULL)
618 goto error;
619
620 repr_str = PyObject_Repr(o);
621 if (repr_str == NULL)
622 goto error;
623 encoded = PyUnicode_AsEncodedString(repr_str,
624 stdout_encoding_str,
625 "backslashreplace");
626 Py_DECREF(repr_str);
627 if (encoded == NULL)
628 goto error;
629
Serhiy Storchaka41c57b32019-09-01 12:03:39 +0300630 if (_PyObject_LookupAttrId(outf, &PyId_buffer, &buffer) < 0) {
631 Py_DECREF(encoded);
632 goto error;
633 }
Victor Stinner13d49ee2010-12-04 17:24:33 +0000634 if (buffer) {
Jeroen Demeyer59ad1102019-07-11 10:59:05 +0200635 result = _PyObject_CallMethodIdOneArg(buffer, &PyId_write, encoded);
Victor Stinner13d49ee2010-12-04 17:24:33 +0000636 Py_DECREF(buffer);
637 Py_DECREF(encoded);
638 if (result == NULL)
639 goto error;
640 Py_DECREF(result);
641 }
642 else {
Victor Stinner13d49ee2010-12-04 17:24:33 +0000643 escaped_str = PyUnicode_FromEncodedObject(encoded,
644 stdout_encoding_str,
645 "strict");
646 Py_DECREF(encoded);
647 if (PyFile_WriteObject(escaped_str, outf, Py_PRINT_RAW) != 0) {
648 Py_DECREF(escaped_str);
649 goto error;
650 }
651 Py_DECREF(escaped_str);
652 }
653 ret = 0;
654 goto finally;
655
656error:
657 ret = -1;
658finally:
659 Py_XDECREF(stdout_encoding);
660 return ret;
661}
662
Tal Einatede0b6f2018-12-31 17:12:08 +0200663/*[clinic input]
664sys.displayhook
665
666 object as o: object
667 /
668
669Print an object to sys.stdout and also save it in builtins._
670[clinic start generated code]*/
671
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000672static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200673sys_displayhook(PyObject *module, PyObject *o)
674/*[clinic end generated code: output=347477d006df92ed input=08ba730166d7ef72]*/
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000675{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 PyObject *outf;
Victor Stinnerd02fbb82013-11-06 18:27:13 +0100677 PyObject *builtins;
678 static PyObject *newline = NULL;
Victor Stinner838f2642019-06-13 22:41:23 +0200679 PyThreadState *tstate = _PyThreadState_GET();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000680
Eric Snow3f9eee62017-09-15 16:35:20 -0600681 builtins = _PyImport_GetModuleId(&PyId_builtins);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 if (builtins == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200683 if (!_PyErr_Occurred(tstate)) {
684 _PyErr_SetString(tstate, PyExc_RuntimeError,
685 "lost builtins module");
Stefan Krah027b09c2019-03-25 21:50:58 +0100686 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 return NULL;
688 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600689 Py_DECREF(builtins);
Moshe Zadka03897ea2001-07-23 13:32:43 +0000690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 /* Print value except if None */
692 /* After printing, also assign to '_' */
693 /* Before, set '_' to None to avoid recursion */
694 if (o == Py_None) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200695 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200697 if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +0200699 outf = sys_get_object_id(tstate, &PyId_stdout);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 if (outf == NULL || outf == Py_None) {
Victor Stinner838f2642019-06-13 22:41:23 +0200701 _PyErr_SetString(tstate, PyExc_RuntimeError, "lost sys.stdout");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 return NULL;
703 }
Victor Stinner13d49ee2010-12-04 17:24:33 +0000704 if (PyFile_WriteObject(o, outf, 0) != 0) {
Victor Stinner838f2642019-06-13 22:41:23 +0200705 if (_PyErr_ExceptionMatches(tstate, PyExc_UnicodeEncodeError)) {
Andy Lesterda4d6562020-03-05 22:34:36 -0600706 int err;
Victor Stinner13d49ee2010-12-04 17:24:33 +0000707 /* repr(o) is not encodable to sys.stdout.encoding with
708 * sys.stdout.errors error handler (which is probably 'strict') */
Victor Stinner838f2642019-06-13 22:41:23 +0200709 _PyErr_Clear(tstate);
Andy Lesterda4d6562020-03-05 22:34:36 -0600710 err = sys_displayhook_unencodable(outf, o);
Victor Stinner838f2642019-06-13 22:41:23 +0200711 if (err) {
Victor Stinner13d49ee2010-12-04 17:24:33 +0000712 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +0200713 }
Victor Stinner13d49ee2010-12-04 17:24:33 +0000714 }
715 else {
716 return NULL;
717 }
718 }
Victor Stinnerd02fbb82013-11-06 18:27:13 +0100719 if (newline == NULL) {
720 newline = PyUnicode_FromString("\n");
721 if (newline == NULL)
722 return NULL;
723 }
724 if (PyFile_WriteObject(newline, outf, Py_PRINT_RAW) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 return NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200726 if (_PyObject_SetAttrId(builtins, &PyId__, o) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 return NULL;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200728 Py_RETURN_NONE;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000729}
730
Tal Einatede0b6f2018-12-31 17:12:08 +0200731
732/*[clinic input]
733sys.excepthook
734
735 exctype: object
736 value: object
737 traceback: object
738 /
739
740Handle an exception by displaying it with a traceback on sys.stderr.
741[clinic start generated code]*/
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000742
743static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200744sys_excepthook_impl(PyObject *module, PyObject *exctype, PyObject *value,
745 PyObject *traceback)
746/*[clinic end generated code: output=18d99fdda21b6b5e input=ecf606fa826f19d9]*/
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000747{
Tal Einatede0b6f2018-12-31 17:12:08 +0200748 PyErr_Display(exctype, value, traceback);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200749 Py_RETURN_NONE;
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000750}
751
Tal Einatede0b6f2018-12-31 17:12:08 +0200752
753/*[clinic input]
754sys.exc_info
755
756Return current exception information: (type, value, traceback).
757
758Return information about the most recent exception caught by an except
759clause in the current stack frame or in an older stack frame.
760[clinic start generated code]*/
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000761
762static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200763sys_exc_info_impl(PyObject *module)
764/*[clinic end generated code: output=3afd0940cf3a4d30 input=b5c5bf077788a3e5]*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000765{
Victor Stinner50b48572018-11-01 01:51:40 +0100766 _PyErr_StackItem *err_info = _PyErr_GetTopmostException(_PyThreadState_GET());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 return Py_BuildValue(
768 "(OOO)",
Mark Shannonae3087c2017-10-22 22:41:51 +0100769 err_info->exc_type != NULL ? err_info->exc_type : Py_None,
770 err_info->exc_value != NULL ? err_info->exc_value : Py_None,
771 err_info->exc_traceback != NULL ?
772 err_info->exc_traceback : Py_None);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000773}
774
Tal Einatede0b6f2018-12-31 17:12:08 +0200775
776/*[clinic input]
Victor Stinneref9d9b62019-05-22 11:28:22 +0200777sys.unraisablehook
778
779 unraisable: object
780 /
781
782Handle an unraisable exception.
783
784The unraisable argument has the following attributes:
785
786* exc_type: Exception type.
Victor Stinner71c52e32019-05-27 08:57:14 +0200787* exc_value: Exception value, can be None.
788* exc_traceback: Exception traceback, can be None.
789* err_msg: Error message, can be None.
790* object: Object causing the exception, can be None.
Victor Stinneref9d9b62019-05-22 11:28:22 +0200791[clinic start generated code]*/
792
793static PyObject *
794sys_unraisablehook(PyObject *module, PyObject *unraisable)
Victor Stinner71c52e32019-05-27 08:57:14 +0200795/*[clinic end generated code: output=bb92838b32abaa14 input=ec3af148294af8d3]*/
Victor Stinneref9d9b62019-05-22 11:28:22 +0200796{
797 return _PyErr_WriteUnraisableDefaultHook(unraisable);
798}
799
800
801/*[clinic input]
Tal Einatede0b6f2018-12-31 17:12:08 +0200802sys.exit
803
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300804 status: object = None
Tal Einatede0b6f2018-12-31 17:12:08 +0200805 /
806
807Exit the interpreter by raising SystemExit(status).
808
809If the status is omitted or None, it defaults to zero (i.e., success).
810If the status is an integer, it will be used as the system exit status.
811If it is another kind of object, it will be printed and the system
812exit status will be one (i.e., failure).
813[clinic start generated code]*/
Guido van Rossum46d3dc32003-03-01 03:20:41 +0000814
815static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200816sys_exit_impl(PyObject *module, PyObject *status)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300817/*[clinic end generated code: output=13870986c1ab2ec0 input=b86ca9497baa94f2]*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000818{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 /* Raise SystemExit so callers may catch it or clean up. */
Victor Stinner838f2642019-06-13 22:41:23 +0200820 PyThreadState *tstate = _PyThreadState_GET();
821 _PyErr_SetObject(tstate, PyExc_SystemExit, status);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000823}
824
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000825
Martin v. Löwis107b7da2001-11-09 20:59:39 +0000826
Tal Einatede0b6f2018-12-31 17:12:08 +0200827/*[clinic input]
828sys.getdefaultencoding
829
830Return the current default encoding used by the Unicode implementation.
831[clinic start generated code]*/
832
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000833static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200834sys_getdefaultencoding_impl(PyObject *module)
835/*[clinic end generated code: output=256d19dfcc0711e6 input=d416856ddbef6909]*/
Fred Drake8b4d01d2000-05-09 19:57:01 +0000836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 return PyUnicode_FromString(PyUnicode_GetDefaultEncoding());
Fred Drake8b4d01d2000-05-09 19:57:01 +0000838}
839
Tal Einatede0b6f2018-12-31 17:12:08 +0200840/*[clinic input]
841sys.getfilesystemencoding
842
843Return the encoding used to convert Unicode filenames to OS filenames.
844[clinic start generated code]*/
Fred Drake8b4d01d2000-05-09 19:57:01 +0000845
846static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200847sys_getfilesystemencoding_impl(PyObject *module)
848/*[clinic end generated code: output=1dc4bdbe9be44aa7 input=8475f8649b8c7d8c]*/
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000849{
Victor Stinner81a7be32020-04-14 15:14:01 +0200850 PyInterpreterState *interp = _PyInterpreterState_GET();
Victor Stinnerda7933e2020-04-13 03:04:28 +0200851 const PyConfig *config = _PyInterpreterState_GetConfig(interp);
Victor Stinner709d23d2019-05-02 14:56:30 -0400852 return PyUnicode_FromWideChar(config->filesystem_encoding, -1);
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000853}
854
Tal Einatede0b6f2018-12-31 17:12:08 +0200855/*[clinic input]
856sys.getfilesystemencodeerrors
857
858Return the error mode used Unicode to OS filename conversion.
859[clinic start generated code]*/
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000860
Martin v. Löwis04dc25c2008-10-03 16:09:28 +0000861static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200862sys_getfilesystemencodeerrors_impl(PyObject *module)
863/*[clinic end generated code: output=ba77b36bbf7c96f5 input=22a1e8365566f1e5]*/
Steve Dowercc16be82016-09-08 10:35:16 -0700864{
Victor Stinner81a7be32020-04-14 15:14:01 +0200865 PyInterpreterState *interp = _PyInterpreterState_GET();
Victor Stinnerda7933e2020-04-13 03:04:28 +0200866 const PyConfig *config = _PyInterpreterState_GetConfig(interp);
Victor Stinner709d23d2019-05-02 14:56:30 -0400867 return PyUnicode_FromWideChar(config->filesystem_errors, -1);
Steve Dowercc16be82016-09-08 10:35:16 -0700868}
869
Tal Einatede0b6f2018-12-31 17:12:08 +0200870/*[clinic input]
871sys.intern
872
873 string as s: unicode
874 /
875
876``Intern'' the given string.
877
878This enters the string in the (global) table of interned strings whose
879purpose is to speed up dictionary lookups. Return the string itself or
880the previously interned string object with the same value.
881[clinic start generated code]*/
Steve Dowercc16be82016-09-08 10:35:16 -0700882
883static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200884sys_intern_impl(PyObject *module, PyObject *s)
885/*[clinic end generated code: output=be680c24f5c9e5d6 input=849483c006924e2f]*/
Georg Brandl66a796e2006-12-19 20:50:34 +0000886{
Victor Stinner838f2642019-06-13 22:41:23 +0200887 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 if (PyUnicode_CheckExact(s)) {
889 Py_INCREF(s);
890 PyUnicode_InternInPlace(&s);
891 return s;
892 }
893 else {
Victor Stinner838f2642019-06-13 22:41:23 +0200894 _PyErr_Format(tstate, PyExc_TypeError,
Victor Stinnera102ed72020-02-07 02:24:48 +0100895 "can't intern %.400s", Py_TYPE(s)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 return NULL;
897 }
Georg Brandl66a796e2006-12-19 20:50:34 +0000898}
899
Georg Brandl66a796e2006-12-19 20:50:34 +0000900
Fred Drake5755ce62001-06-27 19:19:46 +0000901/*
902 * Cached interned string objects used for calling the profile and
903 * trace functions. Initialized by trace_init().
904 */
Nick Coghlan5a851672017-09-08 10:14:16 +1000905static PyObject *whatstrings[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
Fred Drake5755ce62001-06-27 19:19:46 +0000906
907static int
908trace_init(void)
909{
Nick Coghlan5a851672017-09-08 10:14:16 +1000910 static const char * const whatnames[8] = {
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200911 "call", "exception", "line", "return",
Nick Coghlan5a851672017-09-08 10:14:16 +1000912 "c_call", "c_exception", "c_return",
913 "opcode"
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200914 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 PyObject *name;
916 int i;
Nick Coghlan5a851672017-09-08 10:14:16 +1000917 for (i = 0; i < 8; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 if (whatstrings[i] == NULL) {
919 name = PyUnicode_InternFromString(whatnames[i]);
920 if (name == NULL)
921 return -1;
922 whatstrings[i] = name;
923 }
924 }
925 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +0000926}
927
928
929static PyObject *
Victor Stinner309d7cc2020-03-13 16:39:12 +0100930call_trampoline(PyThreadState *tstate, PyObject* callback,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 PyFrameObject *frame, int what, PyObject *arg)
Fred Drake5755ce62001-06-27 19:19:46 +0000932{
Victor Stinner78da82b2016-08-20 01:22:57 +0200933 if (PyFrame_FastToLocalsWithError(frame) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 return NULL;
Victor Stinner78da82b2016-08-20 01:22:57 +0200935 }
Victor Stinner41bb43a2013-10-29 01:19:37 +0100936
Victor Stinner838f2642019-06-13 22:41:23 +0200937 PyObject *stack[3];
Victor Stinner78da82b2016-08-20 01:22:57 +0200938 stack[0] = (PyObject *)frame;
939 stack[1] = whatstrings[what];
940 stack[2] = (arg != NULL) ? arg : Py_None;
Fred Drake5755ce62001-06-27 19:19:46 +0000941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 /* call the Python-level function */
Victor Stinner309d7cc2020-03-13 16:39:12 +0100943 PyObject *result = _PyObject_FastCallTstate(tstate, callback, stack, 3);
Fred Drake5755ce62001-06-27 19:19:46 +0000944
Victor Stinner78da82b2016-08-20 01:22:57 +0200945 PyFrame_LocalsToFast(frame, 1);
946 if (result == NULL) {
947 PyTraceBack_Here(frame);
948 }
949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 return result;
Fred Drake5755ce62001-06-27 19:19:46 +0000951}
952
953static int
954profile_trampoline(PyObject *self, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 int what, PyObject *arg)
Fred Drake5755ce62001-06-27 19:19:46 +0000956{
Victor Stinner309d7cc2020-03-13 16:39:12 +0100957 if (arg == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 arg = Py_None;
Victor Stinner309d7cc2020-03-13 16:39:12 +0100959 }
960
961 PyThreadState *tstate = _PyThreadState_GET();
962 PyObject *result = call_trampoline(tstate, self, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 if (result == NULL) {
Victor Stinner309d7cc2020-03-13 16:39:12 +0100964 _PyEval_SetProfile(tstate, NULL, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 return -1;
966 }
Victor Stinner309d7cc2020-03-13 16:39:12 +0100967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 Py_DECREF(result);
969 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +0000970}
971
972static int
973trace_trampoline(PyObject *self, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 int what, PyObject *arg)
Fred Drake5755ce62001-06-27 19:19:46 +0000975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 PyObject *callback;
Victor Stinner309d7cc2020-03-13 16:39:12 +0100977 if (what == PyTrace_CALL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 callback = self;
Victor Stinner309d7cc2020-03-13 16:39:12 +0100979 }
980 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 callback = frame->f_trace;
Victor Stinner309d7cc2020-03-13 16:39:12 +0100982 }
983 if (callback == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 return 0;
Victor Stinner309d7cc2020-03-13 16:39:12 +0100985 }
986
987 PyThreadState *tstate = _PyThreadState_GET();
988 PyObject *result = call_trampoline(tstate, callback, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 if (result == NULL) {
Victor Stinner309d7cc2020-03-13 16:39:12 +0100990 _PyEval_SetTrace(tstate, NULL, NULL);
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200991 Py_CLEAR(frame->f_trace);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 return -1;
993 }
Victor Stinner309d7cc2020-03-13 16:39:12 +0100994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 if (result != Py_None) {
Serhiy Storchakaec397562016-04-06 09:50:03 +0300996 Py_XSETREF(frame->f_trace, result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 }
998 else {
999 Py_DECREF(result);
1000 }
1001 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +00001002}
Fred Draked0838392001-06-16 21:02:31 +00001003
Fred Drake8b4d01d2000-05-09 19:57:01 +00001004static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001005sys_settrace(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +00001006{
Victor Stinner309d7cc2020-03-13 16:39:12 +01001007 if (trace_init() == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 return NULL;
Victor Stinner309d7cc2020-03-13 16:39:12 +01001009 }
1010
1011 PyThreadState *tstate = _PyThreadState_GET();
1012 if (args == Py_None) {
1013 if (_PyEval_SetTrace(tstate, NULL, NULL) < 0) {
1014 return NULL;
1015 }
1016 }
1017 else {
1018 if (_PyEval_SetTrace(tstate, trace_trampoline, args) < 0) {
1019 return NULL;
1020 }
1021 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001022 Py_RETURN_NONE;
Guido van Rossume2437a11992-03-23 18:20:18 +00001023}
1024
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001025PyDoc_STRVAR(settrace_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001026"settrace(function)\n\
1027\n\
1028Set the global debug tracing function. It will be called on each\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001029function call. See the debugger chapter in the library manual."
1030);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001031
Tal Einatede0b6f2018-12-31 17:12:08 +02001032/*[clinic input]
1033sys.gettrace
1034
1035Return the global debug tracing function set with sys.settrace.
1036
1037See the debugger chapter in the library manual.
1038[clinic start generated code]*/
1039
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001040static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001041sys_gettrace_impl(PyObject *module)
1042/*[clinic end generated code: output=e97e3a4d8c971b6e input=373b51bb2147f4d8]*/
Christian Heimes9bd667a2008-01-20 15:14:11 +00001043{
Victor Stinner50b48572018-11-01 01:51:40 +01001044 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 PyObject *temp = tstate->c_traceobj;
Christian Heimes9bd667a2008-01-20 15:14:11 +00001046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 if (temp == NULL)
1048 temp = Py_None;
1049 Py_INCREF(temp);
1050 return temp;
Christian Heimes9bd667a2008-01-20 15:14:11 +00001051}
1052
Christian Heimes9bd667a2008-01-20 15:14:11 +00001053static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001054sys_setprofile(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +00001055{
Victor Stinner309d7cc2020-03-13 16:39:12 +01001056 if (trace_init() == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 return NULL;
Victor Stinner309d7cc2020-03-13 16:39:12 +01001058 }
1059
1060 PyThreadState *tstate = _PyThreadState_GET();
1061 if (args == Py_None) {
1062 if (_PyEval_SetProfile(tstate, NULL, NULL) < 0) {
1063 return NULL;
1064 }
1065 }
1066 else {
1067 if (_PyEval_SetProfile(tstate, profile_trampoline, args) < 0) {
1068 return NULL;
1069 }
1070 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001071 Py_RETURN_NONE;
Guido van Rossume2437a11992-03-23 18:20:18 +00001072}
1073
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001074PyDoc_STRVAR(setprofile_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001075"setprofile(function)\n\
1076\n\
1077Set the profiling function. It will be called on each function call\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001078and return. See the profiler chapter in the library manual."
1079);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001080
Tal Einatede0b6f2018-12-31 17:12:08 +02001081/*[clinic input]
1082sys.getprofile
1083
1084Return the profiling function set with sys.setprofile.
1085
1086See the profiler chapter in the library manual.
1087[clinic start generated code]*/
1088
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001089static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001090sys_getprofile_impl(PyObject *module)
1091/*[clinic end generated code: output=579b96b373448188 input=1b3209d89a32965d]*/
Christian Heimes9bd667a2008-01-20 15:14:11 +00001092{
Victor Stinner50b48572018-11-01 01:51:40 +01001093 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 PyObject *temp = tstate->c_profileobj;
Christian Heimes9bd667a2008-01-20 15:14:11 +00001095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 if (temp == NULL)
1097 temp = Py_None;
1098 Py_INCREF(temp);
1099 return temp;
Christian Heimes9bd667a2008-01-20 15:14:11 +00001100}
1101
Tim Peterse5e065b2003-07-06 18:36:54 +00001102
Tal Einatede0b6f2018-12-31 17:12:08 +02001103/*[clinic input]
1104sys.setswitchinterval
1105
1106 interval: double
1107 /
1108
1109Set the ideal thread switching delay inside the Python interpreter.
1110
1111The actual frequency of switching threads can be lower if the
1112interpreter executes long sequences of uninterruptible code
1113(this is implementation-specific and workload-dependent).
1114
1115The parameter must represent the desired switching delay in seconds
1116A typical value is 0.005 (5 milliseconds).
1117[clinic start generated code]*/
Tim Peterse5e065b2003-07-06 18:36:54 +00001118
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001119static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001120sys_setswitchinterval_impl(PyObject *module, double interval)
1121/*[clinic end generated code: output=65a19629e5153983 input=561b477134df91d9]*/
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001122{
Victor Stinner838f2642019-06-13 22:41:23 +02001123 PyThreadState *tstate = _PyThreadState_GET();
Tal Einatede0b6f2018-12-31 17:12:08 +02001124 if (interval <= 0.0) {
Victor Stinner838f2642019-06-13 22:41:23 +02001125 _PyErr_SetString(tstate, PyExc_ValueError,
1126 "switch interval must be strictly positive");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 return NULL;
1128 }
Tal Einatede0b6f2018-12-31 17:12:08 +02001129 _PyEval_SetSwitchInterval((unsigned long) (1e6 * interval));
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001130 Py_RETURN_NONE;
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001131}
1132
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001133
Tal Einatede0b6f2018-12-31 17:12:08 +02001134/*[clinic input]
1135sys.getswitchinterval -> double
1136
1137Return the current thread switch interval; see sys.setswitchinterval().
1138[clinic start generated code]*/
1139
1140static double
1141sys_getswitchinterval_impl(PyObject *module)
1142/*[clinic end generated code: output=a38c277c85b5096d input=bdf9d39c0ebbbb6f]*/
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001143{
Tal Einatede0b6f2018-12-31 17:12:08 +02001144 return 1e-6 * _PyEval_GetSwitchInterval();
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001145}
1146
Tal Einatede0b6f2018-12-31 17:12:08 +02001147/*[clinic input]
1148sys.setrecursionlimit
1149
1150 limit as new_limit: int
1151 /
1152
1153Set the maximum depth of the Python interpreter stack to n.
1154
1155This limit prevents infinite recursion from causing an overflow of the C
1156stack and crashing Python. The highest possible limit is platform-
1157dependent.
1158[clinic start generated code]*/
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001159
Tim Peterse5e065b2003-07-06 18:36:54 +00001160static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001161sys_setrecursionlimit_impl(PyObject *module, int new_limit)
1162/*[clinic end generated code: output=35e1c64754800ace input=b0f7a23393924af3]*/
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001163{
Tal Einatede0b6f2018-12-31 17:12:08 +02001164 int mark;
Victor Stinner838f2642019-06-13 22:41:23 +02001165 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner50856d52015-10-13 00:11:21 +02001166
Victor Stinner50856d52015-10-13 00:11:21 +02001167 if (new_limit < 1) {
Victor Stinner838f2642019-06-13 22:41:23 +02001168 _PyErr_SetString(tstate, PyExc_ValueError,
1169 "recursion limit must be greater or equal than 1");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 return NULL;
1171 }
Victor Stinner50856d52015-10-13 00:11:21 +02001172
1173 /* Issue #25274: When the recursion depth hits the recursion limit in
1174 _Py_CheckRecursiveCall(), the overflowed flag of the thread state is
1175 set to 1 and a RecursionError is raised. The overflowed flag is reset
1176 to 0 when the recursion depth goes below the low-water mark: see
1177 Py_LeaveRecursiveCall().
1178
1179 Reject too low new limit if the current recursion depth is higher than
1180 the new low-water mark. Otherwise it may not be possible anymore to
1181 reset the overflowed flag to 0. */
1182 mark = _Py_RecursionLimitLowerWaterMark(new_limit);
Victor Stinner50856d52015-10-13 00:11:21 +02001183 if (tstate->recursion_depth >= mark) {
Victor Stinner838f2642019-06-13 22:41:23 +02001184 _PyErr_Format(tstate, PyExc_RecursionError,
1185 "cannot set the recursion limit to %i at "
1186 "the recursion depth %i: the limit is too low",
1187 new_limit, tstate->recursion_depth);
Victor Stinner50856d52015-10-13 00:11:21 +02001188 return NULL;
1189 }
1190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 Py_SetRecursionLimit(new_limit);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001192 Py_RETURN_NONE;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001193}
1194
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001195/*[clinic input]
1196sys.set_coroutine_origin_tracking_depth
1197
1198 depth: int
1199
1200Enable or disable origin tracking for coroutine objects in this thread.
1201
Tal Einatede0b6f2018-12-31 17:12:08 +02001202Coroutine objects will track 'depth' frames of traceback information
1203about where they came from, available in their cr_origin attribute.
1204
1205Set a depth of 0 to disable.
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001206[clinic start generated code]*/
1207
1208static PyObject *
1209sys_set_coroutine_origin_tracking_depth_impl(PyObject *module, int depth)
Tal Einatede0b6f2018-12-31 17:12:08 +02001210/*[clinic end generated code: output=0a2123c1cc6759c5 input=a1d0a05f89d2c426]*/
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001211{
Victor Stinner838f2642019-06-13 22:41:23 +02001212 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001213 if (depth < 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02001214 _PyErr_SetString(tstate, PyExc_ValueError, "depth must be >= 0");
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001215 return NULL;
1216 }
Victor Stinner838f2642019-06-13 22:41:23 +02001217 _PyEval_SetCoroutineOriginTrackingDepth(tstate, depth);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001218 Py_RETURN_NONE;
1219}
1220
1221/*[clinic input]
1222sys.get_coroutine_origin_tracking_depth -> int
1223
1224Check status of origin tracking for coroutine objects in this thread.
1225[clinic start generated code]*/
1226
1227static int
1228sys_get_coroutine_origin_tracking_depth_impl(PyObject *module)
1229/*[clinic end generated code: output=3699f7be95a3afb8 input=335266a71205b61a]*/
1230{
1231 return _PyEval_GetCoroutineOriginTrackingDepth();
1232}
1233
Yury Selivanoveb636452016-09-08 22:01:51 -07001234static PyTypeObject AsyncGenHooksType;
1235
1236PyDoc_STRVAR(asyncgen_hooks_doc,
1237"asyncgen_hooks\n\
1238\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07001239A named tuple providing information about asynchronous\n\
Yury Selivanoveb636452016-09-08 22:01:51 -07001240generators hooks. The attributes are read only.");
1241
1242static PyStructSequence_Field asyncgen_hooks_fields[] = {
1243 {"firstiter", "Hook to intercept first iteration"},
1244 {"finalizer", "Hook to intercept finalization"},
1245 {0}
1246};
1247
1248static PyStructSequence_Desc asyncgen_hooks_desc = {
1249 "asyncgen_hooks", /* name */
1250 asyncgen_hooks_doc, /* doc */
1251 asyncgen_hooks_fields , /* fields */
1252 2
1253};
1254
Yury Selivanoveb636452016-09-08 22:01:51 -07001255static PyObject *
1256sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
1257{
1258 static char *keywords[] = {"firstiter", "finalizer", NULL};
1259 PyObject *firstiter = NULL;
1260 PyObject *finalizer = NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02001261 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07001262
1263 if (!PyArg_ParseTupleAndKeywords(
1264 args, kw, "|OO", keywords,
1265 &firstiter, &finalizer)) {
1266 return NULL;
1267 }
1268
1269 if (finalizer && finalizer != Py_None) {
1270 if (!PyCallable_Check(finalizer)) {
Victor Stinner838f2642019-06-13 22:41:23 +02001271 _PyErr_Format(tstate, PyExc_TypeError,
1272 "callable finalizer expected, got %.50s",
1273 Py_TYPE(finalizer)->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07001274 return NULL;
1275 }
Zackery Spytz79ceccd2020-03-26 06:11:13 -06001276 if (_PyEval_SetAsyncGenFinalizer(finalizer) < 0) {
1277 return NULL;
1278 }
Yury Selivanoveb636452016-09-08 22:01:51 -07001279 }
Zackery Spytz79ceccd2020-03-26 06:11:13 -06001280 else if (finalizer == Py_None && _PyEval_SetAsyncGenFinalizer(NULL) < 0) {
1281 return NULL;
Yury Selivanoveb636452016-09-08 22:01:51 -07001282 }
1283
1284 if (firstiter && firstiter != Py_None) {
1285 if (!PyCallable_Check(firstiter)) {
Victor Stinner838f2642019-06-13 22:41:23 +02001286 _PyErr_Format(tstate, PyExc_TypeError,
1287 "callable firstiter expected, got %.50s",
1288 Py_TYPE(firstiter)->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07001289 return NULL;
1290 }
Zackery Spytz79ceccd2020-03-26 06:11:13 -06001291 if (_PyEval_SetAsyncGenFirstiter(firstiter) < 0) {
1292 return NULL;
1293 }
Yury Selivanoveb636452016-09-08 22:01:51 -07001294 }
Zackery Spytz79ceccd2020-03-26 06:11:13 -06001295 else if (firstiter == Py_None && _PyEval_SetAsyncGenFirstiter(NULL) < 0) {
1296 return NULL;
Yury Selivanoveb636452016-09-08 22:01:51 -07001297 }
1298
1299 Py_RETURN_NONE;
1300}
1301
1302PyDoc_STRVAR(set_asyncgen_hooks_doc,
Tal Einatede0b6f2018-12-31 17:12:08 +02001303"set_asyncgen_hooks(* [, firstiter] [, finalizer])\n\
Yury Selivanoveb636452016-09-08 22:01:51 -07001304\n\
1305Set a finalizer for async generators objects."
1306);
1307
Tal Einatede0b6f2018-12-31 17:12:08 +02001308/*[clinic input]
1309sys.get_asyncgen_hooks
1310
1311Return the installed asynchronous generators hooks.
1312
1313This returns a namedtuple of the form (firstiter, finalizer).
1314[clinic start generated code]*/
1315
Yury Selivanoveb636452016-09-08 22:01:51 -07001316static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001317sys_get_asyncgen_hooks_impl(PyObject *module)
1318/*[clinic end generated code: output=53a253707146f6cf input=3676b9ea62b14625]*/
Yury Selivanoveb636452016-09-08 22:01:51 -07001319{
1320 PyObject *res;
1321 PyObject *firstiter = _PyEval_GetAsyncGenFirstiter();
1322 PyObject *finalizer = _PyEval_GetAsyncGenFinalizer();
1323
1324 res = PyStructSequence_New(&AsyncGenHooksType);
1325 if (res == NULL) {
1326 return NULL;
1327 }
1328
1329 if (firstiter == NULL) {
1330 firstiter = Py_None;
1331 }
1332
1333 if (finalizer == NULL) {
1334 finalizer = Py_None;
1335 }
1336
1337 Py_INCREF(firstiter);
1338 PyStructSequence_SET_ITEM(res, 0, firstiter);
1339
1340 Py_INCREF(finalizer);
1341 PyStructSequence_SET_ITEM(res, 1, finalizer);
1342
1343 return res;
1344}
1345
Yury Selivanoveb636452016-09-08 22:01:51 -07001346
Mark Dickinsondc787d22010-05-23 13:33:13 +00001347static PyTypeObject Hash_InfoType;
1348
1349PyDoc_STRVAR(hash_info_doc,
1350"hash_info\n\
1351\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07001352A named tuple providing parameters used for computing\n\
Christian Heimes985ecdc2013-11-20 11:46:18 +01001353hashes. The attributes are read only.");
Mark Dickinsondc787d22010-05-23 13:33:13 +00001354
1355static PyStructSequence_Field hash_info_fields[] = {
1356 {"width", "width of the type used for hashing, in bits"},
1357 {"modulus", "prime number giving the modulus on which the hash "
1358 "function is based"},
1359 {"inf", "value to be used for hash of a positive infinity"},
1360 {"nan", "value to be used for hash of a nan"},
1361 {"imag", "multiplier used for the imaginary part of a complex number"},
Christian Heimes985ecdc2013-11-20 11:46:18 +01001362 {"algorithm", "name of the algorithm for hashing of str, bytes and "
1363 "memoryviews"},
1364 {"hash_bits", "internal output size of hash algorithm"},
1365 {"seed_bits", "seed size of hash algorithm"},
1366 {"cutoff", "small string optimization cutoff"},
Mark Dickinsondc787d22010-05-23 13:33:13 +00001367 {NULL, NULL}
1368};
1369
1370static PyStructSequence_Desc hash_info_desc = {
1371 "sys.hash_info",
1372 hash_info_doc,
1373 hash_info_fields,
Christian Heimes985ecdc2013-11-20 11:46:18 +01001374 9,
Mark Dickinsondc787d22010-05-23 13:33:13 +00001375};
1376
Matthias Klosed885e952010-07-06 10:53:30 +00001377static PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +02001378get_hash_info(PyThreadState *tstate)
Mark Dickinsondc787d22010-05-23 13:33:13 +00001379{
1380 PyObject *hash_info;
1381 int field = 0;
Christian Heimes985ecdc2013-11-20 11:46:18 +01001382 PyHash_FuncDef *hashfunc;
Mark Dickinsondc787d22010-05-23 13:33:13 +00001383 hash_info = PyStructSequence_New(&Hash_InfoType);
1384 if (hash_info == NULL)
1385 return NULL;
Christian Heimes985ecdc2013-11-20 11:46:18 +01001386 hashfunc = PyHash_GetFuncDef();
Mark Dickinsondc787d22010-05-23 13:33:13 +00001387 PyStructSequence_SET_ITEM(hash_info, field++,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001388 PyLong_FromLong(8*sizeof(Py_hash_t)));
Mark Dickinsondc787d22010-05-23 13:33:13 +00001389 PyStructSequence_SET_ITEM(hash_info, field++,
Benjamin Peterson8035bc52010-10-23 16:20:50 +00001390 PyLong_FromSsize_t(_PyHASH_MODULUS));
Mark Dickinsondc787d22010-05-23 13:33:13 +00001391 PyStructSequence_SET_ITEM(hash_info, field++,
1392 PyLong_FromLong(_PyHASH_INF));
1393 PyStructSequence_SET_ITEM(hash_info, field++,
1394 PyLong_FromLong(_PyHASH_NAN));
1395 PyStructSequence_SET_ITEM(hash_info, field++,
1396 PyLong_FromLong(_PyHASH_IMAG));
Christian Heimes985ecdc2013-11-20 11:46:18 +01001397 PyStructSequence_SET_ITEM(hash_info, field++,
1398 PyUnicode_FromString(hashfunc->name));
1399 PyStructSequence_SET_ITEM(hash_info, field++,
1400 PyLong_FromLong(hashfunc->hash_bits));
1401 PyStructSequence_SET_ITEM(hash_info, field++,
1402 PyLong_FromLong(hashfunc->seed_bits));
1403 PyStructSequence_SET_ITEM(hash_info, field++,
1404 PyLong_FromLong(Py_HASH_CUTOFF));
Victor Stinner838f2642019-06-13 22:41:23 +02001405 if (_PyErr_Occurred(tstate)) {
Mark Dickinsondc787d22010-05-23 13:33:13 +00001406 Py_CLEAR(hash_info);
1407 return NULL;
1408 }
1409 return hash_info;
1410}
Tal Einatede0b6f2018-12-31 17:12:08 +02001411/*[clinic input]
1412sys.getrecursionlimit
Mark Dickinsondc787d22010-05-23 13:33:13 +00001413
Tal Einatede0b6f2018-12-31 17:12:08 +02001414Return the current value of the recursion limit.
Mark Dickinsondc787d22010-05-23 13:33:13 +00001415
Tal Einatede0b6f2018-12-31 17:12:08 +02001416The recursion limit is the maximum depth of the Python interpreter
1417stack. This limit prevents infinite recursion from causing an overflow
1418of the C stack and crashing Python.
1419[clinic start generated code]*/
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001420
1421static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001422sys_getrecursionlimit_impl(PyObject *module)
1423/*[clinic end generated code: output=d571fb6b4549ef2e input=1c6129fd2efaeea8]*/
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 return PyLong_FromLong(Py_GetRecursionLimit());
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001426}
1427
Mark Hammond8696ebc2002-10-08 02:44:31 +00001428#ifdef MS_WINDOWS
Mark Hammond8696ebc2002-10-08 02:44:31 +00001429
Eric Smithf7bb5782010-01-27 00:44:57 +00001430static PyTypeObject WindowsVersionType = {0, 0, 0, 0, 0, 0};
1431
1432static PyStructSequence_Field windows_version_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 {"major", "Major version number"},
1434 {"minor", "Minor version number"},
1435 {"build", "Build number"},
1436 {"platform", "Operating system platform"},
1437 {"service_pack", "Latest Service Pack installed on the system"},
1438 {"service_pack_major", "Service Pack major version number"},
1439 {"service_pack_minor", "Service Pack minor version number"},
1440 {"suite_mask", "Bit mask identifying available product suites"},
1441 {"product_type", "System product type"},
Steve Dower74f4af72016-09-17 17:27:48 -07001442 {"platform_version", "Diagnostic version number"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 {0}
Eric Smithf7bb5782010-01-27 00:44:57 +00001444};
1445
1446static PyStructSequence_Desc windows_version_desc = {
Tal Einatede0b6f2018-12-31 17:12:08 +02001447 "sys.getwindowsversion", /* name */
1448 sys_getwindowsversion__doc__, /* doc */
1449 windows_version_fields, /* fields */
1450 5 /* For backward compatibility,
1451 only the first 5 items are accessible
1452 via indexing, the rest are name only */
Eric Smithf7bb5782010-01-27 00:44:57 +00001453};
1454
Steve Dower3e96f322015-03-02 08:01:10 -08001455/* Disable deprecation warnings about GetVersionEx as the result is
1456 being passed straight through to the caller, who is responsible for
1457 using it correctly. */
1458#pragma warning(push)
1459#pragma warning(disable:4996)
1460
Tal Einatede0b6f2018-12-31 17:12:08 +02001461/*[clinic input]
1462sys.getwindowsversion
1463
1464Return info about the running version of Windows as a named tuple.
1465
1466The members are named: major, minor, build, platform, service_pack,
1467service_pack_major, service_pack_minor, suite_mask, product_type and
1468platform_version. For backward compatibility, only the first 5 items
1469are available by indexing. All elements are numbers, except
1470service_pack and platform_type which are strings, and platform_version
1471which is a 3-tuple. Platform is always 2. Product_type may be 1 for a
1472workstation, 2 for a domain controller, 3 for a server.
1473Platform_version is a 3-tuple containing a version number that is
1474intended for identifying the OS rather than feature detection.
1475[clinic start generated code]*/
1476
Mark Hammond8696ebc2002-10-08 02:44:31 +00001477static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001478sys_getwindowsversion_impl(PyObject *module)
1479/*[clinic end generated code: output=1ec063280b932857 input=73a228a328fee63a]*/
Mark Hammond8696ebc2002-10-08 02:44:31 +00001480{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 PyObject *version;
1482 int pos = 0;
Minmin Gong8ebc6452019-02-02 20:26:55 -08001483 OSVERSIONINFOEXW ver;
Steve Dower74f4af72016-09-17 17:27:48 -07001484 DWORD realMajor, realMinor, realBuild;
1485 HANDLE hKernel32;
1486 wchar_t kernel32_path[MAX_PATH];
1487 LPVOID verblock;
1488 DWORD verblock_size;
Victor Stinner838f2642019-06-13 22:41:23 +02001489 PyThreadState *tstate = _PyThreadState_GET();
Steve Dower74f4af72016-09-17 17:27:48 -07001490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 ver.dwOSVersionInfoSize = sizeof(ver);
Minmin Gong8ebc6452019-02-02 20:26:55 -08001492 if (!GetVersionExW((OSVERSIONINFOW*) &ver))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 return PyErr_SetFromWindowsErr(0);
Eric Smithf7bb5782010-01-27 00:44:57 +00001494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 version = PyStructSequence_New(&WindowsVersionType);
1496 if (version == NULL)
1497 return NULL;
Eric Smithf7bb5782010-01-27 00:44:57 +00001498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMajorVersion));
1500 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMinorVersion));
1501 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwBuildNumber));
1502 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwPlatformId));
Minmin Gong8ebc6452019-02-02 20:26:55 -08001503 PyStructSequence_SET_ITEM(version, pos++, PyUnicode_FromWideChar(ver.szCSDVersion, -1));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMajor));
1505 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMinor));
1506 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wSuiteMask));
1507 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wProductType));
Eric Smithf7bb5782010-01-27 00:44:57 +00001508
Steve Dower74f4af72016-09-17 17:27:48 -07001509 realMajor = ver.dwMajorVersion;
1510 realMinor = ver.dwMinorVersion;
1511 realBuild = ver.dwBuildNumber;
1512
1513 // GetVersion will lie if we are running in a compatibility mode.
1514 // We need to read the version info from a system file resource
1515 // to accurately identify the OS version. If we fail for any reason,
1516 // just return whatever GetVersion said.
Tony Roberts4860f012019-02-02 18:16:42 +01001517 Py_BEGIN_ALLOW_THREADS
Steve Dower74f4af72016-09-17 17:27:48 -07001518 hKernel32 = GetModuleHandleW(L"kernel32.dll");
Tony Roberts4860f012019-02-02 18:16:42 +01001519 Py_END_ALLOW_THREADS
Steve Dower74f4af72016-09-17 17:27:48 -07001520 if (hKernel32 && GetModuleFileNameW(hKernel32, kernel32_path, MAX_PATH) &&
1521 (verblock_size = GetFileVersionInfoSizeW(kernel32_path, NULL)) &&
1522 (verblock = PyMem_RawMalloc(verblock_size))) {
1523 VS_FIXEDFILEINFO *ffi;
1524 UINT ffi_len;
1525
1526 if (GetFileVersionInfoW(kernel32_path, 0, verblock_size, verblock) &&
1527 VerQueryValueW(verblock, L"", (LPVOID)&ffi, &ffi_len)) {
1528 realMajor = HIWORD(ffi->dwProductVersionMS);
1529 realMinor = LOWORD(ffi->dwProductVersionMS);
1530 realBuild = HIWORD(ffi->dwProductVersionLS);
1531 }
1532 PyMem_RawFree(verblock);
1533 }
Segev Finer48fb7662017-06-04 20:52:27 +03001534 PyStructSequence_SET_ITEM(version, pos++, Py_BuildValue("(kkk)",
1535 realMajor,
1536 realMinor,
1537 realBuild
Steve Dower74f4af72016-09-17 17:27:48 -07001538 ));
1539
Victor Stinner838f2642019-06-13 22:41:23 +02001540 if (_PyErr_Occurred(tstate)) {
Serhiy Storchaka48d761e2013-12-17 15:11:24 +02001541 Py_DECREF(version);
1542 return NULL;
1543 }
Steve Dower74f4af72016-09-17 17:27:48 -07001544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 return version;
Mark Hammond8696ebc2002-10-08 02:44:31 +00001546}
1547
Steve Dower3e96f322015-03-02 08:01:10 -08001548#pragma warning(pop)
1549
Tal Einatede0b6f2018-12-31 17:12:08 +02001550/*[clinic input]
1551sys._enablelegacywindowsfsencoding
1552
1553Changes the default filesystem encoding to mbcs:replace.
1554
1555This is done for consistency with earlier versions of Python. See PEP
1556529 for more information.
1557
1558This is equivalent to defining the PYTHONLEGACYWINDOWSFSENCODING
1559environment variable before launching Python.
1560[clinic start generated code]*/
Steve Dowercc16be82016-09-08 10:35:16 -07001561
1562static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001563sys__enablelegacywindowsfsencoding_impl(PyObject *module)
1564/*[clinic end generated code: output=f5c3855b45e24fe9 input=2bfa931a20704492]*/
Steve Dowercc16be82016-09-08 10:35:16 -07001565{
Victor Stinner709d23d2019-05-02 14:56:30 -04001566 if (_PyUnicode_EnableLegacyWindowsFSEncoding() < 0) {
Victor Stinnerb2457ef2018-08-29 13:25:36 +02001567 return NULL;
1568 }
Steve Dowercc16be82016-09-08 10:35:16 -07001569 Py_RETURN_NONE;
1570}
1571
Mark Hammond8696ebc2002-10-08 02:44:31 +00001572#endif /* MS_WINDOWS */
1573
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001574#ifdef HAVE_DLOPEN
Tal Einatede0b6f2018-12-31 17:12:08 +02001575
1576/*[clinic input]
1577sys.setdlopenflags
1578
1579 flags as new_val: int
1580 /
1581
1582Set the flags used by the interpreter for dlopen calls.
1583
1584This is used, for example, when the interpreter loads extension
1585modules. Among other things, this will enable a lazy resolving of
1586symbols when importing a module, if called as sys.setdlopenflags(0).
1587To share symbols across extension modules, call as
1588sys.setdlopenflags(os.RTLD_GLOBAL). Symbolic names for the flag
1589modules can be found in the os module (RTLD_xxx constants, e.g.
1590os.RTLD_LAZY).
1591[clinic start generated code]*/
1592
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001593static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001594sys_setdlopenflags_impl(PyObject *module, int new_val)
1595/*[clinic end generated code: output=ec918b7fe0a37281 input=4c838211e857a77f]*/
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001596{
Victor Stinner838f2642019-06-13 22:41:23 +02001597 PyThreadState *tstate = _PyThreadState_GET();
1598 tstate->interp->dlopenflags = new_val;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001599 Py_RETURN_NONE;
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001600}
1601
Tal Einatede0b6f2018-12-31 17:12:08 +02001602
1603/*[clinic input]
1604sys.getdlopenflags
1605
1606Return the current value of the flags that are used for dlopen calls.
1607
1608The flag constants are defined in the os module.
1609[clinic start generated code]*/
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001610
1611static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001612sys_getdlopenflags_impl(PyObject *module)
1613/*[clinic end generated code: output=e92cd1bc5005da6e input=dc4ea0899c53b4b6]*/
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001614{
Victor Stinner838f2642019-06-13 22:41:23 +02001615 PyThreadState *tstate = _PyThreadState_GET();
1616 return PyLong_FromLong(tstate->interp->dlopenflags);
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001617}
1618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619#endif /* HAVE_DLOPEN */
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001620
Guido van Rossum14b4adb1992-09-03 20:25:30 +00001621#ifdef USE_MALLOPT
1622/* Link with -lmalloc (or -lmpc) on an SGI */
1623#include <malloc.h>
1624
Tal Einatede0b6f2018-12-31 17:12:08 +02001625/*[clinic input]
1626sys.mdebug
1627
1628 flag: int
1629 /
1630[clinic start generated code]*/
1631
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001632static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001633sys_mdebug_impl(PyObject *module, int flag)
1634/*[clinic end generated code: output=5431d545847c3637 input=151d150ae1636f8a]*/
Guido van Rossum14b4adb1992-09-03 20:25:30 +00001635{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 int flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 mallopt(M_DEBUG, flag);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001638 Py_RETURN_NONE;
Guido van Rossum14b4adb1992-09-03 20:25:30 +00001639}
1640#endif /* USE_MALLOPT */
1641
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001642size_t
1643_PySys_GetSizeOf(PyObject *o)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 PyObject *res = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 PyObject *method;
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001647 Py_ssize_t size;
Victor Stinner838f2642019-06-13 22:41:23 +02001648 PyThreadState *tstate = _PyThreadState_GET();
Benjamin Petersona5758c02009-05-09 18:15:04 +00001649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 /* Make sure the type is initialized. float gets initialized late */
Victor Stinner838f2642019-06-13 22:41:23 +02001651 if (PyType_Ready(Py_TYPE(o)) < 0) {
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001652 return (size_t)-1;
Victor Stinner838f2642019-06-13 22:41:23 +02001653 }
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00001654
Benjamin Petersonce798522012-01-22 11:24:29 -05001655 method = _PyObject_LookupSpecial(o, &PyId___sizeof__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 if (method == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +02001657 if (!_PyErr_Occurred(tstate)) {
1658 _PyErr_Format(tstate, PyExc_TypeError,
1659 "Type %.100s doesn't define __sizeof__",
1660 Py_TYPE(o)->tp_name);
1661 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 }
1663 else {
Victor Stinnerf17c3de2016-12-06 18:46:19 +01001664 res = _PyObject_CallNoArg(method);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 Py_DECREF(method);
1666 }
1667
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001668 if (res == NULL)
1669 return (size_t)-1;
1670
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001671 size = PyLong_AsSsize_t(res);
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001672 Py_DECREF(res);
Victor Stinner838f2642019-06-13 22:41:23 +02001673 if (size == -1 && _PyErr_Occurred(tstate))
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001674 return (size_t)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001676 if (size < 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02001677 _PyErr_SetString(tstate, PyExc_ValueError,
1678 "__sizeof__() should return >= 0");
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001679 return (size_t)-1;
1680 }
1681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 /* add gc_head size */
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001683 if (PyObject_IS_GC(o))
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001684 return ((size_t)size) + sizeof(PyGC_Head);
1685 return (size_t)size;
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001686}
1687
1688static PyObject *
1689sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
1690{
1691 static char *kwlist[] = {"object", "default", 0};
1692 size_t size;
1693 PyObject *o, *dflt = NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02001694 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001695
1696 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",
Victor Stinner838f2642019-06-13 22:41:23 +02001697 kwlist, &o, &dflt)) {
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001698 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02001699 }
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001700
1701 size = _PySys_GetSizeOf(o);
1702
Victor Stinner838f2642019-06-13 22:41:23 +02001703 if (size == (size_t)-1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001704 /* Has a default value been given */
Victor Stinner838f2642019-06-13 22:41:23 +02001705 if (dflt != NULL && _PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
1706 _PyErr_Clear(tstate);
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001707 Py_INCREF(dflt);
1708 return dflt;
1709 }
1710 else
1711 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 }
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001713
1714 return PyLong_FromSize_t(size);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001715}
1716
1717PyDoc_STRVAR(getsizeof_doc,
Tal Einatede0b6f2018-12-31 17:12:08 +02001718"getsizeof(object [, default]) -> int\n\
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001719\n\
1720Return the size of object in bytes.");
1721
Tal Einatede0b6f2018-12-31 17:12:08 +02001722/*[clinic input]
1723sys.getrefcount -> Py_ssize_t
1724
1725 object: object
1726 /
1727
1728Return the reference count of object.
1729
1730The count returned is generally one higher than you might expect,
1731because it includes the (temporary) reference as an argument to
1732getrefcount().
1733[clinic start generated code]*/
1734
1735static Py_ssize_t
1736sys_getrefcount_impl(PyObject *module, PyObject *object)
1737/*[clinic end generated code: output=5fd477f2264b85b2 input=bf474efd50a21535]*/
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001738{
Victor Stinnera93c51e2020-02-07 00:38:59 +01001739 return Py_REFCNT(object);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001740}
1741
Tim Peters4be93d02002-07-07 19:59:50 +00001742#ifdef Py_REF_DEBUG
Tal Einatede0b6f2018-12-31 17:12:08 +02001743/*[clinic input]
1744sys.gettotalrefcount -> Py_ssize_t
1745[clinic start generated code]*/
1746
1747static Py_ssize_t
1748sys_gettotalrefcount_impl(PyObject *module)
1749/*[clinic end generated code: output=4103886cf17c25bc input=53b744faa5d2e4f6]*/
Mark Hammond440d8982000-06-20 08:12:48 +00001750{
Tal Einatede0b6f2018-12-31 17:12:08 +02001751 return _Py_GetRefTotal();
Mark Hammond440d8982000-06-20 08:12:48 +00001752}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001753#endif /* Py_REF_DEBUG */
Mark Hammond440d8982000-06-20 08:12:48 +00001754
Tal Einatede0b6f2018-12-31 17:12:08 +02001755/*[clinic input]
1756sys.getallocatedblocks -> Py_ssize_t
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001757
Tal Einatede0b6f2018-12-31 17:12:08 +02001758Return the number of memory blocks currently allocated.
1759[clinic start generated code]*/
1760
1761static Py_ssize_t
1762sys_getallocatedblocks_impl(PyObject *module)
1763/*[clinic end generated code: output=f0c4e873f0b6dcf7 input=dab13ee346a0673e]*/
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001764{
Tal Einatede0b6f2018-12-31 17:12:08 +02001765 return _Py_GetAllocatedBlocks();
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001766}
1767
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001768
Tal Einatede0b6f2018-12-31 17:12:08 +02001769/*[clinic input]
1770sys._getframe
1771
1772 depth: int = 0
1773 /
1774
1775Return a frame object from the call stack.
1776
1777If optional integer depth is given, return the frame object that many
1778calls below the top of the stack. If that is deeper than the call
1779stack, ValueError is raised. The default for depth is zero, returning
1780the frame at the top of the call stack.
1781
1782This function should be used for internal and specialized purposes
1783only.
1784[clinic start generated code]*/
Barry Warsawb6a54d22000-12-06 21:47:46 +00001785
1786static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001787sys__getframe_impl(PyObject *module, int depth)
1788/*[clinic end generated code: output=d438776c04d59804 input=c1be8a6464b11ee5]*/
Barry Warsawb6a54d22000-12-06 21:47:46 +00001789{
Victor Stinner838f2642019-06-13 22:41:23 +02001790 PyThreadState *tstate = _PyThreadState_GET();
1791 PyFrameObject *f = tstate->frame;
Barry Warsawb6a54d22000-12-06 21:47:46 +00001792
Victor Stinner08faf002020-03-26 18:57:32 +01001793 if (_PySys_Audit(tstate, "sys._getframe", "O", f) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07001794 return NULL;
1795 }
1796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 while (depth > 0 && f != NULL) {
1798 f = f->f_back;
1799 --depth;
1800 }
1801 if (f == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +02001802 _PyErr_SetString(tstate, PyExc_ValueError,
1803 "call stack is not deep enough");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 return NULL;
1805 }
1806 Py_INCREF(f);
1807 return (PyObject*)f;
Barry Warsawb6a54d22000-12-06 21:47:46 +00001808}
1809
Tal Einatede0b6f2018-12-31 17:12:08 +02001810/*[clinic input]
1811sys._current_frames
1812
1813Return a dict mapping each thread's thread id to its current stack frame.
1814
1815This function should be used for specialized purposes only.
1816[clinic start generated code]*/
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001817
1818static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001819sys__current_frames_impl(PyObject *module)
1820/*[clinic end generated code: output=d2a41ac0a0a3809a input=2a9049c5f5033691]*/
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001821{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 return _PyThread_CurrentFrames();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001823}
1824
Tal Einatede0b6f2018-12-31 17:12:08 +02001825/*[clinic input]
1826sys.call_tracing
1827
1828 func: object
1829 args as funcargs: object(subclass_of='&PyTuple_Type')
1830 /
1831
1832Call func(*args), while tracing is enabled.
1833
1834The tracing state is saved, and restored afterwards. This is intended
1835to be called from a debugger from a checkpoint, to recursively debug
1836some other code.
1837[clinic start generated code]*/
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001838
1839static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001840sys_call_tracing_impl(PyObject *module, PyObject *func, PyObject *funcargs)
1841/*[clinic end generated code: output=7e4999853cd4e5a6 input=5102e8b11049f92f]*/
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001842{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 return _PyEval_CallTracing(func, funcargs);
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001844}
1845
Victor Stinner048afd92016-11-28 11:59:04 +01001846
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001847#ifdef __cplusplus
1848extern "C" {
1849#endif
1850
Tal Einatede0b6f2018-12-31 17:12:08 +02001851/*[clinic input]
1852sys._debugmallocstats
1853
1854Print summary info to stderr about the state of pymalloc's structures.
1855
1856In Py_DEBUG mode, also perform some expensive internal consistency
1857checks.
1858[clinic start generated code]*/
1859
David Malcolm49526f42012-06-22 14:55:41 -04001860static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001861sys__debugmallocstats_impl(PyObject *module)
1862/*[clinic end generated code: output=ec3565f8c7cee46a input=33c0c9c416f98424]*/
David Malcolm49526f42012-06-22 14:55:41 -04001863{
1864#ifdef WITH_PYMALLOC
Victor Stinner6bf992a2017-12-06 17:26:10 +01001865 if (_PyObject_DebugMallocStats(stderr)) {
Victor Stinner34be8072016-03-14 12:04:26 +01001866 fputc('\n', stderr);
1867 }
David Malcolm49526f42012-06-22 14:55:41 -04001868#endif
1869 _PyObject_DebugTypeStats(stderr);
1870
1871 Py_RETURN_NONE;
1872}
David Malcolm49526f42012-06-22 14:55:41 -04001873
Guido van Rossum7f3f2c11996-05-23 22:45:41 +00001874#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +00001875/* Defined in objects.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001876extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001877#endif
Guido van Rossumded690f1996-05-24 20:48:31 +00001878
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001879#ifdef DYNAMIC_EXECUTION_PROFILE
1880/* Defined in ceval.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001881extern PyObject *_Py_GetDXProfile(PyObject *, PyObject *);
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001882#endif
1883
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001884#ifdef __cplusplus
1885}
1886#endif
1887
Tal Einatede0b6f2018-12-31 17:12:08 +02001888
1889/*[clinic input]
1890sys._clear_type_cache
1891
1892Clear the internal type lookup cache.
1893[clinic start generated code]*/
1894
Christian Heimes15ebc882008-02-04 18:48:49 +00001895static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001896sys__clear_type_cache_impl(PyObject *module)
1897/*[clinic end generated code: output=20e48ca54a6f6971 input=127f3e04a8d9b555]*/
Christian Heimes15ebc882008-02-04 18:48:49 +00001898{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 PyType_ClearCache();
1900 Py_RETURN_NONE;
Christian Heimes15ebc882008-02-04 18:48:49 +00001901}
1902
Tal Einatede0b6f2018-12-31 17:12:08 +02001903/*[clinic input]
1904sys.is_finalizing
1905
1906Return True if Python is exiting.
1907[clinic start generated code]*/
1908
Antoine Pitrou5db1bb82014-12-07 01:28:27 +01001909static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001910sys_is_finalizing_impl(PyObject *module)
1911/*[clinic end generated code: output=735b5ff7962ab281 input=f0df747a039948a5]*/
Antoine Pitrou5db1bb82014-12-07 01:28:27 +01001912{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001913 return PyBool_FromLong(_Py_IsFinalizing());
Antoine Pitrou5db1bb82014-12-07 01:28:27 +01001914}
1915
Victor Stinnerd6958ac2016-12-02 01:13:46 +01001916#ifdef ANDROID_API_LEVEL
Tal Einatede0b6f2018-12-31 17:12:08 +02001917/*[clinic input]
1918sys.getandroidapilevel
1919
1920Return the build time API version of Android as an integer.
1921[clinic start generated code]*/
Victor Stinnerd6958ac2016-12-02 01:13:46 +01001922
1923static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001924sys_getandroidapilevel_impl(PyObject *module)
1925/*[clinic end generated code: output=214abf183a1c70c1 input=3e6d6c9fcdd24ac6]*/
Victor Stinnerd6958ac2016-12-02 01:13:46 +01001926{
1927 return PyLong_FromLong(ANDROID_API_LEVEL);
1928}
1929#endif /* ANDROID_API_LEVEL */
1930
1931
Steve Dowerb82e17e2019-05-23 08:45:22 -07001932
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001933static PyMethodDef sys_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 /* Might as well keep this in alphabetic order */
Steve Dowerb82e17e2019-05-23 08:45:22 -07001935 SYS_ADDAUDITHOOK_METHODDEF
1936 {"audit", (PyCFunction)(void(*)(void))sys_audit, METH_FASTCALL, audit_doc },
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001937 {"breakpointhook", (PyCFunction)(void(*)(void))sys_breakpointhook,
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001938 METH_FASTCALL | METH_KEYWORDS, breakpointhook_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001939 SYS__CLEAR_TYPE_CACHE_METHODDEF
1940 SYS__CURRENT_FRAMES_METHODDEF
1941 SYS_DISPLAYHOOK_METHODDEF
1942 SYS_EXC_INFO_METHODDEF
1943 SYS_EXCEPTHOOK_METHODDEF
1944 SYS_EXIT_METHODDEF
1945 SYS_GETDEFAULTENCODING_METHODDEF
1946 SYS_GETDLOPENFLAGS_METHODDEF
1947 SYS_GETALLOCATEDBLOCKS_METHODDEF
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001948#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 {"getdxp", _Py_GetDXProfile, METH_VARARGS},
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001950#endif
Tal Einatede0b6f2018-12-31 17:12:08 +02001951 SYS_GETFILESYSTEMENCODING_METHODDEF
1952 SYS_GETFILESYSTEMENCODEERRORS_METHODDEF
Guido van Rossum7f3f2c11996-05-23 22:45:41 +00001953#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 {"getobjects", _Py_GetObjects, METH_VARARGS},
Tim Peters4be93d02002-07-07 19:59:50 +00001955#endif
Tal Einatede0b6f2018-12-31 17:12:08 +02001956 SYS_GETTOTALREFCOUNT_METHODDEF
1957 SYS_GETREFCOUNT_METHODDEF
1958 SYS_GETRECURSIONLIMIT_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001959 {"getsizeof", (PyCFunction)(void(*)(void))sys_getsizeof,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 METH_VARARGS | METH_KEYWORDS, getsizeof_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001961 SYS__GETFRAME_METHODDEF
1962 SYS_GETWINDOWSVERSION_METHODDEF
1963 SYS__ENABLELEGACYWINDOWSFSENCODING_METHODDEF
1964 SYS_INTERN_METHODDEF
1965 SYS_IS_FINALIZING_METHODDEF
1966 SYS_MDEBUG_METHODDEF
Tal Einatede0b6f2018-12-31 17:12:08 +02001967 SYS_SETSWITCHINTERVAL_METHODDEF
1968 SYS_GETSWITCHINTERVAL_METHODDEF
1969 SYS_SETDLOPENFLAGS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001970 {"setprofile", sys_setprofile, METH_O, setprofile_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001971 SYS_GETPROFILE_METHODDEF
1972 SYS_SETRECURSIONLIMIT_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 {"settrace", sys_settrace, METH_O, settrace_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001974 SYS_GETTRACE_METHODDEF
1975 SYS_CALL_TRACING_METHODDEF
1976 SYS__DEBUGMALLOCSTATS_METHODDEF
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001977 SYS_SET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF
1978 SYS_GET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001979 {"set_asyncgen_hooks", (PyCFunction)(void(*)(void))sys_set_asyncgen_hooks,
Yury Selivanoveb636452016-09-08 22:01:51 -07001980 METH_VARARGS | METH_KEYWORDS, set_asyncgen_hooks_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001981 SYS_GET_ASYNCGEN_HOOKS_METHODDEF
1982 SYS_GETANDROIDAPILEVEL_METHODDEF
Victor Stinneref9d9b62019-05-22 11:28:22 +02001983 SYS_UNRAISABLEHOOK_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 {NULL, NULL} /* sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001985};
1986
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001987static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001988list_builtin_module_names(void)
Guido van Rossum34679b71993-01-26 13:33:44 +00001989{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 PyObject *list = PyList_New(0);
1991 int i;
1992 if (list == NULL)
1993 return NULL;
1994 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1995 PyObject *name = PyUnicode_FromString(
1996 PyImport_Inittab[i].name);
1997 if (name == NULL)
1998 break;
1999 PyList_Append(list, name);
2000 Py_DECREF(name);
2001 }
2002 if (PyList_Sort(list) != 0) {
2003 Py_DECREF(list);
2004 list = NULL;
2005 }
2006 if (list) {
2007 PyObject *v = PyList_AsTuple(list);
2008 Py_DECREF(list);
2009 list = v;
2010 }
2011 return list;
Guido van Rossum34679b71993-01-26 13:33:44 +00002012}
2013
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002014/* Pre-initialization support for sys.warnoptions and sys._xoptions
2015 *
2016 * Modern internal code paths:
2017 * These APIs get called after _Py_InitializeCore and get to use the
2018 * regular CPython list, dict, and unicode APIs.
2019 *
2020 * Legacy embedding code paths:
2021 * The multi-phase initialization API isn't public yet, so embedding
2022 * apps still need to be able configure sys.warnoptions and sys._xoptions
2023 * before they call Py_Initialize. To support this, we stash copies of
2024 * the supplied wchar * sequences in linked lists, and then migrate the
2025 * contents of those lists to the sys module in _PyInitializeCore.
2026 *
2027 */
2028
2029struct _preinit_entry {
2030 wchar_t *value;
2031 struct _preinit_entry *next;
2032};
2033
2034typedef struct _preinit_entry *_Py_PreInitEntry;
2035
2036static _Py_PreInitEntry _preinit_warnoptions = NULL;
2037static _Py_PreInitEntry _preinit_xoptions = NULL;
2038
2039static _Py_PreInitEntry
2040_alloc_preinit_entry(const wchar_t *value)
2041{
2042 /* To get this to work, we have to initialize the runtime implicitly */
2043 _PyRuntime_Initialize();
2044
2045 /* Force default allocator, so we can ensure that it also gets used to
2046 * destroy the linked list in _clear_preinit_entries.
2047 */
2048 PyMemAllocatorEx old_alloc;
2049 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2050
2051 _Py_PreInitEntry node = PyMem_RawCalloc(1, sizeof(*node));
2052 if (node != NULL) {
2053 node->value = _PyMem_RawWcsdup(value);
2054 if (node->value == NULL) {
2055 PyMem_RawFree(node);
2056 node = NULL;
2057 };
2058 };
2059
2060 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2061 return node;
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002062}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002063
2064static int
2065_append_preinit_entry(_Py_PreInitEntry *optionlist, const wchar_t *value)
2066{
2067 _Py_PreInitEntry new_entry = _alloc_preinit_entry(value);
2068 if (new_entry == NULL) {
2069 return -1;
2070 }
2071 /* We maintain the linked list in this order so it's easy to play back
2072 * the add commands in the same order later on in _Py_InitializeCore
2073 */
2074 _Py_PreInitEntry last_entry = *optionlist;
2075 if (last_entry == NULL) {
2076 *optionlist = new_entry;
2077 } else {
2078 while (last_entry->next != NULL) {
2079 last_entry = last_entry->next;
2080 }
2081 last_entry->next = new_entry;
2082 }
2083 return 0;
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002084}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002085
2086static void
2087_clear_preinit_entries(_Py_PreInitEntry *optionlist)
2088{
2089 _Py_PreInitEntry current = *optionlist;
2090 *optionlist = NULL;
2091 /* Deallocate the nodes and their contents using the default allocator */
2092 PyMemAllocatorEx old_alloc;
2093 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2094 while (current != NULL) {
2095 _Py_PreInitEntry next = current->next;
2096 PyMem_RawFree(current->value);
2097 PyMem_RawFree(current);
2098 current = next;
2099 }
2100 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002101}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002102
Victor Stinner120b7072019-08-23 18:03:08 +01002103
2104PyStatus
Victor Stinnerfb4ae152019-09-30 01:40:17 +02002105_PySys_ReadPreinitWarnOptions(PyWideStringList *options)
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002106{
Victor Stinner120b7072019-08-23 18:03:08 +01002107 PyStatus status;
2108 _Py_PreInitEntry entry;
2109
2110 for (entry = _preinit_warnoptions; entry != NULL; entry = entry->next) {
Victor Stinnerfb4ae152019-09-30 01:40:17 +02002111 status = PyWideStringList_Append(options, entry->value);
Victor Stinner120b7072019-08-23 18:03:08 +01002112 if (_PyStatus_EXCEPTION(status)) {
2113 return status;
2114 }
2115 }
2116
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002117 _clear_preinit_entries(&_preinit_warnoptions);
Victor Stinner120b7072019-08-23 18:03:08 +01002118 return _PyStatus_OK();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002119}
2120
Victor Stinner120b7072019-08-23 18:03:08 +01002121
2122PyStatus
2123_PySys_ReadPreinitXOptions(PyConfig *config)
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002124{
Victor Stinner120b7072019-08-23 18:03:08 +01002125 PyStatus status;
2126 _Py_PreInitEntry entry;
2127
2128 for (entry = _preinit_xoptions; entry != NULL; entry = entry->next) {
2129 status = PyWideStringList_Append(&config->xoptions, entry->value);
2130 if (_PyStatus_EXCEPTION(status)) {
2131 return status;
2132 }
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002133 }
2134
Victor Stinner120b7072019-08-23 18:03:08 +01002135 _clear_preinit_entries(&_preinit_xoptions);
2136 return _PyStatus_OK();
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002137}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002138
Victor Stinner120b7072019-08-23 18:03:08 +01002139
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002140static PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +02002141get_warnoptions(PyThreadState *tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002142{
Victor Stinner838f2642019-06-13 22:41:23 +02002143 PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002144 if (warnoptions == NULL || !PyList_Check(warnoptions)) {
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002145 /* PEP432 TODO: we can reach this if warnoptions is NULL in the main
2146 * interpreter config. When that happens, we need to properly set
2147 * the `warnoptions` reference in the main interpreter config as well.
2148 *
2149 * For Python 3.7, we shouldn't be able to get here due to the
2150 * combination of how _PyMainInterpreter_ReadConfig and _PySys_EndInit
2151 * work, but we expect 3.8+ to make the _PyMainInterpreter_ReadConfig
2152 * call optional for embedding applications, thus making this
2153 * reachable again.
2154 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002155 warnoptions = PyList_New(0);
Victor Stinner838f2642019-06-13 22:41:23 +02002156 if (warnoptions == NULL) {
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002157 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02002158 }
2159 if (sys_set_object_id(tstate, &PyId_warnoptions, warnoptions)) {
Eric Snowdae02762017-09-14 00:35:58 -07002160 Py_DECREF(warnoptions);
2161 return NULL;
2162 }
2163 Py_DECREF(warnoptions);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002164 }
2165 return warnoptions;
2166}
Guido van Rossum23fff912000-12-15 22:02:05 +00002167
2168void
2169PySys_ResetWarnOptions(void)
2170{
Victor Stinner50b48572018-11-01 01:51:40 +01002171 PyThreadState *tstate = _PyThreadState_GET();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002172 if (tstate == NULL) {
2173 _clear_preinit_entries(&_preinit_warnoptions);
2174 return;
2175 }
2176
Victor Stinner838f2642019-06-13 22:41:23 +02002177 PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 if (warnoptions == NULL || !PyList_Check(warnoptions))
2179 return;
2180 PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
Guido van Rossum23fff912000-12-15 22:02:05 +00002181}
2182
Victor Stinnere1b29952018-10-30 14:31:42 +01002183static int
Victor Stinner838f2642019-06-13 22:41:23 +02002184_PySys_AddWarnOptionWithError(PyThreadState *tstate, PyObject *option)
Guido van Rossum23fff912000-12-15 22:02:05 +00002185{
Victor Stinner838f2642019-06-13 22:41:23 +02002186 PyObject *warnoptions = get_warnoptions(tstate);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002187 if (warnoptions == NULL) {
2188 return -1;
2189 }
2190 if (PyList_Append(warnoptions, option)) {
2191 return -1;
2192 }
2193 return 0;
2194}
2195
2196void
2197PySys_AddWarnOptionUnicode(PyObject *option)
2198{
Victor Stinner838f2642019-06-13 22:41:23 +02002199 PyThreadState *tstate = _PyThreadState_GET();
2200 if (_PySys_AddWarnOptionWithError(tstate, option) < 0) {
Victor Stinnere1b29952018-10-30 14:31:42 +01002201 /* No return value, therefore clear error state if possible */
Victor Stinner838f2642019-06-13 22:41:23 +02002202 if (tstate) {
2203 _PyErr_Clear(tstate);
Victor Stinnere1b29952018-10-30 14:31:42 +01002204 }
2205 }
Victor Stinner9ca9c252010-05-19 16:53:30 +00002206}
2207
2208void
2209PySys_AddWarnOption(const wchar_t *s)
2210{
Victor Stinner50b48572018-11-01 01:51:40 +01002211 PyThreadState *tstate = _PyThreadState_GET();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002212 if (tstate == NULL) {
2213 _append_preinit_entry(&_preinit_warnoptions, s);
2214 return;
2215 }
Victor Stinner9ca9c252010-05-19 16:53:30 +00002216 PyObject *unicode;
2217 unicode = PyUnicode_FromWideChar(s, -1);
2218 if (unicode == NULL)
2219 return;
2220 PySys_AddWarnOptionUnicode(unicode);
2221 Py_DECREF(unicode);
Guido van Rossum23fff912000-12-15 22:02:05 +00002222}
2223
Christian Heimes33fe8092008-04-13 13:53:33 +00002224int
2225PySys_HasWarnOptions(void)
2226{
Victor Stinner838f2642019-06-13 22:41:23 +02002227 PyThreadState *tstate = _PyThreadState_GET();
2228 PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions);
Serhiy Storchakadffccc62018-12-10 13:50:22 +02002229 return (warnoptions != NULL && PyList_Check(warnoptions)
2230 && PyList_GET_SIZE(warnoptions) > 0);
Christian Heimes33fe8092008-04-13 13:53:33 +00002231}
2232
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002233static PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +02002234get_xoptions(PyThreadState *tstate)
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002235{
Victor Stinner838f2642019-06-13 22:41:23 +02002236 PyObject *xoptions = sys_get_object_id(tstate, &PyId__xoptions);
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002237 if (xoptions == NULL || !PyDict_Check(xoptions)) {
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002238 /* PEP432 TODO: we can reach this if xoptions is NULL in the main
2239 * interpreter config. When that happens, we need to properly set
2240 * the `xoptions` reference in the main interpreter config as well.
2241 *
2242 * For Python 3.7, we shouldn't be able to get here due to the
2243 * combination of how _PyMainInterpreter_ReadConfig and _PySys_EndInit
2244 * work, but we expect 3.8+ to make the _PyMainInterpreter_ReadConfig
2245 * call optional for embedding applications, thus making this
2246 * reachable again.
2247 */
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002248 xoptions = PyDict_New();
Victor Stinner838f2642019-06-13 22:41:23 +02002249 if (xoptions == NULL) {
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002250 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02002251 }
2252 if (sys_set_object_id(tstate, &PyId__xoptions, xoptions)) {
Eric Snowdae02762017-09-14 00:35:58 -07002253 Py_DECREF(xoptions);
2254 return NULL;
2255 }
2256 Py_DECREF(xoptions);
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002257 }
2258 return xoptions;
2259}
2260
Victor Stinnere1b29952018-10-30 14:31:42 +01002261static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002262_PySys_AddXOptionWithError(const wchar_t *s)
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002263{
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002264 PyObject *name = NULL, *value = NULL;
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002265
Victor Stinner838f2642019-06-13 22:41:23 +02002266 PyThreadState *tstate = _PyThreadState_GET();
2267 PyObject *opts = get_xoptions(tstate);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002268 if (opts == NULL) {
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002269 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002270 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002271
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002272 const wchar_t *name_end = wcschr(s, L'=');
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002273 if (!name_end) {
2274 name = PyUnicode_FromWideChar(s, -1);
2275 value = Py_True;
2276 Py_INCREF(value);
2277 }
2278 else {
2279 name = PyUnicode_FromWideChar(s, name_end - s);
2280 value = PyUnicode_FromWideChar(name_end + 1, -1);
2281 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002282 if (name == NULL || value == NULL) {
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002283 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002284 }
2285 if (PyDict_SetItem(opts, name, value) < 0) {
2286 goto error;
2287 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002288 Py_DECREF(name);
2289 Py_DECREF(value);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002290 return 0;
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002291
2292error:
2293 Py_XDECREF(name);
2294 Py_XDECREF(value);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002295 return -1;
2296}
2297
2298void
2299PySys_AddXOption(const wchar_t *s)
2300{
Victor Stinner50b48572018-11-01 01:51:40 +01002301 PyThreadState *tstate = _PyThreadState_GET();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002302 if (tstate == NULL) {
2303 _append_preinit_entry(&_preinit_xoptions, s);
2304 return;
2305 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002306 if (_PySys_AddXOptionWithError(s) < 0) {
2307 /* No return value, therefore clear error state if possible */
Victor Stinner120b7072019-08-23 18:03:08 +01002308 _PyErr_Clear(tstate);
Victor Stinner0cae6092016-11-11 01:43:56 +01002309 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002310}
2311
2312PyObject *
2313PySys_GetXOptions(void)
2314{
Victor Stinner838f2642019-06-13 22:41:23 +02002315 PyThreadState *tstate = _PyThreadState_GET();
2316 return get_xoptions(tstate);
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002317}
2318
Guido van Rossum40552d01998-08-06 03:34:39 +00002319/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
2320 Two literals concatenated works just fine. If you have a K&R compiler
2321 or other abomination that however *does* understand longer strings,
2322 get rid of the !!! comment in the middle and the quotes that surround it. */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002323PyDoc_VAR(sys_doc) =
2324PyDoc_STR(
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002325"This module provides access to some objects used or maintained by the\n\
2326interpreter and to functions that interact strongly with the interpreter.\n\
2327\n\
2328Dynamic objects:\n\
2329\n\
2330argv -- command line arguments; argv[0] is the script pathname if known\n\
2331path -- module search path; path[0] is the script directory, else ''\n\
2332modules -- dictionary of loaded modules\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002333\n\
2334displayhook -- called to show results in an interactive session\n\
2335excepthook -- called to handle any uncaught exception other than SystemExit\n\
2336 To customize printing in an interactive session or to install a custom\n\
2337 top-level exception handler, assign other functions to replace these.\n\
2338\n\
Benjamin Peterson06157a42008-07-15 00:28:36 +00002339stdin -- standard input file object; used by input()\n\
Georg Brandl88fc6642007-02-09 21:28:07 +00002340stdout -- standard output file object; used by print()\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002341stderr -- standard error object; used for error messages\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002342 By assigning other file objects (or objects that behave like files)\n\
2343 to these, it is possible to redirect all of the interpreter's I/O.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002344\n\
2345last_type -- type of last uncaught exception\n\
2346last_value -- value of last uncaught exception\n\
2347last_traceback -- traceback of last uncaught exception\n\
2348 These three are only available in an interactive session after a\n\
2349 traceback has been printed.\n\
Guido van Rossuma71b5f41999-01-14 19:07:00 +00002350"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002351)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002352/* concatenating string here */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002353PyDoc_STR(
Guido van Rossuma71b5f41999-01-14 19:07:00 +00002354"\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002355Static objects:\n\
2356\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002357builtin_module_names -- tuple of module names built into this interpreter\n\
2358copyright -- copyright notice pertaining to this interpreter\n\
2359exec_prefix -- prefix used to find the machine-specific Python library\n\
Petri Lehtinen4b0eab62012-02-02 21:23:15 +02002360executable -- absolute path of the executable binary of the Python interpreter\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07002361float_info -- a named tuple with information about the float implementation.\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002362float_repr_style -- string indicating the style of repr() output for floats\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07002363hash_info -- a named tuple with information about the hash algorithm.\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002364hexversion -- version information encoded as a single integer\n\
Barry Warsaw409da152012-06-03 16:18:47 -04002365implementation -- Python implementation information.\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07002366int_info -- a named tuple with information about the int implementation.\n\
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002367maxsize -- the largest supported length of containers.\n\
Serhiy Storchakad3faf432015-01-18 11:28:37 +02002368maxunicode -- the value of the largest Unicode code point\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002369platform -- platform identifier\n\
2370prefix -- prefix used to find the Python library\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07002371thread_info -- a named tuple with information about the thread implementation.\n\
Fred Drake801c08d2000-04-13 15:29:10 +00002372version -- the version of this interpreter as a string\n\
Eric Smith0e5b5622009-02-06 01:32:42 +00002373version_info -- version information as a named tuple\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002374"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002375)
Steve Dowercc16be82016-09-08 10:35:16 -07002376#ifdef MS_COREDLL
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002377/* concatenating string here */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002378PyDoc_STR(
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002379"dllhandle -- [Windows only] integer handle of the Python DLL\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002380winver -- [Windows only] version number of the Python DLL\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002381"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002382)
Steve Dowercc16be82016-09-08 10:35:16 -07002383#endif /* MS_COREDLL */
2384#ifdef MS_WINDOWS
2385/* concatenating string here */
2386PyDoc_STR(
oldkaa0735f2018-02-02 16:52:55 +08002387"_enablelegacywindowsfsencoding -- [Windows only]\n\
Steve Dowercc16be82016-09-08 10:35:16 -07002388"
2389)
2390#endif
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002391PyDoc_STR(
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002392"__stdin__ -- the original stdin; don't touch!\n\
2393__stdout__ -- the original stdout; don't touch!\n\
2394__stderr__ -- the original stderr; don't touch!\n\
2395__displayhook__ -- the original displayhook; don't touch!\n\
2396__excepthook__ -- the original excepthook; don't touch!\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002397\n\
2398Functions:\n\
2399\n\
Georg Brandl1a3284e2007-12-02 09:40:06 +00002400displayhook() -- print an object to the screen, and save it in builtins._\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002401excepthook() -- print an exception and its traceback to sys.stderr\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002402exc_info() -- return thread-safe information about the current exception\n\
2403exit() -- exit the interpreter by raising SystemExit\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +00002404getdlopenflags() -- returns flags to be used for dlopen() calls\n\
Christian Heimes9bd667a2008-01-20 15:14:11 +00002405getprofile() -- get the global profiling function\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002406getrefcount() -- return the reference count for an object (plus one :-)\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00002407getrecursionlimit() -- return the max recursion depth for the interpreter\n\
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002408getsizeof() -- return the size of an object in bytes\n\
Christian Heimes9bd667a2008-01-20 15:14:11 +00002409gettrace() -- get the global debug tracing function\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +00002410setdlopenflags() -- set the flags to be used for dlopen() calls\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002411setprofile() -- set the global profiling function\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00002412setrecursionlimit() -- set the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002413settrace() -- set the global debug tracing function\n\
Fred Drakeccede592000-08-14 20:59:57 +00002414"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002415)
Fred Drakeccede592000-08-14 20:59:57 +00002416/* end of sys_doc */ ;
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002417
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002418
2419PyDoc_STRVAR(flags__doc__,
2420"sys.flags\n\
2421\n\
2422Flags provided through command line arguments or environment vars.");
2423
2424static PyTypeObject FlagsType;
2425
2426static PyStructSequence_Field flags_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 {"debug", "-d"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 {"inspect", "-i"},
2429 {"interactive", "-i"},
2430 {"optimize", "-O or -OO"},
2431 {"dont_write_bytecode", "-B"},
2432 {"no_user_site", "-s"},
2433 {"no_site", "-S"},
2434 {"ignore_environment", "-E"},
2435 {"verbose", "-v"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 /* {"unbuffered", "-u"}, */
2437 /* {"skip_first", "-x"}, */
Georg Brandl8aa7e992010-12-28 18:30:18 +00002438 {"bytes_warning", "-b"},
2439 {"quiet", "-q"},
Georg Brandl09a7c722012-02-20 21:31:46 +01002440 {"hash_randomization", "-R"},
Christian Heimesad73a9c2013-08-10 16:36:18 +02002441 {"isolated", "-I"},
Victor Stinner5e3806f2017-11-30 11:40:24 +01002442 {"dev_mode", "-X dev"},
Victor Stinner91106cd2017-12-13 12:29:09 +01002443 {"utf8_mode", "-X utf8"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 {0}
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002445};
2446
2447static PyStructSequence_Desc flags_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 "sys.flags", /* name */
2449 flags__doc__, /* doc */
2450 flags_fields, /* fields */
Victor Stinner91106cd2017-12-13 12:29:09 +01002451 15
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002452};
2453
2454static PyObject*
Victor Stinner01b1cc12019-11-20 02:27:56 +01002455make_flags(PyThreadState *tstate)
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002456{
Victor Stinner01b1cc12019-11-20 02:27:56 +01002457 PyInterpreterState *interp = tstate->interp;
2458 const PyPreConfig *preconfig = &interp->runtime->preconfig;
Victor Stinnerda7933e2020-04-13 03:04:28 +02002459 const PyConfig *config = _PyInterpreterState_GetConfig(interp);
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002460
Victor Stinner01b1cc12019-11-20 02:27:56 +01002461 PyObject *seq = PyStructSequence_New(&FlagsType);
2462 if (seq == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 return NULL;
Victor Stinner01b1cc12019-11-20 02:27:56 +01002464 }
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002465
Victor Stinner01b1cc12019-11-20 02:27:56 +01002466 int pos = 0;
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002467#define SetFlag(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag))
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002469
Victor Stinnerfbca9082018-08-30 00:50:45 +02002470 SetFlag(config->parser_debug);
2471 SetFlag(config->inspect);
2472 SetFlag(config->interactive);
2473 SetFlag(config->optimization_level);
2474 SetFlag(!config->write_bytecode);
2475 SetFlag(!config->user_site_directory);
2476 SetFlag(!config->site_import);
Victor Stinner20004952019-03-26 02:31:11 +01002477 SetFlag(!config->use_environment);
Victor Stinnerfbca9082018-08-30 00:50:45 +02002478 SetFlag(config->verbose);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 /* SetFlag(saw_unbuffered_flag); */
2480 /* SetFlag(skipfirstline); */
Victor Stinnerfbca9082018-08-30 00:50:45 +02002481 SetFlag(config->bytes_warning);
2482 SetFlag(config->quiet);
2483 SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0);
Victor Stinner20004952019-03-26 02:31:11 +01002484 SetFlag(config->isolated);
2485 PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode));
2486 SetFlag(preconfig->utf8_mode);
Victor Stinner91106cd2017-12-13 12:29:09 +01002487#undef SetFlag
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002488
Victor Stinner838f2642019-06-13 22:41:23 +02002489 if (_PyErr_Occurred(tstate)) {
Serhiy Storchaka87a854d2013-12-17 14:59:42 +02002490 Py_DECREF(seq);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 return NULL;
2492 }
2493 return seq;
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002494}
2495
Eric Smith0e5b5622009-02-06 01:32:42 +00002496PyDoc_STRVAR(version_info__doc__,
2497"sys.version_info\n\
2498\n\
2499Version information as a named tuple.");
2500
2501static PyTypeObject VersionInfoType;
2502
2503static PyStructSequence_Field version_info_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 {"major", "Major release number"},
2505 {"minor", "Minor release number"},
2506 {"micro", "Patch release number"},
Ned Deilyda4887a2016-11-04 17:03:34 -04002507 {"releaselevel", "'alpha', 'beta', 'candidate', or 'final'"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 {"serial", "Serial release number"},
2509 {0}
Eric Smith0e5b5622009-02-06 01:32:42 +00002510};
2511
2512static PyStructSequence_Desc version_info_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 "sys.version_info", /* name */
2514 version_info__doc__, /* doc */
2515 version_info_fields, /* fields */
2516 5
Eric Smith0e5b5622009-02-06 01:32:42 +00002517};
2518
2519static PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +02002520make_version_info(PyThreadState *tstate)
Eric Smith0e5b5622009-02-06 01:32:42 +00002521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 PyObject *version_info;
2523 char *s;
2524 int pos = 0;
Eric Smith0e5b5622009-02-06 01:32:42 +00002525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 version_info = PyStructSequence_New(&VersionInfoType);
2527 if (version_info == NULL) {
2528 return NULL;
2529 }
Eric Smith0e5b5622009-02-06 01:32:42 +00002530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 /*
2532 * These release level checks are mutually exclusive and cover
2533 * the field, so don't get too fancy with the pre-processor!
2534 */
Eric Smith0e5b5622009-02-06 01:32:42 +00002535#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 s = "alpha";
Eric Smith0e5b5622009-02-06 01:32:42 +00002537#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 s = "beta";
Eric Smith0e5b5622009-02-06 01:32:42 +00002539#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540 s = "candidate";
Eric Smith0e5b5622009-02-06 01:32:42 +00002541#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 s = "final";
Eric Smith0e5b5622009-02-06 01:32:42 +00002543#endif
2544
2545#define SetIntItem(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 PyStructSequence_SET_ITEM(version_info, pos++, PyLong_FromLong(flag))
Eric Smith0e5b5622009-02-06 01:32:42 +00002547#define SetStrItem(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 PyStructSequence_SET_ITEM(version_info, pos++, PyUnicode_FromString(flag))
Eric Smith0e5b5622009-02-06 01:32:42 +00002549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 SetIntItem(PY_MAJOR_VERSION);
2551 SetIntItem(PY_MINOR_VERSION);
2552 SetIntItem(PY_MICRO_VERSION);
2553 SetStrItem(s);
2554 SetIntItem(PY_RELEASE_SERIAL);
Eric Smith0e5b5622009-02-06 01:32:42 +00002555#undef SetIntItem
2556#undef SetStrItem
2557
Victor Stinner838f2642019-06-13 22:41:23 +02002558 if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 Py_CLEAR(version_info);
2560 return NULL;
2561 }
2562 return version_info;
Eric Smith0e5b5622009-02-06 01:32:42 +00002563}
2564
Brett Cannon3adc7b72012-07-09 14:22:12 -04002565/* sys.implementation values */
2566#define NAME "cpython"
2567const char *_PySys_ImplName = NAME;
Victor Stinnercf01b682015-11-05 11:21:38 +01002568#define MAJOR Py_STRINGIFY(PY_MAJOR_VERSION)
2569#define MINOR Py_STRINGIFY(PY_MINOR_VERSION)
Ned Deily529ea5d2014-06-30 23:31:14 -07002570#define TAG NAME "-" MAJOR MINOR
Brett Cannon3adc7b72012-07-09 14:22:12 -04002571const char *_PySys_ImplCacheTag = TAG;
2572#undef NAME
Brett Cannon3adc7b72012-07-09 14:22:12 -04002573#undef MAJOR
2574#undef MINOR
2575#undef TAG
2576
Barry Warsaw409da152012-06-03 16:18:47 -04002577static PyObject *
2578make_impl_info(PyObject *version_info)
2579{
2580 int res;
2581 PyObject *impl_info, *value, *ns;
2582
2583 impl_info = PyDict_New();
2584 if (impl_info == NULL)
2585 return NULL;
2586
2587 /* populate the dict */
2588
Brett Cannon3adc7b72012-07-09 14:22:12 -04002589 value = PyUnicode_FromString(_PySys_ImplName);
Barry Warsaw409da152012-06-03 16:18:47 -04002590 if (value == NULL)
2591 goto error;
2592 res = PyDict_SetItemString(impl_info, "name", value);
2593 Py_DECREF(value);
2594 if (res < 0)
2595 goto error;
2596
Brett Cannon3adc7b72012-07-09 14:22:12 -04002597 value = PyUnicode_FromString(_PySys_ImplCacheTag);
Barry Warsaw409da152012-06-03 16:18:47 -04002598 if (value == NULL)
2599 goto error;
2600 res = PyDict_SetItemString(impl_info, "cache_tag", value);
2601 Py_DECREF(value);
2602 if (res < 0)
2603 goto error;
Barry Warsaw409da152012-06-03 16:18:47 -04002604
2605 res = PyDict_SetItemString(impl_info, "version", version_info);
2606 if (res < 0)
2607 goto error;
2608
2609 value = PyLong_FromLong(PY_VERSION_HEX);
2610 if (value == NULL)
2611 goto error;
2612 res = PyDict_SetItemString(impl_info, "hexversion", value);
2613 Py_DECREF(value);
2614 if (res < 0)
2615 goto error;
2616
doko@ubuntu.com55532312016-06-14 08:55:19 +02002617#ifdef MULTIARCH
2618 value = PyUnicode_FromString(MULTIARCH);
2619 if (value == NULL)
2620 goto error;
2621 res = PyDict_SetItemString(impl_info, "_multiarch", value);
2622 Py_DECREF(value);
2623 if (res < 0)
2624 goto error;
2625#endif
2626
Barry Warsaw409da152012-06-03 16:18:47 -04002627 /* dict ready */
2628
2629 ns = _PyNamespace_New(impl_info);
2630 Py_DECREF(impl_info);
2631 return ns;
2632
2633error:
2634 Py_CLEAR(impl_info);
2635 return NULL;
2636}
2637
Martin v. Löwis1a214512008-06-11 05:26:20 +00002638static struct PyModuleDef sysmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 PyModuleDef_HEAD_INIT,
2640 "sys",
2641 sys_doc,
2642 -1, /* multiple "initialization" just copies the module dict. */
2643 sys_methods,
2644 NULL,
2645 NULL,
2646 NULL,
2647 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002648};
2649
Eric Snow6b4be192017-05-22 21:36:03 -07002650/* Updating the sys namespace, returning NULL pointer on error */
Victor Stinner8fea2522013-10-27 17:15:42 +01002651#define SET_SYS_FROM_STRING_BORROW(key, value) \
Victor Stinner58049602013-07-22 22:40:00 +02002652 do { \
Victor Stinner58049602013-07-22 22:40:00 +02002653 PyObject *v = (value); \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002654 if (v == NULL) { \
2655 goto err_occurred; \
2656 } \
Victor Stinner58049602013-07-22 22:40:00 +02002657 res = PyDict_SetItemString(sysdict, key, v); \
2658 if (res < 0) { \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002659 goto err_occurred; \
Victor Stinner8fea2522013-10-27 17:15:42 +01002660 } \
2661 } while (0)
2662#define SET_SYS_FROM_STRING(key, value) \
2663 do { \
Victor Stinner8fea2522013-10-27 17:15:42 +01002664 PyObject *v = (value); \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002665 if (v == NULL) { \
2666 goto err_occurred; \
2667 } \
Victor Stinner8fea2522013-10-27 17:15:42 +01002668 res = PyDict_SetItemString(sysdict, key, v); \
2669 Py_DECREF(v); \
2670 if (res < 0) { \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002671 goto err_occurred; \
Victor Stinner58049602013-07-22 22:40:00 +02002672 } \
2673 } while (0)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002674
Victor Stinner331a6a52019-05-27 16:39:22 +02002675static PyStatus
Victor Stinner01b1cc12019-11-20 02:27:56 +01002676_PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
Eric Snow6b4be192017-05-22 21:36:03 -07002677{
Victor Stinnerab672812019-01-23 15:04:40 +01002678 PyObject *version_info;
Eric Snow6b4be192017-05-22 21:36:03 -07002679 int res;
2680
Nick Coghland6009512014-11-20 21:39:37 +10002681 /* stdin/stdout/stderr are set in pylifecycle.c */
Martin v. Löwis5467d4c2003-05-10 07:10:12 +00002682
Victor Stinner8fea2522013-10-27 17:15:42 +01002683 SET_SYS_FROM_STRING_BORROW("__displayhook__",
2684 PyDict_GetItemString(sysdict, "displayhook"));
2685 SET_SYS_FROM_STRING_BORROW("__excepthook__",
2686 PyDict_GetItemString(sysdict, "excepthook"));
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04002687 SET_SYS_FROM_STRING_BORROW(
2688 "__breakpointhook__",
2689 PyDict_GetItemString(sysdict, "breakpointhook"));
Victor Stinneref9d9b62019-05-22 11:28:22 +02002690 SET_SYS_FROM_STRING_BORROW("__unraisablehook__",
2691 PyDict_GetItemString(sysdict, "unraisablehook"));
2692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 SET_SYS_FROM_STRING("version",
2694 PyUnicode_FromString(Py_GetVersion()));
2695 SET_SYS_FROM_STRING("hexversion",
2696 PyLong_FromLong(PY_VERSION_HEX));
Ned Deily5c4b0d02017-03-04 00:19:55 -05002697 SET_SYS_FROM_STRING("_git",
2698 Py_BuildValue("(szz)", "CPython", _Py_gitidentifier(),
2699 _Py_gitversion()));
INADA Naoki6b42eb12017-06-29 15:31:38 +09002700 SET_SYS_FROM_STRING("_framework", PyUnicode_FromString(_PYTHONFRAMEWORK));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 SET_SYS_FROM_STRING("api_version",
2702 PyLong_FromLong(PYTHON_API_VERSION));
2703 SET_SYS_FROM_STRING("copyright",
2704 PyUnicode_FromString(Py_GetCopyright()));
2705 SET_SYS_FROM_STRING("platform",
2706 PyUnicode_FromString(Py_GetPlatform()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 SET_SYS_FROM_STRING("maxsize",
2708 PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2709 SET_SYS_FROM_STRING("float_info",
2710 PyFloat_GetInfo());
2711 SET_SYS_FROM_STRING("int_info",
2712 PyLong_GetInfo());
Mark Dickinsondc787d22010-05-23 13:33:13 +00002713 /* initialize hash_info */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002714 if (Hash_InfoType.tp_name == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002715 if (PyStructSequence_InitType2(&Hash_InfoType, &hash_info_desc) < 0) {
2716 goto type_init_failed;
2717 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02002718 }
Mark Dickinsondc787d22010-05-23 13:33:13 +00002719 SET_SYS_FROM_STRING("hash_info",
Victor Stinner838f2642019-06-13 22:41:23 +02002720 get_hash_info(tstate));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 SET_SYS_FROM_STRING("maxunicode",
Ezio Melotti48a2f8f2011-09-29 00:18:19 +03002722 PyLong_FromLong(0x10FFFF));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 SET_SYS_FROM_STRING("builtin_module_names",
2724 list_builtin_module_names());
Christian Heimes743e0cd2012-10-17 23:52:17 +02002725#if PY_BIG_ENDIAN
2726 SET_SYS_FROM_STRING("byteorder",
2727 PyUnicode_FromString("big"));
2728#else
2729 SET_SYS_FROM_STRING("byteorder",
2730 PyUnicode_FromString("little"));
2731#endif
Fred Drake099325e2000-08-14 15:47:03 +00002732
Guido van Rossum8b9ea871996-08-23 18:14:47 +00002733#ifdef MS_COREDLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 SET_SYS_FROM_STRING("dllhandle",
2735 PyLong_FromVoidPtr(PyWin_DLLhModule));
2736 SET_SYS_FROM_STRING("winver",
2737 PyUnicode_FromString(PyWin_DLLVersionString));
Guido van Rossumc606fe11996-04-09 02:37:57 +00002738#endif
Barry Warsaw8cf4eae2010-10-16 01:04:07 +00002739#ifdef ABIFLAGS
2740 SET_SYS_FROM_STRING("abiflags",
2741 PyUnicode_FromString(ABIFLAGS));
2742#endif
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 /* version_info */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002745 if (VersionInfoType.tp_name == NULL) {
2746 if (PyStructSequence_InitType2(&VersionInfoType,
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002747 &version_info_desc) < 0) {
2748 goto type_init_failed;
2749 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02002750 }
Victor Stinner838f2642019-06-13 22:41:23 +02002751 version_info = make_version_info(tstate);
Barry Warsaw409da152012-06-03 16:18:47 -04002752 SET_SYS_FROM_STRING("version_info", version_info);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 /* prevent user from creating new instances */
2754 VersionInfoType.tp_init = NULL;
2755 VersionInfoType.tp_new = NULL;
Antoine Pitrou871dfc42014-04-28 13:07:06 +02002756 res = PyDict_DelItemString(VersionInfoType.tp_dict, "__new__");
Victor Stinner838f2642019-06-13 22:41:23 +02002757 if (res < 0 && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2758 _PyErr_Clear(tstate);
2759 }
Eric Smith0e5b5622009-02-06 01:32:42 +00002760
Barry Warsaw409da152012-06-03 16:18:47 -04002761 /* implementation */
2762 SET_SYS_FROM_STRING("implementation", make_impl_info(version_info));
2763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 /* flags */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002765 if (FlagsType.tp_name == 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002766 if (PyStructSequence_InitType2(&FlagsType, &flags_desc) < 0) {
2767 goto type_init_failed;
2768 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02002769 }
Victor Stinner43125222019-04-24 18:23:53 +02002770 /* Set flags to their default values (updated by _PySys_InitMain()) */
Victor Stinner01b1cc12019-11-20 02:27:56 +01002771 SET_SYS_FROM_STRING("flags", make_flags(tstate));
Eric Smithf7bb5782010-01-27 00:44:57 +00002772
2773#if defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 /* getwindowsversion */
2775 if (WindowsVersionType.tp_name == 0)
Victor Stinner1c8f0592013-07-22 22:24:54 +02002776 if (PyStructSequence_InitType2(&WindowsVersionType,
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002777 &windows_version_desc) < 0) {
2778 goto type_init_failed;
2779 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 /* prevent user from creating new instances */
2781 WindowsVersionType.tp_init = NULL;
2782 WindowsVersionType.tp_new = NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02002783 assert(!_PyErr_Occurred(tstate));
Antoine Pitrou871dfc42014-04-28 13:07:06 +02002784 res = PyDict_DelItemString(WindowsVersionType.tp_dict, "__new__");
Victor Stinner838f2642019-06-13 22:41:23 +02002785 if (res < 0 && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2786 _PyErr_Clear(tstate);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002787 }
Eric Smithf7bb5782010-01-27 00:44:57 +00002788#endif
2789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00002791#ifndef PY_NO_SHORT_FLOAT_REPR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 SET_SYS_FROM_STRING("float_repr_style",
2793 PyUnicode_FromString("short"));
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00002794#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 SET_SYS_FROM_STRING("float_repr_style",
2796 PyUnicode_FromString("legacy"));
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00002797#endif
2798
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002799 SET_SYS_FROM_STRING("thread_info", PyThread_GetInfo());
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002800
Yury Selivanoveb636452016-09-08 22:01:51 -07002801 /* initialize asyncgen_hooks */
2802 if (AsyncGenHooksType.tp_name == NULL) {
2803 if (PyStructSequence_InitType2(
2804 &AsyncGenHooksType, &asyncgen_hooks_desc) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002805 goto type_init_failed;
Yury Selivanoveb636452016-09-08 22:01:51 -07002806 }
2807 }
2808
Victor Stinner838f2642019-06-13 22:41:23 +02002809 if (_PyErr_Occurred(tstate)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002810 goto err_occurred;
2811 }
Victor Stinner331a6a52019-05-27 16:39:22 +02002812 return _PyStatus_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002813
2814type_init_failed:
Victor Stinner331a6a52019-05-27 16:39:22 +02002815 return _PyStatus_ERR("failed to initialize a type");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002816
2817err_occurred:
Victor Stinner331a6a52019-05-27 16:39:22 +02002818 return _PyStatus_ERR("can't initialize sys module");
Guido van Rossum5b3138b1990-11-18 17:41:40 +00002819}
2820
Eric Snow6b4be192017-05-22 21:36:03 -07002821/* Updating the sys namespace, returning integer error codes */
Eric Snow6b4be192017-05-22 21:36:03 -07002822#define SET_SYS_FROM_STRING_INT_RESULT(key, value) \
2823 do { \
2824 PyObject *v = (value); \
2825 if (v == NULL) \
2826 return -1; \
2827 res = PyDict_SetItemString(sysdict, key, v); \
2828 Py_DECREF(v); \
2829 if (res < 0) { \
2830 return res; \
2831 } \
2832 } while (0)
2833
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002834
2835static int
2836sys_add_xoption(PyObject *opts, const wchar_t *s)
2837{
2838 PyObject *name, *value;
2839
2840 const wchar_t *name_end = wcschr(s, L'=');
2841 if (!name_end) {
2842 name = PyUnicode_FromWideChar(s, -1);
2843 value = Py_True;
2844 Py_INCREF(value);
2845 }
2846 else {
2847 name = PyUnicode_FromWideChar(s, name_end - s);
2848 value = PyUnicode_FromWideChar(name_end + 1, -1);
2849 }
2850 if (name == NULL || value == NULL) {
2851 goto error;
2852 }
2853 if (PyDict_SetItem(opts, name, value) < 0) {
2854 goto error;
2855 }
2856 Py_DECREF(name);
2857 Py_DECREF(value);
2858 return 0;
2859
2860error:
2861 Py_XDECREF(name);
2862 Py_XDECREF(value);
2863 return -1;
2864}
2865
2866
2867static PyObject*
Victor Stinner331a6a52019-05-27 16:39:22 +02002868sys_create_xoptions_dict(const PyConfig *config)
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002869{
2870 Py_ssize_t nxoption = config->xoptions.length;
2871 wchar_t * const * xoptions = config->xoptions.items;
2872 PyObject *dict = PyDict_New();
2873 if (dict == NULL) {
2874 return NULL;
2875 }
2876
2877 for (Py_ssize_t i=0; i < nxoption; i++) {
2878 const wchar_t *option = xoptions[i];
2879 if (sys_add_xoption(dict, option) < 0) {
2880 Py_DECREF(dict);
2881 return NULL;
2882 }
2883 }
2884
2885 return dict;
2886}
2887
2888
Eric Snow6b4be192017-05-22 21:36:03 -07002889int
Victor Stinner01b1cc12019-11-20 02:27:56 +01002890_PySys_InitMain(PyThreadState *tstate)
Eric Snow6b4be192017-05-22 21:36:03 -07002891{
Victor Stinner838f2642019-06-13 22:41:23 +02002892 PyObject *sysdict = tstate->interp->sysdict;
Victor Stinnerda7933e2020-04-13 03:04:28 +02002893 const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp);
Eric Snow6b4be192017-05-22 21:36:03 -07002894 int res;
2895
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002896#define COPY_LIST(KEY, VALUE) \
Victor Stinner37cd9822018-11-16 11:55:35 +01002897 do { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002898 PyObject *list = _PyWideStringList_AsList(&(VALUE)); \
Victor Stinner37cd9822018-11-16 11:55:35 +01002899 if (list == NULL) { \
2900 return -1; \
2901 } \
2902 SET_SYS_FROM_STRING_BORROW(KEY, list); \
2903 Py_DECREF(list); \
2904 } while (0)
2905
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002906#define SET_SYS_FROM_WSTR(KEY, VALUE) \
2907 do { \
2908 PyObject *str = PyUnicode_FromWideChar(VALUE, -1); \
2909 if (str == NULL) { \
2910 return -1; \
2911 } \
2912 SET_SYS_FROM_STRING_BORROW(KEY, str); \
2913 Py_DECREF(str); \
2914 } while (0)
Victor Stinner37cd9822018-11-16 11:55:35 +01002915
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002916 COPY_LIST("path", config->module_search_paths);
2917
2918 SET_SYS_FROM_WSTR("executable", config->executable);
Steve Dower9048c492019-06-29 10:34:11 -07002919 SET_SYS_FROM_WSTR("_base_executable", config->base_executable);
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002920 SET_SYS_FROM_WSTR("prefix", config->prefix);
2921 SET_SYS_FROM_WSTR("base_prefix", config->base_prefix);
2922 SET_SYS_FROM_WSTR("exec_prefix", config->exec_prefix);
2923 SET_SYS_FROM_WSTR("base_exec_prefix", config->base_exec_prefix);
Victor Stinner8510f432020-03-10 09:53:09 +01002924 {
2925 PyObject *str = PyUnicode_FromString(PLATLIBDIR);
2926 if (str == NULL) {
2927 return -1;
2928 }
2929 SET_SYS_FROM_STRING("platlibdir", str);
2930 }
Victor Stinner41264f12017-12-15 02:05:29 +01002931
Carl Meyerb193fa92018-06-15 22:40:56 -06002932 if (config->pycache_prefix != NULL) {
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002933 SET_SYS_FROM_WSTR("pycache_prefix", config->pycache_prefix);
Carl Meyerb193fa92018-06-15 22:40:56 -06002934 } else {
2935 PyDict_SetItemString(sysdict, "pycache_prefix", Py_None);
2936 }
2937
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002938 COPY_LIST("argv", config->argv);
2939 COPY_LIST("warnoptions", config->warnoptions);
2940
2941 PyObject *xoptions = sys_create_xoptions_dict(config);
2942 if (xoptions == NULL) {
2943 return -1;
Victor Stinner41264f12017-12-15 02:05:29 +01002944 }
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002945 SET_SYS_FROM_STRING_BORROW("_xoptions", xoptions);
Pablo Galindo34ef64f2019-03-27 12:43:47 +00002946 Py_DECREF(xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002947
Victor Stinner37cd9822018-11-16 11:55:35 +01002948#undef COPY_LIST
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002949#undef SET_SYS_FROM_WSTR
Victor Stinner37cd9822018-11-16 11:55:35 +01002950
Victor Stinner8510f432020-03-10 09:53:09 +01002951
Eric Snow6b4be192017-05-22 21:36:03 -07002952 /* Set flags to their final values */
Victor Stinner01b1cc12019-11-20 02:27:56 +01002953 SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(tstate));
Eric Snow6b4be192017-05-22 21:36:03 -07002954 /* prevent user from creating new instances */
2955 FlagsType.tp_init = NULL;
2956 FlagsType.tp_new = NULL;
2957 res = PyDict_DelItemString(FlagsType.tp_dict, "__new__");
2958 if (res < 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02002959 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Eric Snow6b4be192017-05-22 21:36:03 -07002960 return res;
2961 }
Victor Stinner838f2642019-06-13 22:41:23 +02002962 _PyErr_Clear(tstate);
Eric Snow6b4be192017-05-22 21:36:03 -07002963 }
2964
2965 SET_SYS_FROM_STRING_INT_RESULT("dont_write_bytecode",
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002966 PyBool_FromLong(!config->write_bytecode));
Eric Snow6b4be192017-05-22 21:36:03 -07002967
Victor Stinner838f2642019-06-13 22:41:23 +02002968 if (get_warnoptions(tstate) == NULL) {
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002969 return -1;
Victor Stinner838f2642019-06-13 22:41:23 +02002970 }
Victor Stinner865de272017-06-08 13:27:47 +02002971
Victor Stinner838f2642019-06-13 22:41:23 +02002972 if (get_xoptions(tstate) == NULL)
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002973 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -07002974
Victor Stinner838f2642019-06-13 22:41:23 +02002975 if (_PyErr_Occurred(tstate)) {
2976 goto err_occurred;
2977 }
2978
Eric Snow6b4be192017-05-22 21:36:03 -07002979 return 0;
Victor Stinner41264f12017-12-15 02:05:29 +01002980
2981err_occurred:
2982 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -07002983}
2984
Victor Stinner8510f432020-03-10 09:53:09 +01002985#undef SET_SYS_FROM_STRING
Victor Stinner41264f12017-12-15 02:05:29 +01002986#undef SET_SYS_FROM_STRING_BORROW
Eric Snow6b4be192017-05-22 21:36:03 -07002987#undef SET_SYS_FROM_STRING_INT_RESULT
Eric Snow6b4be192017-05-22 21:36:03 -07002988
Victor Stinnerab672812019-01-23 15:04:40 +01002989
2990/* Set up a preliminary stderr printer until we have enough
2991 infrastructure for the io module in place.
2992
2993 Use UTF-8/surrogateescape and ignore EAGAIN errors. */
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002994static PyStatus
Victor Stinnerab672812019-01-23 15:04:40 +01002995_PySys_SetPreliminaryStderr(PyObject *sysdict)
2996{
2997 PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr));
2998 if (pstderr == NULL) {
2999 goto error;
3000 }
3001 if (_PyDict_SetItemId(sysdict, &PyId_stderr, pstderr) < 0) {
3002 goto error;
3003 }
3004 if (PyDict_SetItemString(sysdict, "__stderr__", pstderr) < 0) {
3005 goto error;
3006 }
3007 Py_DECREF(pstderr);
Victor Stinner331a6a52019-05-27 16:39:22 +02003008 return _PyStatus_OK();
Victor Stinnerab672812019-01-23 15:04:40 +01003009
3010error:
3011 Py_XDECREF(pstderr);
Victor Stinner331a6a52019-05-27 16:39:22 +02003012 return _PyStatus_ERR("can't set preliminary stderr");
Victor Stinnerab672812019-01-23 15:04:40 +01003013}
3014
3015
3016/* Create sys module without all attributes: _PySys_InitMain() should be called
3017 later to add remaining attributes. */
Victor Stinner331a6a52019-05-27 16:39:22 +02003018PyStatus
Victor Stinner01b1cc12019-11-20 02:27:56 +01003019_PySys_Create(PyThreadState *tstate, PyObject **sysmod_p)
Victor Stinnerab672812019-01-23 15:04:40 +01003020{
Victor Stinner81fe5bd2019-12-06 02:43:30 +01003021 assert(!_PyErr_Occurred(tstate));
3022
Victor Stinnerb45d2592019-06-20 00:05:23 +02003023 PyInterpreterState *interp = tstate->interp;
Victor Stinner838f2642019-06-13 22:41:23 +02003024
Victor Stinnerab672812019-01-23 15:04:40 +01003025 PyObject *modules = PyDict_New();
3026 if (modules == NULL) {
Victor Stinner81fe5bd2019-12-06 02:43:30 +01003027 goto error;
Victor Stinnerab672812019-01-23 15:04:40 +01003028 }
3029 interp->modules = modules;
3030
3031 PyObject *sysmod = _PyModule_CreateInitialized(&sysmodule, PYTHON_API_VERSION);
3032 if (sysmod == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +02003033 return _PyStatus_ERR("failed to create a module object");
Victor Stinnerab672812019-01-23 15:04:40 +01003034 }
3035
3036 PyObject *sysdict = PyModule_GetDict(sysmod);
3037 if (sysdict == NULL) {
Victor Stinner81fe5bd2019-12-06 02:43:30 +01003038 goto error;
Victor Stinnerab672812019-01-23 15:04:40 +01003039 }
3040 Py_INCREF(sysdict);
3041 interp->sysdict = sysdict;
3042
3043 if (PyDict_SetItemString(sysdict, "modules", interp->modules) < 0) {
Victor Stinner81fe5bd2019-12-06 02:43:30 +01003044 goto error;
Victor Stinnerab672812019-01-23 15:04:40 +01003045 }
3046
Victor Stinner331a6a52019-05-27 16:39:22 +02003047 PyStatus status = _PySys_SetPreliminaryStderr(sysdict);
3048 if (_PyStatus_EXCEPTION(status)) {
3049 return status;
Victor Stinnerab672812019-01-23 15:04:40 +01003050 }
3051
Victor Stinner01b1cc12019-11-20 02:27:56 +01003052 status = _PySys_InitCore(tstate, sysdict);
Victor Stinner331a6a52019-05-27 16:39:22 +02003053 if (_PyStatus_EXCEPTION(status)) {
3054 return status;
Victor Stinnerab672812019-01-23 15:04:40 +01003055 }
3056
Victor Stinner81fe5bd2019-12-06 02:43:30 +01003057 if (_PyImport_FixupBuiltin(sysmod, "sys", interp->modules) < 0) {
3058 goto error;
3059 }
3060
3061 assert(!_PyErr_Occurred(tstate));
Victor Stinnerab672812019-01-23 15:04:40 +01003062
3063 *sysmod_p = sysmod;
Victor Stinner331a6a52019-05-27 16:39:22 +02003064 return _PyStatus_OK();
Victor Stinner81fe5bd2019-12-06 02:43:30 +01003065
3066error:
3067 return _PyStatus_ERR("can't initialize sys module");
Victor Stinnerab672812019-01-23 15:04:40 +01003068}
3069
3070
Guido van Rossum65bf9f21997-04-29 18:33:38 +00003071static PyObject *
Martin v. Löwis790465f2008-04-05 20:41:37 +00003072makepathobject(const wchar_t *path, wchar_t delim)
Guido van Rossum5b3138b1990-11-18 17:41:40 +00003073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 int i, n;
3075 const wchar_t *p;
3076 PyObject *v, *w;
Tim Peters216b78b2006-01-06 02:40:53 +00003077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003078 n = 1;
3079 p = path;
3080 while ((p = wcschr(p, delim)) != NULL) {
3081 n++;
3082 p++;
3083 }
3084 v = PyList_New(n);
3085 if (v == NULL)
3086 return NULL;
3087 for (i = 0; ; i++) {
3088 p = wcschr(path, delim);
3089 if (p == NULL)
3090 p = path + wcslen(path); /* End of string */
3091 w = PyUnicode_FromWideChar(path, (Py_ssize_t)(p - path));
3092 if (w == NULL) {
3093 Py_DECREF(v);
3094 return NULL;
3095 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07003096 PyList_SET_ITEM(v, i, w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 if (*p == '\0')
3098 break;
3099 path = p+1;
3100 }
3101 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003102}
3103
3104void
Martin v. Löwis790465f2008-04-05 20:41:37 +00003105PySys_SetPath(const wchar_t *path)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 PyObject *v;
3108 if ((v = makepathobject(path, DELIM)) == NULL)
3109 Py_FatalError("can't create sys.path");
Victor Stinner838f2642019-06-13 22:41:23 +02003110 PyThreadState *tstate = _PyThreadState_GET();
3111 if (sys_set_object_id(tstate, &PyId_path, v) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 Py_FatalError("can't assign sys.path");
Victor Stinner838f2642019-06-13 22:41:23 +02003113 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003115}
3116
Guido van Rossum65bf9f21997-04-29 18:33:38 +00003117static PyObject *
Victor Stinner74f65682019-03-15 15:08:05 +01003118make_sys_argv(int argc, wchar_t * const * argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003119{
Victor Stinner74f65682019-03-15 15:08:05 +01003120 PyObject *list = PyList_New(argc);
3121 if (list == NULL) {
3122 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003123 }
Victor Stinner74f65682019-03-15 15:08:05 +01003124
3125 for (Py_ssize_t i = 0; i < argc; i++) {
3126 PyObject *v = PyUnicode_FromWideChar(argv[i], -1);
3127 if (v == NULL) {
3128 Py_DECREF(list);
3129 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003130 }
Victor Stinner74f65682019-03-15 15:08:05 +01003131 PyList_SET_ITEM(list, i, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 }
Victor Stinner74f65682019-03-15 15:08:05 +01003133 return list;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003134}
3135
Victor Stinner11a247d2017-12-13 21:05:57 +01003136void
3137PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
Victor Stinnerd5dda982017-12-13 17:31:16 +01003138{
Victor Stinnerc4868252019-08-23 11:04:16 +01003139 wchar_t* empty_argv[1] = {L""};
Victor Stinner838f2642019-06-13 22:41:23 +02003140 PyThreadState *tstate = _PyThreadState_GET();
3141
Victor Stinner74f65682019-03-15 15:08:05 +01003142 if (argc < 1 || argv == NULL) {
3143 /* Ensure at least one (empty) argument is seen */
Victor Stinner74f65682019-03-15 15:08:05 +01003144 argv = empty_argv;
3145 argc = 1;
3146 }
3147
3148 PyObject *av = make_sys_argv(argc, argv);
Victor Stinnerd5dda982017-12-13 17:31:16 +01003149 if (av == NULL) {
Victor Stinner11a247d2017-12-13 21:05:57 +01003150 Py_FatalError("no mem for sys.argv");
Victor Stinnerd5dda982017-12-13 17:31:16 +01003151 }
Victor Stinner838f2642019-06-13 22:41:23 +02003152 if (sys_set_object(tstate, "argv", av) != 0) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01003153 Py_DECREF(av);
Victor Stinner11a247d2017-12-13 21:05:57 +01003154 Py_FatalError("can't assign sys.argv");
Victor Stinnerd5dda982017-12-13 17:31:16 +01003155 }
3156 Py_DECREF(av);
3157
3158 if (updatepath) {
3159 /* If argv[0] is not '-c' nor '-m', prepend argv[0] to sys.path.
3160 If argv[0] is a symlink, use the real path. */
Victor Stinner331a6a52019-05-27 16:39:22 +02003161 const PyWideStringList argv_list = {.length = argc, .items = argv};
Victor Stinnerdcf61712019-03-19 16:09:27 +01003162 PyObject *path0 = NULL;
3163 if (_PyPathConfig_ComputeSysPath0(&argv_list, &path0)) {
3164 if (path0 == NULL) {
3165 Py_FatalError("can't compute path0 from argv");
Victor Stinner11a247d2017-12-13 21:05:57 +01003166 }
Victor Stinnerdcf61712019-03-19 16:09:27 +01003167
Victor Stinner838f2642019-06-13 22:41:23 +02003168 PyObject *sys_path = sys_get_object_id(tstate, &PyId_path);
Victor Stinnerdcf61712019-03-19 16:09:27 +01003169 if (sys_path != NULL) {
3170 if (PyList_Insert(sys_path, 0, path0) < 0) {
3171 Py_DECREF(path0);
3172 Py_FatalError("can't prepend path0 to sys.path");
3173 }
3174 }
3175 Py_DECREF(path0);
Victor Stinner11a247d2017-12-13 21:05:57 +01003176 }
Victor Stinnerd5dda982017-12-13 17:31:16 +01003177 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003178}
Guido van Rossuma890e681998-05-12 14:59:24 +00003179
Antoine Pitrouf978fac2010-05-21 17:25:34 +00003180void
3181PySys_SetArgv(int argc, wchar_t **argv)
3182{
Christian Heimesad73a9c2013-08-10 16:36:18 +02003183 PySys_SetArgvEx(argc, argv, Py_IsolatedFlag == 0);
Antoine Pitrouf978fac2010-05-21 17:25:34 +00003184}
3185
Victor Stinner14284c22010-04-23 12:02:30 +00003186/* Reimplementation of PyFile_WriteString() no calling indirectly
3187 PyErr_CheckSignals(): avoid the call to PyObject_Str(). */
3188
3189static int
Victor Stinner79766632010-08-16 17:36:42 +00003190sys_pyfile_write_unicode(PyObject *unicode, PyObject *file)
Victor Stinner14284c22010-04-23 12:02:30 +00003191{
Victor Stinnerecccc4f2010-06-08 20:46:00 +00003192 if (file == NULL)
3193 return -1;
Jeroen Demeyerb1263d52019-06-28 11:49:00 +02003194 assert(unicode != NULL);
Jeroen Demeyer59ad1102019-07-11 10:59:05 +02003195 PyObject *result = _PyObject_CallMethodIdOneArg(file, &PyId_write, unicode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003196 if (result == NULL) {
Jeroen Demeyerb1263d52019-06-28 11:49:00 +02003197 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003198 }
Jeroen Demeyerb1263d52019-06-28 11:49:00 +02003199 Py_DECREF(result);
3200 return 0;
Victor Stinner14284c22010-04-23 12:02:30 +00003201}
3202
Victor Stinner79766632010-08-16 17:36:42 +00003203static int
3204sys_pyfile_write(const char *text, PyObject *file)
3205{
3206 PyObject *unicode = NULL;
3207 int err;
3208
3209 if (file == NULL)
3210 return -1;
3211
3212 unicode = PyUnicode_FromString(text);
3213 if (unicode == NULL)
3214 return -1;
3215
3216 err = sys_pyfile_write_unicode(unicode, file);
3217 Py_DECREF(unicode);
3218 return err;
3219}
Guido van Rossuma890e681998-05-12 14:59:24 +00003220
3221/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
3222 Adapted from code submitted by Just van Rossum.
3223
3224 PySys_WriteStdout(format, ...)
3225 PySys_WriteStderr(format, ...)
3226
3227 The first function writes to sys.stdout; the second to sys.stderr. When
3228 there is a problem, they write to the real (C level) stdout or stderr;
Guido van Rossum8442af31998-10-12 18:22:10 +00003229 no exceptions are raised.
Guido van Rossuma890e681998-05-12 14:59:24 +00003230
Victor Stinner14284c22010-04-23 12:02:30 +00003231 PyErr_CheckSignals() is not called to avoid the execution of the Python
Victor Stinner79766632010-08-16 17:36:42 +00003232 signal handlers: they may raise a new exception whereas sys_write()
3233 ignores all exceptions.
Victor Stinner14284c22010-04-23 12:02:30 +00003234
Guido van Rossuma890e681998-05-12 14:59:24 +00003235 Both take a printf-style format string as their first argument followed
3236 by a variable length argument list determined by the format string.
3237
3238 *** WARNING ***
3239
3240 The format should limit the total size of the formatted output string to
3241 1000 bytes. In particular, this means that no unrestricted "%s" formats
3242 should occur; these should be limited using "%.<N>s where <N> is a
3243 decimal number calculated so that <N> plus the maximum size of other
3244 formatted text does not exceed 1000 bytes. Also watch out for "%f",
3245 which can print hundreds of digits for very large numbers.
3246
3247 */
3248
3249static void
Victor Stinner09054372013-11-06 22:41:44 +01003250sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va)
Guido van Rossuma890e681998-05-12 14:59:24 +00003251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 PyObject *file;
3253 PyObject *error_type, *error_value, *error_traceback;
3254 char buffer[1001];
3255 int written;
Victor Stinner838f2642019-06-13 22:41:23 +02003256 PyThreadState *tstate = _PyThreadState_GET();
Guido van Rossuma890e681998-05-12 14:59:24 +00003257
Victor Stinner838f2642019-06-13 22:41:23 +02003258 _PyErr_Fetch(tstate, &error_type, &error_value, &error_traceback);
3259 file = sys_get_object_id(tstate, key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
3261 if (sys_pyfile_write(buffer, file) != 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02003262 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 fputs(buffer, fp);
3264 }
3265 if (written < 0 || (size_t)written >= sizeof(buffer)) {
3266 const char *truncated = "... truncated";
Victor Stinner79766632010-08-16 17:36:42 +00003267 if (sys_pyfile_write(truncated, file) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003268 fputs(truncated, fp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 }
Victor Stinner838f2642019-06-13 22:41:23 +02003270 _PyErr_Restore(tstate, error_type, error_value, error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +00003271}
3272
3273void
Guido van Rossuma890e681998-05-12 14:59:24 +00003274PySys_WriteStdout(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00003275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 va_list va;
Guido van Rossuma890e681998-05-12 14:59:24 +00003277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003279 sys_write(&PyId_stdout, stdout, format, va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 va_end(va);
Guido van Rossuma890e681998-05-12 14:59:24 +00003281}
3282
3283void
Guido van Rossuma890e681998-05-12 14:59:24 +00003284PySys_WriteStderr(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00003285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 va_list va;
Guido van Rossuma890e681998-05-12 14:59:24 +00003287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003289 sys_write(&PyId_stderr, stderr, format, va);
Victor Stinner79766632010-08-16 17:36:42 +00003290 va_end(va);
3291}
3292
3293static void
Victor Stinner09054372013-11-06 22:41:44 +01003294sys_format(_Py_Identifier *key, FILE *fp, const char *format, va_list va)
Victor Stinner79766632010-08-16 17:36:42 +00003295{
3296 PyObject *file, *message;
3297 PyObject *error_type, *error_value, *error_traceback;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02003298 const char *utf8;
Victor Stinner838f2642019-06-13 22:41:23 +02003299 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner79766632010-08-16 17:36:42 +00003300
Victor Stinner838f2642019-06-13 22:41:23 +02003301 _PyErr_Fetch(tstate, &error_type, &error_value, &error_traceback);
3302 file = sys_get_object_id(tstate, key);
Victor Stinner79766632010-08-16 17:36:42 +00003303 message = PyUnicode_FromFormatV(format, va);
3304 if (message != NULL) {
3305 if (sys_pyfile_write_unicode(message, file) != 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02003306 _PyErr_Clear(tstate);
Serhiy Storchaka06515832016-11-20 09:13:07 +02003307 utf8 = PyUnicode_AsUTF8(message);
Victor Stinner79766632010-08-16 17:36:42 +00003308 if (utf8 != NULL)
3309 fputs(utf8, fp);
3310 }
3311 Py_DECREF(message);
3312 }
Victor Stinner838f2642019-06-13 22:41:23 +02003313 _PyErr_Restore(tstate, error_type, error_value, error_traceback);
Victor Stinner79766632010-08-16 17:36:42 +00003314}
3315
3316void
3317PySys_FormatStdout(const char *format, ...)
3318{
3319 va_list va;
3320
3321 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003322 sys_format(&PyId_stdout, stdout, format, va);
Victor Stinner79766632010-08-16 17:36:42 +00003323 va_end(va);
3324}
3325
3326void
3327PySys_FormatStderr(const char *format, ...)
3328{
3329 va_list va;
3330
3331 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003332 sys_format(&PyId_stderr, stderr, format, va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 va_end(va);
Guido van Rossuma890e681998-05-12 14:59:24 +00003334}