blob: f086514a03243710f74d27dc37d8159413db041d [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* System module */
3
4/*
5Various bits of information used by the interpreter are collected in
6module 'sys'.
Guido van Rossum3f5da241990-12-20 15:06:42 +00007Function member:
Guido van Rossumcc8914f1995-03-20 15:09:40 +00008- exit(sts): raise SystemExit
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00009Data members:
10- stdin, stdout, stderr: standard file objects
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011- modules: the table of modules (dictionary)
Guido van Rossum3f5da241990-12-20 15:06:42 +000012- path: module search path (list of strings)
13- argv: script arguments (list of strings)
14- ps1, ps2: optional primary and secondary prompts (strings)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000015*/
16
Guido van Rossum65bf9f21997-04-29 18:33:38 +000017#include "Python.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018#include "code.h"
Barry Warsawb6a54d22000-12-06 21:47:46 +000019#include "frameobject.h"
Victor Stinner838f2642019-06-13 22:41:23 +020020#include "pycore_ceval.h"
Victor Stinner331a6a52019-05-27 16:39:22 +020021#include "pycore_initconfig.h"
Victor Stinner838f2642019-06-13 22:41:23 +020022#include "pycore_pathconfig.h"
23#include "pycore_pyerrors.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010024#include "pycore_pylifecycle.h"
25#include "pycore_pymem.h"
Victor Stinner621cebe2018-11-12 16:53:38 +010026#include "pycore_pystate.h"
Steve Dowerb82e17e2019-05-23 08:45:22 -070027#include "pycore_tupleobject.h"
Victor Stinnerd5c355c2011-04-30 14:53:09 +020028#include "pythread.h"
Steve Dowerb82e17e2019-05-23 08:45:22 -070029#include "pydtrace.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030
Guido van Rossume2437a11992-03-23 18:20:18 +000031#include "osdefs.h"
Stefan Krah1845d142016-04-25 21:38:53 +020032#include <locale.h>
Guido van Rossum3f5da241990-12-20 15:06:42 +000033
Mark Hammond8696ebc2002-10-08 02:44:31 +000034#ifdef MS_WINDOWS
35#define WIN32_LEAN_AND_MEAN
Amaury Forgeot d'Arc06cfe952007-11-10 13:55:44 +000036#include <windows.h>
Mark Hammond8696ebc2002-10-08 02:44:31 +000037#endif /* MS_WINDOWS */
38
Guido van Rossum9b38a141996-09-11 23:12:24 +000039#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000040extern void *PyWin_DLLhModule;
Guido van Rossum6c1e5f21997-09-29 23:34:23 +000041/* A string loaded from the DLL at startup: */
42extern const char *PyWin_DLLVersionString;
Guido van Rossumc606fe11996-04-09 02:37:57 +000043#endif
44
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -080045/*[clinic input]
46module sys
47[clinic start generated code]*/
48/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3726b388feee8cea]*/
49
50#include "clinic/sysmodule.c.h"
51
Victor Stinnerbd303c12013-11-07 23:07:29 +010052_Py_IDENTIFIER(_);
53_Py_IDENTIFIER(__sizeof__);
Eric Snowdae02762017-09-14 00:35:58 -070054_Py_IDENTIFIER(_xoptions);
Victor Stinnerbd303c12013-11-07 23:07:29 +010055_Py_IDENTIFIER(buffer);
56_Py_IDENTIFIER(builtins);
57_Py_IDENTIFIER(encoding);
58_Py_IDENTIFIER(path);
59_Py_IDENTIFIER(stdout);
60_Py_IDENTIFIER(stderr);
Eric Snowdae02762017-09-14 00:35:58 -070061_Py_IDENTIFIER(warnoptions);
Victor Stinnerbd303c12013-11-07 23:07:29 +010062_Py_IDENTIFIER(write);
63
Victor Stinner838f2642019-06-13 22:41:23 +020064static PyObject *
65sys_get_object_id(PyThreadState *tstate, _Py_Identifier *key)
Victor Stinnerd67bd452013-11-06 22:36:40 +010066{
Victor Stinner838f2642019-06-13 22:41:23 +020067 PyObject *sd = tstate->interp->sysdict;
Victor Stinnercaba55b2018-08-03 15:33:52 +020068 if (sd == NULL) {
Victor Stinnerd67bd452013-11-06 22:36:40 +010069 return NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +020070 }
Victor Stinnerd67bd452013-11-06 22:36:40 +010071 return _PyDict_GetItemId(sd, key);
72}
73
74PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +020075_PySys_GetObjectId(_Py_Identifier *key)
76{
77 PyThreadState *tstate = _PyThreadState_GET();
78 return sys_get_object_id(tstate, key);
79}
80
81PyObject *
Neal Norwitzf3081322007-08-25 00:32:45 +000082PySys_GetObject(const char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083{
Victor Stinner838f2642019-06-13 22:41:23 +020084 PyThreadState *tstate = _PyThreadState_GET();
85 PyObject *sd = tstate->interp->sysdict;
Victor Stinnercaba55b2018-08-03 15:33:52 +020086 if (sd == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 return NULL;
Victor Stinnercaba55b2018-08-03 15:33:52 +020088 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 return PyDict_GetItemString(sd, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090}
91
Victor Stinner838f2642019-06-13 22:41:23 +020092static int
93sys_set_object_id(PyThreadState *tstate, _Py_Identifier *key, PyObject *v)
Victor Stinnerd67bd452013-11-06 22:36:40 +010094{
Victor Stinner838f2642019-06-13 22:41:23 +020095 PyObject *sd = tstate->interp->sysdict;
Victor Stinnerd67bd452013-11-06 22:36:40 +010096 if (v == NULL) {
Victor Stinnercaba55b2018-08-03 15:33:52 +020097 if (_PyDict_GetItemId(sd, key) == NULL) {
Victor Stinnerd67bd452013-11-06 22:36:40 +010098 return 0;
Victor Stinnercaba55b2018-08-03 15:33:52 +020099 }
100 else {
Victor Stinnerd67bd452013-11-06 22:36:40 +0100101 return _PyDict_DelItemId(sd, key);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200102 }
Victor Stinnerd67bd452013-11-06 22:36:40 +0100103 }
Victor Stinnercaba55b2018-08-03 15:33:52 +0200104 else {
Victor Stinnerd67bd452013-11-06 22:36:40 +0100105 return _PyDict_SetItemId(sd, key, v);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200106 }
Victor Stinnerd67bd452013-11-06 22:36:40 +0100107}
108
109int
Victor Stinner838f2642019-06-13 22:41:23 +0200110_PySys_SetObjectId(_Py_Identifier *key, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111{
Victor Stinner838f2642019-06-13 22:41:23 +0200112 PyThreadState *tstate = _PyThreadState_GET();
113 return sys_set_object_id(tstate, key, v);
114}
115
116static int
117sys_set_object(PyThreadState *tstate, const char *name, PyObject *v)
118{
119 PyObject *sd = tstate->interp->sysdict;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 if (v == NULL) {
Victor Stinnercaba55b2018-08-03 15:33:52 +0200121 if (PyDict_GetItemString(sd, name) == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 return 0;
Victor Stinnercaba55b2018-08-03 15:33:52 +0200123 }
124 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 return PyDict_DelItemString(sd, name);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200126 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 }
Victor Stinnercaba55b2018-08-03 15:33:52 +0200128 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 return PyDict_SetItemString(sd, name, v);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200130 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131}
132
Victor Stinner838f2642019-06-13 22:41:23 +0200133int
134PySys_SetObject(const char *name, PyObject *v)
Steve Dowerb82e17e2019-05-23 08:45:22 -0700135{
Victor Stinner838f2642019-06-13 22:41:23 +0200136 PyThreadState *tstate = _PyThreadState_GET();
137 return sys_set_object(tstate, name, v);
138}
139
140static int
141should_audit(PyThreadState *ts)
142{
Steve Dowerb82e17e2019-05-23 08:45:22 -0700143 if (!ts) {
144 return 0;
145 }
Victor Stinner0fd2c302019-06-04 03:15:09 +0200146 PyInterpreterState *is = ts ? ts->interp : NULL;
147 return _PyRuntime.audit_hook_head
Steve Dowerb82e17e2019-05-23 08:45:22 -0700148 || (is && is->audit_hooks)
149 || PyDTrace_AUDIT_ENABLED();
150}
151
152int
153PySys_Audit(const char *event, const char *argFormat, ...)
154{
155 PyObject *eventName = NULL;
156 PyObject *eventArgs = NULL;
157 PyObject *hooks = NULL;
158 PyObject *hook = NULL;
159 int res = -1;
Victor Stinner838f2642019-06-13 22:41:23 +0200160 PyThreadState *ts = _PyThreadState_GET();
Steve Dowerb82e17e2019-05-23 08:45:22 -0700161
162 /* N format is inappropriate, because you do not know
163 whether the reference is consumed by the call.
164 Assert rather than exception for perf reasons */
165 assert(!argFormat || !strchr(argFormat, 'N'));
166
167 /* Early exit when no hooks are registered */
Victor Stinner838f2642019-06-13 22:41:23 +0200168 if (!should_audit(ts)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700169 return 0;
170 }
171
172 _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700173 int dtrace = PyDTrace_AUDIT_ENABLED();
174
175 PyObject *exc_type, *exc_value, *exc_tb;
176 if (ts) {
Victor Stinner838f2642019-06-13 22:41:23 +0200177 _PyErr_Fetch(ts, &exc_type, &exc_value, &exc_tb);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700178 }
179
180 /* Initialize event args now */
181 if (argFormat && argFormat[0]) {
182 va_list args;
183 va_start(args, argFormat);
Steve Dowerb8cbe742019-12-09 11:05:39 -0800184 eventArgs = _Py_VaBuildValue_SizeT(argFormat, args);
Zackery Spytz08286d52019-06-21 09:31:59 -0600185 va_end(args);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700186 if (eventArgs && !PyTuple_Check(eventArgs)) {
187 PyObject *argTuple = PyTuple_Pack(1, eventArgs);
188 Py_DECREF(eventArgs);
189 eventArgs = argTuple;
190 }
191 } else {
192 eventArgs = PyTuple_New(0);
193 }
194 if (!eventArgs) {
195 goto exit;
196 }
197
198 /* Call global hooks */
199 for (; e; e = e->next) {
200 if (e->hookCFunction(event, eventArgs, e->userData) < 0) {
201 goto exit;
202 }
203 }
204
205 /* Dtrace USDT point */
206 if (dtrace) {
Andy Lestere6be9b52020-02-11 20:28:35 -0600207 PyDTrace_AUDIT(event, (void *)eventArgs);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700208 }
209
210 /* Call interpreter hooks */
Victor Stinner838f2642019-06-13 22:41:23 +0200211 PyInterpreterState *is = ts ? ts->interp : NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700212 if (is && is->audit_hooks) {
213 eventName = PyUnicode_FromString(event);
214 if (!eventName) {
215 goto exit;
216 }
217
218 hooks = PyObject_GetIter(is->audit_hooks);
219 if (!hooks) {
220 goto exit;
221 }
222
223 /* Disallow tracing in hooks unless explicitly enabled */
224 ts->tracing++;
225 ts->use_tracing = 0;
226 while ((hook = PyIter_Next(hooks)) != NULL) {
Serhiy Storchaka41c57b32019-09-01 12:03:39 +0300227 _Py_IDENTIFIER(__cantrace__);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700228 PyObject *o;
Serhiy Storchaka41c57b32019-09-01 12:03:39 +0300229 int canTrace = _PyObject_LookupAttrId(hook, &PyId___cantrace__, &o);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700230 if (o) {
231 canTrace = PyObject_IsTrue(o);
232 Py_DECREF(o);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700233 }
234 if (canTrace < 0) {
235 break;
236 }
237 if (canTrace) {
238 ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc);
239 ts->tracing--;
240 }
241 o = PyObject_CallFunctionObjArgs(hook, eventName,
242 eventArgs, NULL);
243 if (canTrace) {
244 ts->tracing++;
245 ts->use_tracing = 0;
246 }
247 if (!o) {
248 break;
249 }
250 Py_DECREF(o);
251 Py_CLEAR(hook);
252 }
253 ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc);
254 ts->tracing--;
Victor Stinner838f2642019-06-13 22:41:23 +0200255 if (_PyErr_Occurred(ts)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700256 goto exit;
257 }
258 }
259
260 res = 0;
261
262exit:
263 Py_XDECREF(hook);
264 Py_XDECREF(hooks);
265 Py_XDECREF(eventName);
266 Py_XDECREF(eventArgs);
267
268 if (ts) {
269 if (!res) {
Victor Stinner838f2642019-06-13 22:41:23 +0200270 _PyErr_Restore(ts, exc_type, exc_value, exc_tb);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700271 } else {
Victor Stinner838f2642019-06-13 22:41:23 +0200272 assert(_PyErr_Occurred(ts));
Steve Dowerb82e17e2019-05-23 08:45:22 -0700273 Py_XDECREF(exc_type);
274 Py_XDECREF(exc_value);
275 Py_XDECREF(exc_tb);
276 }
277 }
278
279 return res;
280}
281
282/* We expose this function primarily for our own cleanup during
283 * finalization. In general, it should not need to be called,
284 * and as such it is not defined in any header files.
285 */
Victor Stinner838f2642019-06-13 22:41:23 +0200286void
287_PySys_ClearAuditHooks(void)
288{
Steve Dowerb82e17e2019-05-23 08:45:22 -0700289 /* Must be finalizing to clear hooks */
290 _PyRuntimeState *runtime = &_PyRuntime;
291 PyThreadState *ts = _PyRuntimeState_GetThreadState(runtime);
Victor Stinner7b3c2522020-03-07 00:24:23 +0100292 PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(runtime);
293 assert(!ts || finalizing == ts);
294 if (!ts || finalizing != ts) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700295 return;
Victor Stinner838f2642019-06-13 22:41:23 +0200296 }
Steve Dowerb82e17e2019-05-23 08:45:22 -0700297
Victor Stinner838f2642019-06-13 22:41:23 +0200298 const PyConfig *config = &ts->interp->config;
299 if (config->verbose) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700300 PySys_WriteStderr("# clear sys.audit hooks\n");
301 }
302
303 /* Hooks can abort later hooks for this event, but cannot
304 abort the clear operation itself. */
305 PySys_Audit("cpython._PySys_ClearAuditHooks", NULL);
Victor Stinner838f2642019-06-13 22:41:23 +0200306 _PyErr_Clear(ts);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700307
Victor Stinner0fd2c302019-06-04 03:15:09 +0200308 _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head, *n;
309 _PyRuntime.audit_hook_head = NULL;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700310 while (e) {
311 n = e->next;
312 PyMem_RawFree(e);
313 e = n;
314 }
315}
316
317int
318PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)
319{
Victor Stinner838f2642019-06-13 22:41:23 +0200320 _PyRuntimeState *runtime = &_PyRuntime;
321 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
322
Steve Dowerb82e17e2019-05-23 08:45:22 -0700323 /* Invoke existing audit hooks to allow them an opportunity to abort. */
324 /* Cannot invoke hooks until we are initialized */
Victor Stinner838f2642019-06-13 22:41:23 +0200325 if (runtime->initialized) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700326 if (PySys_Audit("sys.addaudithook", NULL) < 0) {
Steve Dowerbea33f52019-11-28 08:46:11 -0800327 if (_PyErr_ExceptionMatches(tstate, PyExc_RuntimeError)) {
328 /* We do not report errors derived from RuntimeError */
Victor Stinner838f2642019-06-13 22:41:23 +0200329 _PyErr_Clear(tstate);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700330 return 0;
331 }
332 return -1;
333 }
334 }
335
Victor Stinner0fd2c302019-06-04 03:15:09 +0200336 _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700337 if (!e) {
338 e = (_Py_AuditHookEntry*)PyMem_RawMalloc(sizeof(_Py_AuditHookEntry));
Victor Stinner0fd2c302019-06-04 03:15:09 +0200339 _PyRuntime.audit_hook_head = e;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700340 } else {
Victor Stinner838f2642019-06-13 22:41:23 +0200341 while (e->next) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700342 e = e->next;
Victor Stinner838f2642019-06-13 22:41:23 +0200343 }
Steve Dowerb82e17e2019-05-23 08:45:22 -0700344 e = e->next = (_Py_AuditHookEntry*)PyMem_RawMalloc(
345 sizeof(_Py_AuditHookEntry));
346 }
347
348 if (!e) {
Victor Stinner838f2642019-06-13 22:41:23 +0200349 if (runtime->initialized) {
350 _PyErr_NoMemory(tstate);
351 }
Steve Dowerb82e17e2019-05-23 08:45:22 -0700352 return -1;
353 }
354
355 e->next = NULL;
356 e->hookCFunction = (Py_AuditHookFunction)hook;
357 e->userData = userData;
358
359 return 0;
360}
361
362/*[clinic input]
363sys.addaudithook
364
365 hook: object
366
367Adds a new audit hook callback.
368[clinic start generated code]*/
369
370static PyObject *
371sys_addaudithook_impl(PyObject *module, PyObject *hook)
372/*[clinic end generated code: output=4f9c17aaeb02f44e input=0f3e191217a45e34]*/
373{
Victor Stinner838f2642019-06-13 22:41:23 +0200374 PyThreadState *tstate = _PyThreadState_GET();
375
Steve Dowerb82e17e2019-05-23 08:45:22 -0700376 /* Invoke existing audit hooks to allow them an opportunity to abort. */
377 if (PySys_Audit("sys.addaudithook", NULL) < 0) {
Victor Stinner838f2642019-06-13 22:41:23 +0200378 if (_PyErr_ExceptionMatches(tstate, PyExc_Exception)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700379 /* We do not report errors derived from Exception */
Victor Stinner838f2642019-06-13 22:41:23 +0200380 _PyErr_Clear(tstate);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700381 Py_RETURN_NONE;
382 }
383 return NULL;
384 }
385
Victor Stinner838f2642019-06-13 22:41:23 +0200386 PyInterpreterState *is = tstate->interp;
Steve Dowerb82e17e2019-05-23 08:45:22 -0700387
388 if (is->audit_hooks == NULL) {
389 is->audit_hooks = PyList_New(0);
390 if (is->audit_hooks == NULL) {
391 return NULL;
392 }
393 }
394
395 if (PyList_Append(is->audit_hooks, hook) < 0) {
396 return NULL;
397 }
398
399 Py_RETURN_NONE;
400}
401
402PyDoc_STRVAR(audit_doc,
403"audit(event, *args)\n\
404\n\
405Passes the event to any audit hooks that are attached.");
406
407static PyObject *
408sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc)
409{
Victor Stinner838f2642019-06-13 22:41:23 +0200410 PyThreadState *tstate = _PyThreadState_GET();
411
Steve Dowerb82e17e2019-05-23 08:45:22 -0700412 if (argc == 0) {
Victor Stinner838f2642019-06-13 22:41:23 +0200413 _PyErr_SetString(tstate, PyExc_TypeError,
414 "audit() missing 1 required positional argument: "
415 "'event'");
Steve Dowerb82e17e2019-05-23 08:45:22 -0700416 return NULL;
417 }
418
Victor Stinner838f2642019-06-13 22:41:23 +0200419 if (!should_audit(tstate)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700420 Py_RETURN_NONE;
421 }
422
423 PyObject *auditEvent = args[0];
424 if (!auditEvent) {
Victor Stinner838f2642019-06-13 22:41:23 +0200425 _PyErr_SetString(tstate, PyExc_TypeError,
426 "expected str for argument 'event'");
Steve Dowerb82e17e2019-05-23 08:45:22 -0700427 return NULL;
428 }
429 if (!PyUnicode_Check(auditEvent)) {
Victor Stinner838f2642019-06-13 22:41:23 +0200430 _PyErr_Format(tstate, PyExc_TypeError,
431 "expected str for argument 'event', not %.200s",
432 Py_TYPE(auditEvent)->tp_name);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700433 return NULL;
434 }
435 const char *event = PyUnicode_AsUTF8(auditEvent);
436 if (!event) {
437 return NULL;
438 }
439
440 PyObject *auditArgs = _PyTuple_FromArray(args + 1, argc - 1);
441 if (!auditArgs) {
442 return NULL;
443 }
444
445 int res = PySys_Audit(event, "O", auditArgs);
446 Py_DECREF(auditArgs);
447
448 if (res < 0) {
449 return NULL;
450 }
451
452 Py_RETURN_NONE;
453}
454
455
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400456static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200457sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400458{
Victor Stinner838f2642019-06-13 22:41:23 +0200459 PyThreadState *tstate = _PyThreadState_GET();
460 assert(!_PyErr_Occurred(tstate));
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300461 char *envar = Py_GETENV("PYTHONBREAKPOINT");
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400462
463 if (envar == NULL || strlen(envar) == 0) {
464 envar = "pdb.set_trace";
465 }
466 else if (!strcmp(envar, "0")) {
467 /* The breakpoint is explicitly no-op'd. */
468 Py_RETURN_NONE;
469 }
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300470 /* According to POSIX the string returned by getenv() might be invalidated
471 * or the string content might be overwritten by a subsequent call to
472 * getenv(). Since importing a module can performs the getenv() calls,
473 * we need to save a copy of envar. */
474 envar = _PyMem_RawStrdup(envar);
475 if (envar == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200476 _PyErr_NoMemory(tstate);
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300477 return NULL;
478 }
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200479 const char *last_dot = strrchr(envar, '.');
480 const char *attrname = NULL;
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400481 PyObject *modulepath = NULL;
482
483 if (last_dot == NULL) {
484 /* The breakpoint is a built-in, e.g. PYTHONBREAKPOINT=int */
485 modulepath = PyUnicode_FromString("builtins");
486 attrname = envar;
487 }
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200488 else if (last_dot != envar) {
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400489 /* Split on the last dot; */
490 modulepath = PyUnicode_FromStringAndSize(envar, last_dot - envar);
491 attrname = last_dot + 1;
492 }
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200493 else {
494 goto warn;
495 }
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400496 if (modulepath == NULL) {
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300497 PyMem_RawFree(envar);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400498 return NULL;
499 }
500
Anthony Sottiledce345c2018-11-01 10:25:05 -0700501 PyObject *module = PyImport_Import(modulepath);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400502 Py_DECREF(modulepath);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400503
504 if (module == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200505 if (_PyErr_ExceptionMatches(tstate, PyExc_ImportError)) {
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200506 goto warn;
507 }
508 PyMem_RawFree(envar);
509 return NULL;
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400510 }
511
512 PyObject *hook = PyObject_GetAttrString(module, attrname);
513 Py_DECREF(module);
514
515 if (hook == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200516 if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200517 goto warn;
518 }
519 PyMem_RawFree(envar);
520 return NULL;
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400521 }
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300522 PyMem_RawFree(envar);
Petr Viktorinffd97532020-02-11 17:46:57 +0100523 PyObject *retval = PyObject_Vectorcall(hook, args, nargs, keywords);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400524 Py_DECREF(hook);
525 return retval;
526
Serhiy Storchaka3607ef42019-01-15 13:26:38 +0200527 warn:
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400528 /* If any of the imports went wrong, then warn and ignore. */
Victor Stinner838f2642019-06-13 22:41:23 +0200529 _PyErr_Clear(tstate);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400530 int status = PyErr_WarnFormat(
531 PyExc_RuntimeWarning, 0,
532 "Ignoring unimportable $PYTHONBREAKPOINT: \"%s\"", envar);
Serhiy Storchakaf60bf0e2018-07-09 21:46:51 +0300533 PyMem_RawFree(envar);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400534 if (status < 0) {
535 /* Printing the warning raised an exception. */
536 return NULL;
537 }
538 /* The warning was (probably) issued. */
539 Py_RETURN_NONE;
540}
541
542PyDoc_STRVAR(breakpointhook_doc,
543"breakpointhook(*args, **kws)\n"
544"\n"
545"This hook function is called by built-in breakpoint().\n"
546);
547
Victor Stinner13d49ee2010-12-04 17:24:33 +0000548/* Write repr(o) to sys.stdout using sys.stdout.encoding and 'backslashreplace'
549 error handler. If sys.stdout has a buffer attribute, use
550 sys.stdout.buffer.write(encoded), otherwise redecode the string and use
551 sys.stdout.write(redecoded).
552
553 Helper function for sys_displayhook(). */
554static int
Andy Lesterda4d6562020-03-05 22:34:36 -0600555sys_displayhook_unencodable(PyObject *outf, PyObject *o)
Victor Stinner13d49ee2010-12-04 17:24:33 +0000556{
557 PyObject *stdout_encoding = NULL;
558 PyObject *encoded, *escaped_str, *repr_str, *buffer, *result;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +0200559 const char *stdout_encoding_str;
Victor Stinner13d49ee2010-12-04 17:24:33 +0000560 int ret;
561
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200562 stdout_encoding = _PyObject_GetAttrId(outf, &PyId_encoding);
Victor Stinner13d49ee2010-12-04 17:24:33 +0000563 if (stdout_encoding == NULL)
564 goto error;
Serhiy Storchaka06515832016-11-20 09:13:07 +0200565 stdout_encoding_str = PyUnicode_AsUTF8(stdout_encoding);
Victor Stinner13d49ee2010-12-04 17:24:33 +0000566 if (stdout_encoding_str == NULL)
567 goto error;
568
569 repr_str = PyObject_Repr(o);
570 if (repr_str == NULL)
571 goto error;
572 encoded = PyUnicode_AsEncodedString(repr_str,
573 stdout_encoding_str,
574 "backslashreplace");
575 Py_DECREF(repr_str);
576 if (encoded == NULL)
577 goto error;
578
Serhiy Storchaka41c57b32019-09-01 12:03:39 +0300579 if (_PyObject_LookupAttrId(outf, &PyId_buffer, &buffer) < 0) {
580 Py_DECREF(encoded);
581 goto error;
582 }
Victor Stinner13d49ee2010-12-04 17:24:33 +0000583 if (buffer) {
Jeroen Demeyer59ad1102019-07-11 10:59:05 +0200584 result = _PyObject_CallMethodIdOneArg(buffer, &PyId_write, encoded);
Victor Stinner13d49ee2010-12-04 17:24:33 +0000585 Py_DECREF(buffer);
586 Py_DECREF(encoded);
587 if (result == NULL)
588 goto error;
589 Py_DECREF(result);
590 }
591 else {
Victor Stinner13d49ee2010-12-04 17:24:33 +0000592 escaped_str = PyUnicode_FromEncodedObject(encoded,
593 stdout_encoding_str,
594 "strict");
595 Py_DECREF(encoded);
596 if (PyFile_WriteObject(escaped_str, outf, Py_PRINT_RAW) != 0) {
597 Py_DECREF(escaped_str);
598 goto error;
599 }
600 Py_DECREF(escaped_str);
601 }
602 ret = 0;
603 goto finally;
604
605error:
606 ret = -1;
607finally:
608 Py_XDECREF(stdout_encoding);
609 return ret;
610}
611
Tal Einatede0b6f2018-12-31 17:12:08 +0200612/*[clinic input]
613sys.displayhook
614
615 object as o: object
616 /
617
618Print an object to sys.stdout and also save it in builtins._
619[clinic start generated code]*/
620
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000621static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200622sys_displayhook(PyObject *module, PyObject *o)
623/*[clinic end generated code: output=347477d006df92ed input=08ba730166d7ef72]*/
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 PyObject *outf;
Victor Stinnerd02fbb82013-11-06 18:27:13 +0100626 PyObject *builtins;
627 static PyObject *newline = NULL;
Victor Stinner838f2642019-06-13 22:41:23 +0200628 PyThreadState *tstate = _PyThreadState_GET();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000629
Eric Snow3f9eee62017-09-15 16:35:20 -0600630 builtins = _PyImport_GetModuleId(&PyId_builtins);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 if (builtins == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +0200632 if (!_PyErr_Occurred(tstate)) {
633 _PyErr_SetString(tstate, PyExc_RuntimeError,
634 "lost builtins module");
Stefan Krah027b09c2019-03-25 21:50:58 +0100635 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 return NULL;
637 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600638 Py_DECREF(builtins);
Moshe Zadka03897ea2001-07-23 13:32:43 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 /* Print value except if None */
641 /* After printing, also assign to '_' */
642 /* Before, set '_' to None to avoid recursion */
643 if (o == Py_None) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200644 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200646 if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +0200648 outf = sys_get_object_id(tstate, &PyId_stdout);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 if (outf == NULL || outf == Py_None) {
Victor Stinner838f2642019-06-13 22:41:23 +0200650 _PyErr_SetString(tstate, PyExc_RuntimeError, "lost sys.stdout");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 return NULL;
652 }
Victor Stinner13d49ee2010-12-04 17:24:33 +0000653 if (PyFile_WriteObject(o, outf, 0) != 0) {
Victor Stinner838f2642019-06-13 22:41:23 +0200654 if (_PyErr_ExceptionMatches(tstate, PyExc_UnicodeEncodeError)) {
Andy Lesterda4d6562020-03-05 22:34:36 -0600655 int err;
Victor Stinner13d49ee2010-12-04 17:24:33 +0000656 /* repr(o) is not encodable to sys.stdout.encoding with
657 * sys.stdout.errors error handler (which is probably 'strict') */
Victor Stinner838f2642019-06-13 22:41:23 +0200658 _PyErr_Clear(tstate);
Andy Lesterda4d6562020-03-05 22:34:36 -0600659 err = sys_displayhook_unencodable(outf, o);
Victor Stinner838f2642019-06-13 22:41:23 +0200660 if (err) {
Victor Stinner13d49ee2010-12-04 17:24:33 +0000661 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +0200662 }
Victor Stinner13d49ee2010-12-04 17:24:33 +0000663 }
664 else {
665 return NULL;
666 }
667 }
Victor Stinnerd02fbb82013-11-06 18:27:13 +0100668 if (newline == NULL) {
669 newline = PyUnicode_FromString("\n");
670 if (newline == NULL)
671 return NULL;
672 }
673 if (PyFile_WriteObject(newline, outf, Py_PRINT_RAW) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 return NULL;
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200675 if (_PyObject_SetAttrId(builtins, &PyId__, o) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 return NULL;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200677 Py_RETURN_NONE;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000678}
679
Tal Einatede0b6f2018-12-31 17:12:08 +0200680
681/*[clinic input]
682sys.excepthook
683
684 exctype: object
685 value: object
686 traceback: object
687 /
688
689Handle an exception by displaying it with a traceback on sys.stderr.
690[clinic start generated code]*/
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000691
692static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200693sys_excepthook_impl(PyObject *module, PyObject *exctype, PyObject *value,
694 PyObject *traceback)
695/*[clinic end generated code: output=18d99fdda21b6b5e input=ecf606fa826f19d9]*/
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000696{
Tal Einatede0b6f2018-12-31 17:12:08 +0200697 PyErr_Display(exctype, value, traceback);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200698 Py_RETURN_NONE;
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000699}
700
Tal Einatede0b6f2018-12-31 17:12:08 +0200701
702/*[clinic input]
703sys.exc_info
704
705Return current exception information: (type, value, traceback).
706
707Return information about the most recent exception caught by an except
708clause in the current stack frame or in an older stack frame.
709[clinic start generated code]*/
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +0000710
711static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200712sys_exc_info_impl(PyObject *module)
713/*[clinic end generated code: output=3afd0940cf3a4d30 input=b5c5bf077788a3e5]*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000714{
Victor Stinner50b48572018-11-01 01:51:40 +0100715 _PyErr_StackItem *err_info = _PyErr_GetTopmostException(_PyThreadState_GET());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 return Py_BuildValue(
717 "(OOO)",
Mark Shannonae3087c2017-10-22 22:41:51 +0100718 err_info->exc_type != NULL ? err_info->exc_type : Py_None,
719 err_info->exc_value != NULL ? err_info->exc_value : Py_None,
720 err_info->exc_traceback != NULL ?
721 err_info->exc_traceback : Py_None);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000722}
723
Tal Einatede0b6f2018-12-31 17:12:08 +0200724
725/*[clinic input]
Victor Stinneref9d9b62019-05-22 11:28:22 +0200726sys.unraisablehook
727
728 unraisable: object
729 /
730
731Handle an unraisable exception.
732
733The unraisable argument has the following attributes:
734
735* exc_type: Exception type.
Victor Stinner71c52e32019-05-27 08:57:14 +0200736* exc_value: Exception value, can be None.
737* exc_traceback: Exception traceback, can be None.
738* err_msg: Error message, can be None.
739* object: Object causing the exception, can be None.
Victor Stinneref9d9b62019-05-22 11:28:22 +0200740[clinic start generated code]*/
741
742static PyObject *
743sys_unraisablehook(PyObject *module, PyObject *unraisable)
Victor Stinner71c52e32019-05-27 08:57:14 +0200744/*[clinic end generated code: output=bb92838b32abaa14 input=ec3af148294af8d3]*/
Victor Stinneref9d9b62019-05-22 11:28:22 +0200745{
746 return _PyErr_WriteUnraisableDefaultHook(unraisable);
747}
748
749
750/*[clinic input]
Tal Einatede0b6f2018-12-31 17:12:08 +0200751sys.exit
752
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300753 status: object = None
Tal Einatede0b6f2018-12-31 17:12:08 +0200754 /
755
756Exit the interpreter by raising SystemExit(status).
757
758If the status is omitted or None, it defaults to zero (i.e., success).
759If the status is an integer, it will be used as the system exit status.
760If it is another kind of object, it will be printed and the system
761exit status will be one (i.e., failure).
762[clinic start generated code]*/
Guido van Rossum46d3dc32003-03-01 03:20:41 +0000763
764static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200765sys_exit_impl(PyObject *module, PyObject *status)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300766/*[clinic end generated code: output=13870986c1ab2ec0 input=b86ca9497baa94f2]*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 /* Raise SystemExit so callers may catch it or clean up. */
Victor Stinner838f2642019-06-13 22:41:23 +0200769 PyThreadState *tstate = _PyThreadState_GET();
770 _PyErr_SetObject(tstate, PyExc_SystemExit, status);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000772}
773
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000774
Martin v. Löwis107b7da2001-11-09 20:59:39 +0000775
Tal Einatede0b6f2018-12-31 17:12:08 +0200776/*[clinic input]
777sys.getdefaultencoding
778
779Return the current default encoding used by the Unicode implementation.
780[clinic start generated code]*/
781
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000782static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200783sys_getdefaultencoding_impl(PyObject *module)
784/*[clinic end generated code: output=256d19dfcc0711e6 input=d416856ddbef6909]*/
Fred Drake8b4d01d2000-05-09 19:57:01 +0000785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 return PyUnicode_FromString(PyUnicode_GetDefaultEncoding());
Fred Drake8b4d01d2000-05-09 19:57:01 +0000787}
788
Tal Einatede0b6f2018-12-31 17:12:08 +0200789/*[clinic input]
790sys.getfilesystemencoding
791
792Return the encoding used to convert Unicode filenames to OS filenames.
793[clinic start generated code]*/
Fred Drake8b4d01d2000-05-09 19:57:01 +0000794
795static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200796sys_getfilesystemencoding_impl(PyObject *module)
797/*[clinic end generated code: output=1dc4bdbe9be44aa7 input=8475f8649b8c7d8c]*/
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000798{
Victor Stinner838f2642019-06-13 22:41:23 +0200799 PyThreadState *tstate = _PyThreadState_GET();
800 const PyConfig *config = &tstate->interp->config;
Victor Stinner709d23d2019-05-02 14:56:30 -0400801 return PyUnicode_FromWideChar(config->filesystem_encoding, -1);
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000802}
803
Tal Einatede0b6f2018-12-31 17:12:08 +0200804/*[clinic input]
805sys.getfilesystemencodeerrors
806
807Return the error mode used Unicode to OS filename conversion.
808[clinic start generated code]*/
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000809
Martin v. Löwis04dc25c2008-10-03 16:09:28 +0000810static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200811sys_getfilesystemencodeerrors_impl(PyObject *module)
812/*[clinic end generated code: output=ba77b36bbf7c96f5 input=22a1e8365566f1e5]*/
Steve Dowercc16be82016-09-08 10:35:16 -0700813{
Victor Stinner838f2642019-06-13 22:41:23 +0200814 PyThreadState *tstate = _PyThreadState_GET();
815 const PyConfig *config = &tstate->interp->config;
Victor Stinner709d23d2019-05-02 14:56:30 -0400816 return PyUnicode_FromWideChar(config->filesystem_errors, -1);
Steve Dowercc16be82016-09-08 10:35:16 -0700817}
818
Tal Einatede0b6f2018-12-31 17:12:08 +0200819/*[clinic input]
820sys.intern
821
822 string as s: unicode
823 /
824
825``Intern'' the given string.
826
827This enters the string in the (global) table of interned strings whose
828purpose is to speed up dictionary lookups. Return the string itself or
829the previously interned string object with the same value.
830[clinic start generated code]*/
Steve Dowercc16be82016-09-08 10:35:16 -0700831
832static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200833sys_intern_impl(PyObject *module, PyObject *s)
834/*[clinic end generated code: output=be680c24f5c9e5d6 input=849483c006924e2f]*/
Georg Brandl66a796e2006-12-19 20:50:34 +0000835{
Victor Stinner838f2642019-06-13 22:41:23 +0200836 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 if (PyUnicode_CheckExact(s)) {
838 Py_INCREF(s);
839 PyUnicode_InternInPlace(&s);
840 return s;
841 }
842 else {
Victor Stinner838f2642019-06-13 22:41:23 +0200843 _PyErr_Format(tstate, PyExc_TypeError,
Victor Stinnera102ed72020-02-07 02:24:48 +0100844 "can't intern %.400s", Py_TYPE(s)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 return NULL;
846 }
Georg Brandl66a796e2006-12-19 20:50:34 +0000847}
848
Georg Brandl66a796e2006-12-19 20:50:34 +0000849
Fred Drake5755ce62001-06-27 19:19:46 +0000850/*
851 * Cached interned string objects used for calling the profile and
852 * trace functions. Initialized by trace_init().
853 */
Nick Coghlan5a851672017-09-08 10:14:16 +1000854static PyObject *whatstrings[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
Fred Drake5755ce62001-06-27 19:19:46 +0000855
856static int
857trace_init(void)
858{
Nick Coghlan5a851672017-09-08 10:14:16 +1000859 static const char * const whatnames[8] = {
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200860 "call", "exception", "line", "return",
Nick Coghlan5a851672017-09-08 10:14:16 +1000861 "c_call", "c_exception", "c_return",
862 "opcode"
Serhiy Storchaka2d06e842015-12-25 19:53:18 +0200863 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 PyObject *name;
865 int i;
Nick Coghlan5a851672017-09-08 10:14:16 +1000866 for (i = 0; i < 8; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 if (whatstrings[i] == NULL) {
868 name = PyUnicode_InternFromString(whatnames[i]);
869 if (name == NULL)
870 return -1;
871 whatstrings[i] = name;
872 }
873 }
874 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +0000875}
876
877
878static PyObject *
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +0100879call_trampoline(PyObject* callback,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 PyFrameObject *frame, int what, PyObject *arg)
Fred Drake5755ce62001-06-27 19:19:46 +0000881{
Victor Stinner78da82b2016-08-20 01:22:57 +0200882 if (PyFrame_FastToLocalsWithError(frame) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 return NULL;
Victor Stinner78da82b2016-08-20 01:22:57 +0200884 }
Victor Stinner41bb43a2013-10-29 01:19:37 +0100885
Victor Stinner838f2642019-06-13 22:41:23 +0200886 PyObject *stack[3];
Victor Stinner78da82b2016-08-20 01:22:57 +0200887 stack[0] = (PyObject *)frame;
888 stack[1] = whatstrings[what];
889 stack[2] = (arg != NULL) ? arg : Py_None;
Fred Drake5755ce62001-06-27 19:19:46 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 /* call the Python-level function */
Victor Stinner838f2642019-06-13 22:41:23 +0200892 PyObject *result = _PyObject_FastCall(callback, stack, 3);
Fred Drake5755ce62001-06-27 19:19:46 +0000893
Victor Stinner78da82b2016-08-20 01:22:57 +0200894 PyFrame_LocalsToFast(frame, 1);
895 if (result == NULL) {
896 PyTraceBack_Here(frame);
897 }
898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 return result;
Fred Drake5755ce62001-06-27 19:19:46 +0000900}
901
902static int
903profile_trampoline(PyObject *self, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 int what, PyObject *arg)
Fred Drake5755ce62001-06-27 19:19:46 +0000905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 PyObject *result;
Fred Drake5755ce62001-06-27 19:19:46 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 if (arg == NULL)
909 arg = Py_None;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +0100910 result = call_trampoline(self, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 if (result == NULL) {
912 PyEval_SetProfile(NULL, NULL);
913 return -1;
914 }
915 Py_DECREF(result);
916 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +0000917}
918
919static int
920trace_trampoline(PyObject *self, PyFrameObject *frame,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 int what, PyObject *arg)
Fred Drake5755ce62001-06-27 19:19:46 +0000922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 PyObject *callback;
924 PyObject *result;
Fred Drake5755ce62001-06-27 19:19:46 +0000925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 if (what == PyTrace_CALL)
927 callback = self;
928 else
929 callback = frame->f_trace;
930 if (callback == NULL)
931 return 0;
Victor Stinnerfdeb6ec2013-12-13 02:01:38 +0100932 result = call_trampoline(callback, frame, what, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 if (result == NULL) {
934 PyEval_SetTrace(NULL, NULL);
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200935 Py_CLEAR(frame->f_trace);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 return -1;
937 }
938 if (result != Py_None) {
Serhiy Storchakaec397562016-04-06 09:50:03 +0300939 Py_XSETREF(frame->f_trace, result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 }
941 else {
942 Py_DECREF(result);
943 }
944 return 0;
Fred Drake5755ce62001-06-27 19:19:46 +0000945}
Fred Draked0838392001-06-16 21:02:31 +0000946
Fred Drake8b4d01d2000-05-09 19:57:01 +0000947static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000948sys_settrace(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 if (trace_init() == -1)
951 return NULL;
952 if (args == Py_None)
953 PyEval_SetTrace(NULL, NULL);
954 else
955 PyEval_SetTrace(trace_trampoline, args);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200956 Py_RETURN_NONE;
Guido van Rossume2437a11992-03-23 18:20:18 +0000957}
958
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000959PyDoc_STRVAR(settrace_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000960"settrace(function)\n\
961\n\
962Set the global debug tracing function. It will be called on each\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000963function call. See the debugger chapter in the library manual."
964);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +0000965
Tal Einatede0b6f2018-12-31 17:12:08 +0200966/*[clinic input]
967sys.gettrace
968
969Return the global debug tracing function set with sys.settrace.
970
971See the debugger chapter in the library manual.
972[clinic start generated code]*/
973
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000974static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +0200975sys_gettrace_impl(PyObject *module)
976/*[clinic end generated code: output=e97e3a4d8c971b6e input=373b51bb2147f4d8]*/
Christian Heimes9bd667a2008-01-20 15:14:11 +0000977{
Victor Stinner50b48572018-11-01 01:51:40 +0100978 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 PyObject *temp = tstate->c_traceobj;
Christian Heimes9bd667a2008-01-20 15:14:11 +0000980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 if (temp == NULL)
982 temp = Py_None;
983 Py_INCREF(temp);
984 return temp;
Christian Heimes9bd667a2008-01-20 15:14:11 +0000985}
986
Christian Heimes9bd667a2008-01-20 15:14:11 +0000987static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000988sys_setprofile(PyObject *self, PyObject *args)
Guido van Rossume2437a11992-03-23 18:20:18 +0000989{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 if (trace_init() == -1)
991 return NULL;
992 if (args == Py_None)
993 PyEval_SetProfile(NULL, NULL);
994 else
995 PyEval_SetProfile(profile_trampoline, args);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200996 Py_RETURN_NONE;
Guido van Rossume2437a11992-03-23 18:20:18 +0000997}
998
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +0000999PyDoc_STRVAR(setprofile_doc,
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001000"setprofile(function)\n\
1001\n\
1002Set the profiling function. It will be called on each function call\n\
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00001003and return. See the profiler chapter in the library manual."
1004);
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001005
Tal Einatede0b6f2018-12-31 17:12:08 +02001006/*[clinic input]
1007sys.getprofile
1008
1009Return the profiling function set with sys.setprofile.
1010
1011See the profiler chapter in the library manual.
1012[clinic start generated code]*/
1013
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001014static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001015sys_getprofile_impl(PyObject *module)
1016/*[clinic end generated code: output=579b96b373448188 input=1b3209d89a32965d]*/
Christian Heimes9bd667a2008-01-20 15:14:11 +00001017{
Victor Stinner50b48572018-11-01 01:51:40 +01001018 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 PyObject *temp = tstate->c_profileobj;
Christian Heimes9bd667a2008-01-20 15:14:11 +00001020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 if (temp == NULL)
1022 temp = Py_None;
1023 Py_INCREF(temp);
1024 return temp;
Christian Heimes9bd667a2008-01-20 15:14:11 +00001025}
1026
Tim Peterse5e065b2003-07-06 18:36:54 +00001027
Tal Einatede0b6f2018-12-31 17:12:08 +02001028/*[clinic input]
1029sys.setswitchinterval
1030
1031 interval: double
1032 /
1033
1034Set the ideal thread switching delay inside the Python interpreter.
1035
1036The actual frequency of switching threads can be lower if the
1037interpreter executes long sequences of uninterruptible code
1038(this is implementation-specific and workload-dependent).
1039
1040The parameter must represent the desired switching delay in seconds
1041A typical value is 0.005 (5 milliseconds).
1042[clinic start generated code]*/
Tim Peterse5e065b2003-07-06 18:36:54 +00001043
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001044static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001045sys_setswitchinterval_impl(PyObject *module, double interval)
1046/*[clinic end generated code: output=65a19629e5153983 input=561b477134df91d9]*/
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001047{
Victor Stinner838f2642019-06-13 22:41:23 +02001048 PyThreadState *tstate = _PyThreadState_GET();
Tal Einatede0b6f2018-12-31 17:12:08 +02001049 if (interval <= 0.0) {
Victor Stinner838f2642019-06-13 22:41:23 +02001050 _PyErr_SetString(tstate, PyExc_ValueError,
1051 "switch interval must be strictly positive");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 return NULL;
1053 }
Tal Einatede0b6f2018-12-31 17:12:08 +02001054 _PyEval_SetSwitchInterval((unsigned long) (1e6 * interval));
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001055 Py_RETURN_NONE;
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001056}
1057
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001058
Tal Einatede0b6f2018-12-31 17:12:08 +02001059/*[clinic input]
1060sys.getswitchinterval -> double
1061
1062Return the current thread switch interval; see sys.setswitchinterval().
1063[clinic start generated code]*/
1064
1065static double
1066sys_getswitchinterval_impl(PyObject *module)
1067/*[clinic end generated code: output=a38c277c85b5096d input=bdf9d39c0ebbbb6f]*/
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001068{
Tal Einatede0b6f2018-12-31 17:12:08 +02001069 return 1e-6 * _PyEval_GetSwitchInterval();
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001070}
1071
Tal Einatede0b6f2018-12-31 17:12:08 +02001072/*[clinic input]
1073sys.setrecursionlimit
1074
1075 limit as new_limit: int
1076 /
1077
1078Set the maximum depth of the Python interpreter stack to n.
1079
1080This limit prevents infinite recursion from causing an overflow of the C
1081stack and crashing Python. The highest possible limit is platform-
1082dependent.
1083[clinic start generated code]*/
Antoine Pitrou074e5ed2009-11-10 19:50:40 +00001084
Tim Peterse5e065b2003-07-06 18:36:54 +00001085static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001086sys_setrecursionlimit_impl(PyObject *module, int new_limit)
1087/*[clinic end generated code: output=35e1c64754800ace input=b0f7a23393924af3]*/
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001088{
Tal Einatede0b6f2018-12-31 17:12:08 +02001089 int mark;
Victor Stinner838f2642019-06-13 22:41:23 +02001090 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner50856d52015-10-13 00:11:21 +02001091
Victor Stinner50856d52015-10-13 00:11:21 +02001092 if (new_limit < 1) {
Victor Stinner838f2642019-06-13 22:41:23 +02001093 _PyErr_SetString(tstate, PyExc_ValueError,
1094 "recursion limit must be greater or equal than 1");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 return NULL;
1096 }
Victor Stinner50856d52015-10-13 00:11:21 +02001097
1098 /* Issue #25274: When the recursion depth hits the recursion limit in
1099 _Py_CheckRecursiveCall(), the overflowed flag of the thread state is
1100 set to 1 and a RecursionError is raised. The overflowed flag is reset
1101 to 0 when the recursion depth goes below the low-water mark: see
1102 Py_LeaveRecursiveCall().
1103
1104 Reject too low new limit if the current recursion depth is higher than
1105 the new low-water mark. Otherwise it may not be possible anymore to
1106 reset the overflowed flag to 0. */
1107 mark = _Py_RecursionLimitLowerWaterMark(new_limit);
Victor Stinner50856d52015-10-13 00:11:21 +02001108 if (tstate->recursion_depth >= mark) {
Victor Stinner838f2642019-06-13 22:41:23 +02001109 _PyErr_Format(tstate, PyExc_RecursionError,
1110 "cannot set the recursion limit to %i at "
1111 "the recursion depth %i: the limit is too low",
1112 new_limit, tstate->recursion_depth);
Victor Stinner50856d52015-10-13 00:11:21 +02001113 return NULL;
1114 }
1115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 Py_SetRecursionLimit(new_limit);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001117 Py_RETURN_NONE;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001118}
1119
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001120/*[clinic input]
1121sys.set_coroutine_origin_tracking_depth
1122
1123 depth: int
1124
1125Enable or disable origin tracking for coroutine objects in this thread.
1126
Tal Einatede0b6f2018-12-31 17:12:08 +02001127Coroutine objects will track 'depth' frames of traceback information
1128about where they came from, available in their cr_origin attribute.
1129
1130Set a depth of 0 to disable.
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001131[clinic start generated code]*/
1132
1133static PyObject *
1134sys_set_coroutine_origin_tracking_depth_impl(PyObject *module, int depth)
Tal Einatede0b6f2018-12-31 17:12:08 +02001135/*[clinic end generated code: output=0a2123c1cc6759c5 input=a1d0a05f89d2c426]*/
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001136{
Victor Stinner838f2642019-06-13 22:41:23 +02001137 PyThreadState *tstate = _PyThreadState_GET();
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001138 if (depth < 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02001139 _PyErr_SetString(tstate, PyExc_ValueError, "depth must be >= 0");
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001140 return NULL;
1141 }
Victor Stinner838f2642019-06-13 22:41:23 +02001142 _PyEval_SetCoroutineOriginTrackingDepth(tstate, depth);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001143 Py_RETURN_NONE;
1144}
1145
1146/*[clinic input]
1147sys.get_coroutine_origin_tracking_depth -> int
1148
1149Check status of origin tracking for coroutine objects in this thread.
1150[clinic start generated code]*/
1151
1152static int
1153sys_get_coroutine_origin_tracking_depth_impl(PyObject *module)
1154/*[clinic end generated code: output=3699f7be95a3afb8 input=335266a71205b61a]*/
1155{
1156 return _PyEval_GetCoroutineOriginTrackingDepth();
1157}
1158
Yury Selivanoveb636452016-09-08 22:01:51 -07001159static PyTypeObject AsyncGenHooksType;
1160
1161PyDoc_STRVAR(asyncgen_hooks_doc,
1162"asyncgen_hooks\n\
1163\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07001164A named tuple providing information about asynchronous\n\
Yury Selivanoveb636452016-09-08 22:01:51 -07001165generators hooks. The attributes are read only.");
1166
1167static PyStructSequence_Field asyncgen_hooks_fields[] = {
1168 {"firstiter", "Hook to intercept first iteration"},
1169 {"finalizer", "Hook to intercept finalization"},
1170 {0}
1171};
1172
1173static PyStructSequence_Desc asyncgen_hooks_desc = {
1174 "asyncgen_hooks", /* name */
1175 asyncgen_hooks_doc, /* doc */
1176 asyncgen_hooks_fields , /* fields */
1177 2
1178};
1179
Yury Selivanoveb636452016-09-08 22:01:51 -07001180static PyObject *
1181sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw)
1182{
1183 static char *keywords[] = {"firstiter", "finalizer", NULL};
1184 PyObject *firstiter = NULL;
1185 PyObject *finalizer = NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02001186 PyThreadState *tstate = _PyThreadState_GET();
Yury Selivanoveb636452016-09-08 22:01:51 -07001187
1188 if (!PyArg_ParseTupleAndKeywords(
1189 args, kw, "|OO", keywords,
1190 &firstiter, &finalizer)) {
1191 return NULL;
1192 }
1193
1194 if (finalizer && finalizer != Py_None) {
1195 if (!PyCallable_Check(finalizer)) {
Victor Stinner838f2642019-06-13 22:41:23 +02001196 _PyErr_Format(tstate, PyExc_TypeError,
1197 "callable finalizer expected, got %.50s",
1198 Py_TYPE(finalizer)->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07001199 return NULL;
1200 }
1201 _PyEval_SetAsyncGenFinalizer(finalizer);
1202 }
1203 else if (finalizer == Py_None) {
1204 _PyEval_SetAsyncGenFinalizer(NULL);
1205 }
1206
1207 if (firstiter && firstiter != Py_None) {
1208 if (!PyCallable_Check(firstiter)) {
Victor Stinner838f2642019-06-13 22:41:23 +02001209 _PyErr_Format(tstate, PyExc_TypeError,
1210 "callable firstiter expected, got %.50s",
1211 Py_TYPE(firstiter)->tp_name);
Yury Selivanoveb636452016-09-08 22:01:51 -07001212 return NULL;
1213 }
1214 _PyEval_SetAsyncGenFirstiter(firstiter);
1215 }
1216 else if (firstiter == Py_None) {
1217 _PyEval_SetAsyncGenFirstiter(NULL);
1218 }
1219
1220 Py_RETURN_NONE;
1221}
1222
1223PyDoc_STRVAR(set_asyncgen_hooks_doc,
Tal Einatede0b6f2018-12-31 17:12:08 +02001224"set_asyncgen_hooks(* [, firstiter] [, finalizer])\n\
Yury Selivanoveb636452016-09-08 22:01:51 -07001225\n\
1226Set a finalizer for async generators objects."
1227);
1228
Tal Einatede0b6f2018-12-31 17:12:08 +02001229/*[clinic input]
1230sys.get_asyncgen_hooks
1231
1232Return the installed asynchronous generators hooks.
1233
1234This returns a namedtuple of the form (firstiter, finalizer).
1235[clinic start generated code]*/
1236
Yury Selivanoveb636452016-09-08 22:01:51 -07001237static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001238sys_get_asyncgen_hooks_impl(PyObject *module)
1239/*[clinic end generated code: output=53a253707146f6cf input=3676b9ea62b14625]*/
Yury Selivanoveb636452016-09-08 22:01:51 -07001240{
1241 PyObject *res;
1242 PyObject *firstiter = _PyEval_GetAsyncGenFirstiter();
1243 PyObject *finalizer = _PyEval_GetAsyncGenFinalizer();
1244
1245 res = PyStructSequence_New(&AsyncGenHooksType);
1246 if (res == NULL) {
1247 return NULL;
1248 }
1249
1250 if (firstiter == NULL) {
1251 firstiter = Py_None;
1252 }
1253
1254 if (finalizer == NULL) {
1255 finalizer = Py_None;
1256 }
1257
1258 Py_INCREF(firstiter);
1259 PyStructSequence_SET_ITEM(res, 0, firstiter);
1260
1261 Py_INCREF(finalizer);
1262 PyStructSequence_SET_ITEM(res, 1, finalizer);
1263
1264 return res;
1265}
1266
Yury Selivanoveb636452016-09-08 22:01:51 -07001267
Mark Dickinsondc787d22010-05-23 13:33:13 +00001268static PyTypeObject Hash_InfoType;
1269
1270PyDoc_STRVAR(hash_info_doc,
1271"hash_info\n\
1272\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07001273A named tuple providing parameters used for computing\n\
Christian Heimes985ecdc2013-11-20 11:46:18 +01001274hashes. The attributes are read only.");
Mark Dickinsondc787d22010-05-23 13:33:13 +00001275
1276static PyStructSequence_Field hash_info_fields[] = {
1277 {"width", "width of the type used for hashing, in bits"},
1278 {"modulus", "prime number giving the modulus on which the hash "
1279 "function is based"},
1280 {"inf", "value to be used for hash of a positive infinity"},
1281 {"nan", "value to be used for hash of a nan"},
1282 {"imag", "multiplier used for the imaginary part of a complex number"},
Christian Heimes985ecdc2013-11-20 11:46:18 +01001283 {"algorithm", "name of the algorithm for hashing of str, bytes and "
1284 "memoryviews"},
1285 {"hash_bits", "internal output size of hash algorithm"},
1286 {"seed_bits", "seed size of hash algorithm"},
1287 {"cutoff", "small string optimization cutoff"},
Mark Dickinsondc787d22010-05-23 13:33:13 +00001288 {NULL, NULL}
1289};
1290
1291static PyStructSequence_Desc hash_info_desc = {
1292 "sys.hash_info",
1293 hash_info_doc,
1294 hash_info_fields,
Christian Heimes985ecdc2013-11-20 11:46:18 +01001295 9,
Mark Dickinsondc787d22010-05-23 13:33:13 +00001296};
1297
Matthias Klosed885e952010-07-06 10:53:30 +00001298static PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +02001299get_hash_info(PyThreadState *tstate)
Mark Dickinsondc787d22010-05-23 13:33:13 +00001300{
1301 PyObject *hash_info;
1302 int field = 0;
Christian Heimes985ecdc2013-11-20 11:46:18 +01001303 PyHash_FuncDef *hashfunc;
Mark Dickinsondc787d22010-05-23 13:33:13 +00001304 hash_info = PyStructSequence_New(&Hash_InfoType);
1305 if (hash_info == NULL)
1306 return NULL;
Christian Heimes985ecdc2013-11-20 11:46:18 +01001307 hashfunc = PyHash_GetFuncDef();
Mark Dickinsondc787d22010-05-23 13:33:13 +00001308 PyStructSequence_SET_ITEM(hash_info, field++,
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001309 PyLong_FromLong(8*sizeof(Py_hash_t)));
Mark Dickinsondc787d22010-05-23 13:33:13 +00001310 PyStructSequence_SET_ITEM(hash_info, field++,
Benjamin Peterson8035bc52010-10-23 16:20:50 +00001311 PyLong_FromSsize_t(_PyHASH_MODULUS));
Mark Dickinsondc787d22010-05-23 13:33:13 +00001312 PyStructSequence_SET_ITEM(hash_info, field++,
1313 PyLong_FromLong(_PyHASH_INF));
1314 PyStructSequence_SET_ITEM(hash_info, field++,
1315 PyLong_FromLong(_PyHASH_NAN));
1316 PyStructSequence_SET_ITEM(hash_info, field++,
1317 PyLong_FromLong(_PyHASH_IMAG));
Christian Heimes985ecdc2013-11-20 11:46:18 +01001318 PyStructSequence_SET_ITEM(hash_info, field++,
1319 PyUnicode_FromString(hashfunc->name));
1320 PyStructSequence_SET_ITEM(hash_info, field++,
1321 PyLong_FromLong(hashfunc->hash_bits));
1322 PyStructSequence_SET_ITEM(hash_info, field++,
1323 PyLong_FromLong(hashfunc->seed_bits));
1324 PyStructSequence_SET_ITEM(hash_info, field++,
1325 PyLong_FromLong(Py_HASH_CUTOFF));
Victor Stinner838f2642019-06-13 22:41:23 +02001326 if (_PyErr_Occurred(tstate)) {
Mark Dickinsondc787d22010-05-23 13:33:13 +00001327 Py_CLEAR(hash_info);
1328 return NULL;
1329 }
1330 return hash_info;
1331}
Tal Einatede0b6f2018-12-31 17:12:08 +02001332/*[clinic input]
1333sys.getrecursionlimit
Mark Dickinsondc787d22010-05-23 13:33:13 +00001334
Tal Einatede0b6f2018-12-31 17:12:08 +02001335Return the current value of the recursion limit.
Mark Dickinsondc787d22010-05-23 13:33:13 +00001336
Tal Einatede0b6f2018-12-31 17:12:08 +02001337The recursion limit is the maximum depth of the Python interpreter
1338stack. This limit prevents infinite recursion from causing an overflow
1339of the C stack and crashing Python.
1340[clinic start generated code]*/
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001341
1342static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001343sys_getrecursionlimit_impl(PyObject *module)
1344/*[clinic end generated code: output=d571fb6b4549ef2e input=1c6129fd2efaeea8]*/
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 return PyLong_FromLong(Py_GetRecursionLimit());
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00001347}
1348
Mark Hammond8696ebc2002-10-08 02:44:31 +00001349#ifdef MS_WINDOWS
Mark Hammond8696ebc2002-10-08 02:44:31 +00001350
Eric Smithf7bb5782010-01-27 00:44:57 +00001351static PyTypeObject WindowsVersionType = {0, 0, 0, 0, 0, 0};
1352
1353static PyStructSequence_Field windows_version_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 {"major", "Major version number"},
1355 {"minor", "Minor version number"},
1356 {"build", "Build number"},
1357 {"platform", "Operating system platform"},
1358 {"service_pack", "Latest Service Pack installed on the system"},
1359 {"service_pack_major", "Service Pack major version number"},
1360 {"service_pack_minor", "Service Pack minor version number"},
1361 {"suite_mask", "Bit mask identifying available product suites"},
1362 {"product_type", "System product type"},
Steve Dower74f4af72016-09-17 17:27:48 -07001363 {"platform_version", "Diagnostic version number"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 {0}
Eric Smithf7bb5782010-01-27 00:44:57 +00001365};
1366
1367static PyStructSequence_Desc windows_version_desc = {
Tal Einatede0b6f2018-12-31 17:12:08 +02001368 "sys.getwindowsversion", /* name */
1369 sys_getwindowsversion__doc__, /* doc */
1370 windows_version_fields, /* fields */
1371 5 /* For backward compatibility,
1372 only the first 5 items are accessible
1373 via indexing, the rest are name only */
Eric Smithf7bb5782010-01-27 00:44:57 +00001374};
1375
Steve Dower3e96f322015-03-02 08:01:10 -08001376/* Disable deprecation warnings about GetVersionEx as the result is
1377 being passed straight through to the caller, who is responsible for
1378 using it correctly. */
1379#pragma warning(push)
1380#pragma warning(disable:4996)
1381
Tal Einatede0b6f2018-12-31 17:12:08 +02001382/*[clinic input]
1383sys.getwindowsversion
1384
1385Return info about the running version of Windows as a named tuple.
1386
1387The members are named: major, minor, build, platform, service_pack,
1388service_pack_major, service_pack_minor, suite_mask, product_type and
1389platform_version. For backward compatibility, only the first 5 items
1390are available by indexing. All elements are numbers, except
1391service_pack and platform_type which are strings, and platform_version
1392which is a 3-tuple. Platform is always 2. Product_type may be 1 for a
1393workstation, 2 for a domain controller, 3 for a server.
1394Platform_version is a 3-tuple containing a version number that is
1395intended for identifying the OS rather than feature detection.
1396[clinic start generated code]*/
1397
Mark Hammond8696ebc2002-10-08 02:44:31 +00001398static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001399sys_getwindowsversion_impl(PyObject *module)
1400/*[clinic end generated code: output=1ec063280b932857 input=73a228a328fee63a]*/
Mark Hammond8696ebc2002-10-08 02:44:31 +00001401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 PyObject *version;
1403 int pos = 0;
Minmin Gong8ebc6452019-02-02 20:26:55 -08001404 OSVERSIONINFOEXW ver;
Steve Dower74f4af72016-09-17 17:27:48 -07001405 DWORD realMajor, realMinor, realBuild;
1406 HANDLE hKernel32;
1407 wchar_t kernel32_path[MAX_PATH];
1408 LPVOID verblock;
1409 DWORD verblock_size;
Victor Stinner838f2642019-06-13 22:41:23 +02001410 PyThreadState *tstate = _PyThreadState_GET();
Steve Dower74f4af72016-09-17 17:27:48 -07001411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 ver.dwOSVersionInfoSize = sizeof(ver);
Minmin Gong8ebc6452019-02-02 20:26:55 -08001413 if (!GetVersionExW((OSVERSIONINFOW*) &ver))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 return PyErr_SetFromWindowsErr(0);
Eric Smithf7bb5782010-01-27 00:44:57 +00001415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 version = PyStructSequence_New(&WindowsVersionType);
1417 if (version == NULL)
1418 return NULL;
Eric Smithf7bb5782010-01-27 00:44:57 +00001419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMajorVersion));
1421 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwMinorVersion));
1422 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwBuildNumber));
1423 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.dwPlatformId));
Minmin Gong8ebc6452019-02-02 20:26:55 -08001424 PyStructSequence_SET_ITEM(version, pos++, PyUnicode_FromWideChar(ver.szCSDVersion, -1));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMajor));
1426 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wServicePackMinor));
1427 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wSuiteMask));
1428 PyStructSequence_SET_ITEM(version, pos++, PyLong_FromLong(ver.wProductType));
Eric Smithf7bb5782010-01-27 00:44:57 +00001429
Steve Dower74f4af72016-09-17 17:27:48 -07001430 realMajor = ver.dwMajorVersion;
1431 realMinor = ver.dwMinorVersion;
1432 realBuild = ver.dwBuildNumber;
1433
1434 // GetVersion will lie if we are running in a compatibility mode.
1435 // We need to read the version info from a system file resource
1436 // to accurately identify the OS version. If we fail for any reason,
1437 // just return whatever GetVersion said.
Tony Roberts4860f012019-02-02 18:16:42 +01001438 Py_BEGIN_ALLOW_THREADS
Steve Dower74f4af72016-09-17 17:27:48 -07001439 hKernel32 = GetModuleHandleW(L"kernel32.dll");
Tony Roberts4860f012019-02-02 18:16:42 +01001440 Py_END_ALLOW_THREADS
Steve Dower74f4af72016-09-17 17:27:48 -07001441 if (hKernel32 && GetModuleFileNameW(hKernel32, kernel32_path, MAX_PATH) &&
1442 (verblock_size = GetFileVersionInfoSizeW(kernel32_path, NULL)) &&
1443 (verblock = PyMem_RawMalloc(verblock_size))) {
1444 VS_FIXEDFILEINFO *ffi;
1445 UINT ffi_len;
1446
1447 if (GetFileVersionInfoW(kernel32_path, 0, verblock_size, verblock) &&
1448 VerQueryValueW(verblock, L"", (LPVOID)&ffi, &ffi_len)) {
1449 realMajor = HIWORD(ffi->dwProductVersionMS);
1450 realMinor = LOWORD(ffi->dwProductVersionMS);
1451 realBuild = HIWORD(ffi->dwProductVersionLS);
1452 }
1453 PyMem_RawFree(verblock);
1454 }
Segev Finer48fb7662017-06-04 20:52:27 +03001455 PyStructSequence_SET_ITEM(version, pos++, Py_BuildValue("(kkk)",
1456 realMajor,
1457 realMinor,
1458 realBuild
Steve Dower74f4af72016-09-17 17:27:48 -07001459 ));
1460
Victor Stinner838f2642019-06-13 22:41:23 +02001461 if (_PyErr_Occurred(tstate)) {
Serhiy Storchaka48d761e2013-12-17 15:11:24 +02001462 Py_DECREF(version);
1463 return NULL;
1464 }
Steve Dower74f4af72016-09-17 17:27:48 -07001465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 return version;
Mark Hammond8696ebc2002-10-08 02:44:31 +00001467}
1468
Steve Dower3e96f322015-03-02 08:01:10 -08001469#pragma warning(pop)
1470
Tal Einatede0b6f2018-12-31 17:12:08 +02001471/*[clinic input]
1472sys._enablelegacywindowsfsencoding
1473
1474Changes the default filesystem encoding to mbcs:replace.
1475
1476This is done for consistency with earlier versions of Python. See PEP
1477529 for more information.
1478
1479This is equivalent to defining the PYTHONLEGACYWINDOWSFSENCODING
1480environment variable before launching Python.
1481[clinic start generated code]*/
Steve Dowercc16be82016-09-08 10:35:16 -07001482
1483static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001484sys__enablelegacywindowsfsencoding_impl(PyObject *module)
1485/*[clinic end generated code: output=f5c3855b45e24fe9 input=2bfa931a20704492]*/
Steve Dowercc16be82016-09-08 10:35:16 -07001486{
Victor Stinner709d23d2019-05-02 14:56:30 -04001487 if (_PyUnicode_EnableLegacyWindowsFSEncoding() < 0) {
Victor Stinnerb2457ef2018-08-29 13:25:36 +02001488 return NULL;
1489 }
Steve Dowercc16be82016-09-08 10:35:16 -07001490 Py_RETURN_NONE;
1491}
1492
Mark Hammond8696ebc2002-10-08 02:44:31 +00001493#endif /* MS_WINDOWS */
1494
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001495#ifdef HAVE_DLOPEN
Tal Einatede0b6f2018-12-31 17:12:08 +02001496
1497/*[clinic input]
1498sys.setdlopenflags
1499
1500 flags as new_val: int
1501 /
1502
1503Set the flags used by the interpreter for dlopen calls.
1504
1505This is used, for example, when the interpreter loads extension
1506modules. Among other things, this will enable a lazy resolving of
1507symbols when importing a module, if called as sys.setdlopenflags(0).
1508To share symbols across extension modules, call as
1509sys.setdlopenflags(os.RTLD_GLOBAL). Symbolic names for the flag
1510modules can be found in the os module (RTLD_xxx constants, e.g.
1511os.RTLD_LAZY).
1512[clinic start generated code]*/
1513
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001514static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001515sys_setdlopenflags_impl(PyObject *module, int new_val)
1516/*[clinic end generated code: output=ec918b7fe0a37281 input=4c838211e857a77f]*/
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001517{
Victor Stinner838f2642019-06-13 22:41:23 +02001518 PyThreadState *tstate = _PyThreadState_GET();
1519 tstate->interp->dlopenflags = new_val;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001520 Py_RETURN_NONE;
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001521}
1522
Tal Einatede0b6f2018-12-31 17:12:08 +02001523
1524/*[clinic input]
1525sys.getdlopenflags
1526
1527Return the current value of the flags that are used for dlopen calls.
1528
1529The flag constants are defined in the os module.
1530[clinic start generated code]*/
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001531
1532static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001533sys_getdlopenflags_impl(PyObject *module)
1534/*[clinic end generated code: output=e92cd1bc5005da6e input=dc4ea0899c53b4b6]*/
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001535{
Victor Stinner838f2642019-06-13 22:41:23 +02001536 PyThreadState *tstate = _PyThreadState_GET();
1537 return PyLong_FromLong(tstate->interp->dlopenflags);
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001538}
1539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540#endif /* HAVE_DLOPEN */
Martin v. Löwisf0473d52001-07-18 16:17:16 +00001541
Guido van Rossum14b4adb1992-09-03 20:25:30 +00001542#ifdef USE_MALLOPT
1543/* Link with -lmalloc (or -lmpc) on an SGI */
1544#include <malloc.h>
1545
Tal Einatede0b6f2018-12-31 17:12:08 +02001546/*[clinic input]
1547sys.mdebug
1548
1549 flag: int
1550 /
1551[clinic start generated code]*/
1552
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001553static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001554sys_mdebug_impl(PyObject *module, int flag)
1555/*[clinic end generated code: output=5431d545847c3637 input=151d150ae1636f8a]*/
Guido van Rossum14b4adb1992-09-03 20:25:30 +00001556{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 int flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 mallopt(M_DEBUG, flag);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001559 Py_RETURN_NONE;
Guido van Rossum14b4adb1992-09-03 20:25:30 +00001560}
1561#endif /* USE_MALLOPT */
1562
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001563size_t
1564_PySys_GetSizeOf(PyObject *o)
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001565{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 PyObject *res = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 PyObject *method;
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001568 Py_ssize_t size;
Victor Stinner838f2642019-06-13 22:41:23 +02001569 PyThreadState *tstate = _PyThreadState_GET();
Benjamin Petersona5758c02009-05-09 18:15:04 +00001570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 /* Make sure the type is initialized. float gets initialized late */
Victor Stinner838f2642019-06-13 22:41:23 +02001572 if (PyType_Ready(Py_TYPE(o)) < 0) {
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001573 return (size_t)-1;
Victor Stinner838f2642019-06-13 22:41:23 +02001574 }
Robert Schuppeniesfbe94c52008-07-14 10:13:31 +00001575
Benjamin Petersonce798522012-01-22 11:24:29 -05001576 method = _PyObject_LookupSpecial(o, &PyId___sizeof__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 if (method == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +02001578 if (!_PyErr_Occurred(tstate)) {
1579 _PyErr_Format(tstate, PyExc_TypeError,
1580 "Type %.100s doesn't define __sizeof__",
1581 Py_TYPE(o)->tp_name);
1582 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 }
1584 else {
Victor Stinnerf17c3de2016-12-06 18:46:19 +01001585 res = _PyObject_CallNoArg(method);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 Py_DECREF(method);
1587 }
1588
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001589 if (res == NULL)
1590 return (size_t)-1;
1591
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001592 size = PyLong_AsSsize_t(res);
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001593 Py_DECREF(res);
Victor Stinner838f2642019-06-13 22:41:23 +02001594 if (size == -1 && _PyErr_Occurred(tstate))
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001595 return (size_t)-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001597 if (size < 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02001598 _PyErr_SetString(tstate, PyExc_ValueError,
1599 "__sizeof__() should return >= 0");
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001600 return (size_t)-1;
1601 }
1602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 /* add gc_head size */
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001604 if (PyObject_IS_GC(o))
Serhiy Storchaka030e92d2014-11-15 13:21:37 +02001605 return ((size_t)size) + sizeof(PyGC_Head);
1606 return (size_t)size;
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001607}
1608
1609static PyObject *
1610sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)
1611{
1612 static char *kwlist[] = {"object", "default", 0};
1613 size_t size;
1614 PyObject *o, *dflt = NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02001615 PyThreadState *tstate = _PyThreadState_GET();
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001616
1617 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",
Victor Stinner838f2642019-06-13 22:41:23 +02001618 kwlist, &o, &dflt)) {
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001619 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02001620 }
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001621
1622 size = _PySys_GetSizeOf(o);
1623
Victor Stinner838f2642019-06-13 22:41:23 +02001624 if (size == (size_t)-1 && _PyErr_Occurred(tstate)) {
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001625 /* Has a default value been given */
Victor Stinner838f2642019-06-13 22:41:23 +02001626 if (dflt != NULL && _PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
1627 _PyErr_Clear(tstate);
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001628 Py_INCREF(dflt);
1629 return dflt;
1630 }
1631 else
1632 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 }
Serhiy Storchaka547d3bc2014-08-14 22:21:18 +03001634
1635 return PyLong_FromSize_t(size);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001636}
1637
1638PyDoc_STRVAR(getsizeof_doc,
Tal Einatede0b6f2018-12-31 17:12:08 +02001639"getsizeof(object [, default]) -> int\n\
Martin v. Löwis00709aa2008-06-04 14:18:43 +00001640\n\
1641Return the size of object in bytes.");
1642
Tal Einatede0b6f2018-12-31 17:12:08 +02001643/*[clinic input]
1644sys.getrefcount -> Py_ssize_t
1645
1646 object: object
1647 /
1648
1649Return the reference count of object.
1650
1651The count returned is generally one higher than you might expect,
1652because it includes the (temporary) reference as an argument to
1653getrefcount().
1654[clinic start generated code]*/
1655
1656static Py_ssize_t
1657sys_getrefcount_impl(PyObject *module, PyObject *object)
1658/*[clinic end generated code: output=5fd477f2264b85b2 input=bf474efd50a21535]*/
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001659{
Victor Stinnera93c51e2020-02-07 00:38:59 +01001660 return Py_REFCNT(object);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001661}
1662
Tim Peters4be93d02002-07-07 19:59:50 +00001663#ifdef Py_REF_DEBUG
Tal Einatede0b6f2018-12-31 17:12:08 +02001664/*[clinic input]
1665sys.gettotalrefcount -> Py_ssize_t
1666[clinic start generated code]*/
1667
1668static Py_ssize_t
1669sys_gettotalrefcount_impl(PyObject *module)
1670/*[clinic end generated code: output=4103886cf17c25bc input=53b744faa5d2e4f6]*/
Mark Hammond440d8982000-06-20 08:12:48 +00001671{
Tal Einatede0b6f2018-12-31 17:12:08 +02001672 return _Py_GetRefTotal();
Mark Hammond440d8982000-06-20 08:12:48 +00001673}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001674#endif /* Py_REF_DEBUG */
Mark Hammond440d8982000-06-20 08:12:48 +00001675
Tal Einatede0b6f2018-12-31 17:12:08 +02001676/*[clinic input]
1677sys.getallocatedblocks -> Py_ssize_t
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00001678
Tal Einatede0b6f2018-12-31 17:12:08 +02001679Return the number of memory blocks currently allocated.
1680[clinic start generated code]*/
1681
1682static Py_ssize_t
1683sys_getallocatedblocks_impl(PyObject *module)
1684/*[clinic end generated code: output=f0c4e873f0b6dcf7 input=dab13ee346a0673e]*/
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001685{
Tal Einatede0b6f2018-12-31 17:12:08 +02001686 return _Py_GetAllocatedBlocks();
Antoine Pitrouf9d0b122012-12-09 14:28:26 +01001687}
1688
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001689
Tal Einatede0b6f2018-12-31 17:12:08 +02001690/*[clinic input]
1691sys._getframe
1692
1693 depth: int = 0
1694 /
1695
1696Return a frame object from the call stack.
1697
1698If optional integer depth is given, return the frame object that many
1699calls below the top of the stack. If that is deeper than the call
1700stack, ValueError is raised. The default for depth is zero, returning
1701the frame at the top of the call stack.
1702
1703This function should be used for internal and specialized purposes
1704only.
1705[clinic start generated code]*/
Barry Warsawb6a54d22000-12-06 21:47:46 +00001706
1707static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001708sys__getframe_impl(PyObject *module, int depth)
1709/*[clinic end generated code: output=d438776c04d59804 input=c1be8a6464b11ee5]*/
Barry Warsawb6a54d22000-12-06 21:47:46 +00001710{
Victor Stinner838f2642019-06-13 22:41:23 +02001711 PyThreadState *tstate = _PyThreadState_GET();
1712 PyFrameObject *f = tstate->frame;
Barry Warsawb6a54d22000-12-06 21:47:46 +00001713
Steve Dowerb82e17e2019-05-23 08:45:22 -07001714 if (PySys_Audit("sys._getframe", "O", f) < 0) {
1715 return NULL;
1716 }
1717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 while (depth > 0 && f != NULL) {
1719 f = f->f_back;
1720 --depth;
1721 }
1722 if (f == NULL) {
Victor Stinner838f2642019-06-13 22:41:23 +02001723 _PyErr_SetString(tstate, PyExc_ValueError,
1724 "call stack is not deep enough");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 return NULL;
1726 }
1727 Py_INCREF(f);
1728 return (PyObject*)f;
Barry Warsawb6a54d22000-12-06 21:47:46 +00001729}
1730
Tal Einatede0b6f2018-12-31 17:12:08 +02001731/*[clinic input]
1732sys._current_frames
1733
1734Return a dict mapping each thread's thread id to its current stack frame.
1735
1736This function should be used for specialized purposes only.
1737[clinic start generated code]*/
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001738
1739static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001740sys__current_frames_impl(PyObject *module)
1741/*[clinic end generated code: output=d2a41ac0a0a3809a input=2a9049c5f5033691]*/
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 return _PyThread_CurrentFrames();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001744}
1745
Tal Einatede0b6f2018-12-31 17:12:08 +02001746/*[clinic input]
1747sys.call_tracing
1748
1749 func: object
1750 args as funcargs: object(subclass_of='&PyTuple_Type')
1751 /
1752
1753Call func(*args), while tracing is enabled.
1754
1755The tracing state is saved, and restored afterwards. This is intended
1756to be called from a debugger from a checkpoint, to recursively debug
1757some other code.
1758[clinic start generated code]*/
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001759
1760static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001761sys_call_tracing_impl(PyObject *module, PyObject *func, PyObject *funcargs)
1762/*[clinic end generated code: output=7e4999853cd4e5a6 input=5102e8b11049f92f]*/
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 return _PyEval_CallTracing(func, funcargs);
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001765}
1766
Victor Stinner048afd92016-11-28 11:59:04 +01001767
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001768#ifdef __cplusplus
1769extern "C" {
1770#endif
1771
Tal Einatede0b6f2018-12-31 17:12:08 +02001772/*[clinic input]
1773sys._debugmallocstats
1774
1775Print summary info to stderr about the state of pymalloc's structures.
1776
1777In Py_DEBUG mode, also perform some expensive internal consistency
1778checks.
1779[clinic start generated code]*/
1780
David Malcolm49526f42012-06-22 14:55:41 -04001781static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001782sys__debugmallocstats_impl(PyObject *module)
1783/*[clinic end generated code: output=ec3565f8c7cee46a input=33c0c9c416f98424]*/
David Malcolm49526f42012-06-22 14:55:41 -04001784{
1785#ifdef WITH_PYMALLOC
Victor Stinner6bf992a2017-12-06 17:26:10 +01001786 if (_PyObject_DebugMallocStats(stderr)) {
Victor Stinner34be8072016-03-14 12:04:26 +01001787 fputc('\n', stderr);
1788 }
David Malcolm49526f42012-06-22 14:55:41 -04001789#endif
1790 _PyObject_DebugTypeStats(stderr);
1791
1792 Py_RETURN_NONE;
1793}
David Malcolm49526f42012-06-22 14:55:41 -04001794
Guido van Rossum7f3f2c11996-05-23 22:45:41 +00001795#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +00001796/* Defined in objects.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001797extern PyObject *_Py_GetObjects(PyObject *, PyObject *);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +00001798#endif
Guido van Rossumded690f1996-05-24 20:48:31 +00001799
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001800#ifdef DYNAMIC_EXECUTION_PROFILE
1801/* Defined in ceval.c because it uses static globals if that file */
Tim Petersdbd9ba62000-07-09 03:09:57 +00001802extern PyObject *_Py_GetDXProfile(PyObject *, PyObject *);
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001803#endif
1804
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001805#ifdef __cplusplus
1806}
1807#endif
1808
Tal Einatede0b6f2018-12-31 17:12:08 +02001809
1810/*[clinic input]
1811sys._clear_type_cache
1812
1813Clear the internal type lookup cache.
1814[clinic start generated code]*/
1815
Christian Heimes15ebc882008-02-04 18:48:49 +00001816static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001817sys__clear_type_cache_impl(PyObject *module)
1818/*[clinic end generated code: output=20e48ca54a6f6971 input=127f3e04a8d9b555]*/
Christian Heimes15ebc882008-02-04 18:48:49 +00001819{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 PyType_ClearCache();
1821 Py_RETURN_NONE;
Christian Heimes15ebc882008-02-04 18:48:49 +00001822}
1823
Tal Einatede0b6f2018-12-31 17:12:08 +02001824/*[clinic input]
1825sys.is_finalizing
1826
1827Return True if Python is exiting.
1828[clinic start generated code]*/
1829
Antoine Pitrou5db1bb82014-12-07 01:28:27 +01001830static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001831sys_is_finalizing_impl(PyObject *module)
1832/*[clinic end generated code: output=735b5ff7962ab281 input=f0df747a039948a5]*/
Antoine Pitrou5db1bb82014-12-07 01:28:27 +01001833{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001834 return PyBool_FromLong(_Py_IsFinalizing());
Antoine Pitrou5db1bb82014-12-07 01:28:27 +01001835}
1836
Victor Stinnerd6958ac2016-12-02 01:13:46 +01001837#ifdef ANDROID_API_LEVEL
Tal Einatede0b6f2018-12-31 17:12:08 +02001838/*[clinic input]
1839sys.getandroidapilevel
1840
1841Return the build time API version of Android as an integer.
1842[clinic start generated code]*/
Victor Stinnerd6958ac2016-12-02 01:13:46 +01001843
1844static PyObject *
Tal Einatede0b6f2018-12-31 17:12:08 +02001845sys_getandroidapilevel_impl(PyObject *module)
1846/*[clinic end generated code: output=214abf183a1c70c1 input=3e6d6c9fcdd24ac6]*/
Victor Stinnerd6958ac2016-12-02 01:13:46 +01001847{
1848 return PyLong_FromLong(ANDROID_API_LEVEL);
1849}
1850#endif /* ANDROID_API_LEVEL */
1851
1852
Steve Dowerb82e17e2019-05-23 08:45:22 -07001853
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001854static PyMethodDef sys_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 /* Might as well keep this in alphabetic order */
Steve Dowerb82e17e2019-05-23 08:45:22 -07001856 SYS_ADDAUDITHOOK_METHODDEF
1857 {"audit", (PyCFunction)(void(*)(void))sys_audit, METH_FASTCALL, audit_doc },
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001858 {"breakpointhook", (PyCFunction)(void(*)(void))sys_breakpointhook,
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04001859 METH_FASTCALL | METH_KEYWORDS, breakpointhook_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001860 SYS__CLEAR_TYPE_CACHE_METHODDEF
1861 SYS__CURRENT_FRAMES_METHODDEF
1862 SYS_DISPLAYHOOK_METHODDEF
1863 SYS_EXC_INFO_METHODDEF
1864 SYS_EXCEPTHOOK_METHODDEF
1865 SYS_EXIT_METHODDEF
1866 SYS_GETDEFAULTENCODING_METHODDEF
1867 SYS_GETDLOPENFLAGS_METHODDEF
1868 SYS_GETALLOCATEDBLOCKS_METHODDEF
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001869#ifdef DYNAMIC_EXECUTION_PROFILE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 {"getdxp", _Py_GetDXProfile, METH_VARARGS},
Guido van Rossum43f1b8d1997-01-24 04:07:45 +00001871#endif
Tal Einatede0b6f2018-12-31 17:12:08 +02001872 SYS_GETFILESYSTEMENCODING_METHODDEF
1873 SYS_GETFILESYSTEMENCODEERRORS_METHODDEF
Guido van Rossum7f3f2c11996-05-23 22:45:41 +00001874#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 {"getobjects", _Py_GetObjects, METH_VARARGS},
Tim Peters4be93d02002-07-07 19:59:50 +00001876#endif
Tal Einatede0b6f2018-12-31 17:12:08 +02001877 SYS_GETTOTALREFCOUNT_METHODDEF
1878 SYS_GETREFCOUNT_METHODDEF
1879 SYS_GETRECURSIONLIMIT_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001880 {"getsizeof", (PyCFunction)(void(*)(void))sys_getsizeof,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 METH_VARARGS | METH_KEYWORDS, getsizeof_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001882 SYS__GETFRAME_METHODDEF
1883 SYS_GETWINDOWSVERSION_METHODDEF
1884 SYS__ENABLELEGACYWINDOWSFSENCODING_METHODDEF
1885 SYS_INTERN_METHODDEF
1886 SYS_IS_FINALIZING_METHODDEF
1887 SYS_MDEBUG_METHODDEF
Tal Einatede0b6f2018-12-31 17:12:08 +02001888 SYS_SETSWITCHINTERVAL_METHODDEF
1889 SYS_GETSWITCHINTERVAL_METHODDEF
1890 SYS_SETDLOPENFLAGS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 {"setprofile", sys_setprofile, METH_O, setprofile_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001892 SYS_GETPROFILE_METHODDEF
1893 SYS_SETRECURSIONLIMIT_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 {"settrace", sys_settrace, METH_O, settrace_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001895 SYS_GETTRACE_METHODDEF
1896 SYS_CALL_TRACING_METHODDEF
1897 SYS__DEBUGMALLOCSTATS_METHODDEF
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001898 SYS_SET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF
1899 SYS_GET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001900 {"set_asyncgen_hooks", (PyCFunction)(void(*)(void))sys_set_asyncgen_hooks,
Yury Selivanoveb636452016-09-08 22:01:51 -07001901 METH_VARARGS | METH_KEYWORDS, set_asyncgen_hooks_doc},
Tal Einatede0b6f2018-12-31 17:12:08 +02001902 SYS_GET_ASYNCGEN_HOOKS_METHODDEF
1903 SYS_GETANDROIDAPILEVEL_METHODDEF
Victor Stinneref9d9b62019-05-22 11:28:22 +02001904 SYS_UNRAISABLEHOOK_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 {NULL, NULL} /* sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001906};
1907
Guido van Rossum65bf9f21997-04-29 18:33:38 +00001908static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001909list_builtin_module_names(void)
Guido van Rossum34679b71993-01-26 13:33:44 +00001910{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 PyObject *list = PyList_New(0);
1912 int i;
1913 if (list == NULL)
1914 return NULL;
1915 for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
1916 PyObject *name = PyUnicode_FromString(
1917 PyImport_Inittab[i].name);
1918 if (name == NULL)
1919 break;
1920 PyList_Append(list, name);
1921 Py_DECREF(name);
1922 }
1923 if (PyList_Sort(list) != 0) {
1924 Py_DECREF(list);
1925 list = NULL;
1926 }
1927 if (list) {
1928 PyObject *v = PyList_AsTuple(list);
1929 Py_DECREF(list);
1930 list = v;
1931 }
1932 return list;
Guido van Rossum34679b71993-01-26 13:33:44 +00001933}
1934
Nick Coghlanbc77eff2018-03-25 20:44:30 +10001935/* Pre-initialization support for sys.warnoptions and sys._xoptions
1936 *
1937 * Modern internal code paths:
1938 * These APIs get called after _Py_InitializeCore and get to use the
1939 * regular CPython list, dict, and unicode APIs.
1940 *
1941 * Legacy embedding code paths:
1942 * The multi-phase initialization API isn't public yet, so embedding
1943 * apps still need to be able configure sys.warnoptions and sys._xoptions
1944 * before they call Py_Initialize. To support this, we stash copies of
1945 * the supplied wchar * sequences in linked lists, and then migrate the
1946 * contents of those lists to the sys module in _PyInitializeCore.
1947 *
1948 */
1949
1950struct _preinit_entry {
1951 wchar_t *value;
1952 struct _preinit_entry *next;
1953};
1954
1955typedef struct _preinit_entry *_Py_PreInitEntry;
1956
1957static _Py_PreInitEntry _preinit_warnoptions = NULL;
1958static _Py_PreInitEntry _preinit_xoptions = NULL;
1959
1960static _Py_PreInitEntry
1961_alloc_preinit_entry(const wchar_t *value)
1962{
1963 /* To get this to work, we have to initialize the runtime implicitly */
1964 _PyRuntime_Initialize();
1965
1966 /* Force default allocator, so we can ensure that it also gets used to
1967 * destroy the linked list in _clear_preinit_entries.
1968 */
1969 PyMemAllocatorEx old_alloc;
1970 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1971
1972 _Py_PreInitEntry node = PyMem_RawCalloc(1, sizeof(*node));
1973 if (node != NULL) {
1974 node->value = _PyMem_RawWcsdup(value);
1975 if (node->value == NULL) {
1976 PyMem_RawFree(node);
1977 node = NULL;
1978 };
1979 };
1980
1981 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1982 return node;
Zackery Spytz1a2252e2019-05-06 10:56:51 -06001983}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10001984
1985static int
1986_append_preinit_entry(_Py_PreInitEntry *optionlist, const wchar_t *value)
1987{
1988 _Py_PreInitEntry new_entry = _alloc_preinit_entry(value);
1989 if (new_entry == NULL) {
1990 return -1;
1991 }
1992 /* We maintain the linked list in this order so it's easy to play back
1993 * the add commands in the same order later on in _Py_InitializeCore
1994 */
1995 _Py_PreInitEntry last_entry = *optionlist;
1996 if (last_entry == NULL) {
1997 *optionlist = new_entry;
1998 } else {
1999 while (last_entry->next != NULL) {
2000 last_entry = last_entry->next;
2001 }
2002 last_entry->next = new_entry;
2003 }
2004 return 0;
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002005}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002006
2007static void
2008_clear_preinit_entries(_Py_PreInitEntry *optionlist)
2009{
2010 _Py_PreInitEntry current = *optionlist;
2011 *optionlist = NULL;
2012 /* Deallocate the nodes and their contents using the default allocator */
2013 PyMemAllocatorEx old_alloc;
2014 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
2015 while (current != NULL) {
2016 _Py_PreInitEntry next = current->next;
2017 PyMem_RawFree(current->value);
2018 PyMem_RawFree(current);
2019 current = next;
2020 }
2021 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002022}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002023
Victor Stinner120b7072019-08-23 18:03:08 +01002024
2025PyStatus
Victor Stinnerfb4ae152019-09-30 01:40:17 +02002026_PySys_ReadPreinitWarnOptions(PyWideStringList *options)
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002027{
Victor Stinner120b7072019-08-23 18:03:08 +01002028 PyStatus status;
2029 _Py_PreInitEntry entry;
2030
2031 for (entry = _preinit_warnoptions; entry != NULL; entry = entry->next) {
Victor Stinnerfb4ae152019-09-30 01:40:17 +02002032 status = PyWideStringList_Append(options, entry->value);
Victor Stinner120b7072019-08-23 18:03:08 +01002033 if (_PyStatus_EXCEPTION(status)) {
2034 return status;
2035 }
2036 }
2037
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002038 _clear_preinit_entries(&_preinit_warnoptions);
Victor Stinner120b7072019-08-23 18:03:08 +01002039 return _PyStatus_OK();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002040}
2041
Victor Stinner120b7072019-08-23 18:03:08 +01002042
2043PyStatus
2044_PySys_ReadPreinitXOptions(PyConfig *config)
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002045{
Victor Stinner120b7072019-08-23 18:03:08 +01002046 PyStatus status;
2047 _Py_PreInitEntry entry;
2048
2049 for (entry = _preinit_xoptions; entry != NULL; entry = entry->next) {
2050 status = PyWideStringList_Append(&config->xoptions, entry->value);
2051 if (_PyStatus_EXCEPTION(status)) {
2052 return status;
2053 }
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002054 }
2055
Victor Stinner120b7072019-08-23 18:03:08 +01002056 _clear_preinit_entries(&_preinit_xoptions);
2057 return _PyStatus_OK();
Zackery Spytz1a2252e2019-05-06 10:56:51 -06002058}
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002059
Victor Stinner120b7072019-08-23 18:03:08 +01002060
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002061static PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +02002062get_warnoptions(PyThreadState *tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002063{
Victor Stinner838f2642019-06-13 22:41:23 +02002064 PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002065 if (warnoptions == NULL || !PyList_Check(warnoptions)) {
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002066 /* PEP432 TODO: we can reach this if warnoptions is NULL in the main
2067 * interpreter config. When that happens, we need to properly set
2068 * the `warnoptions` reference in the main interpreter config as well.
2069 *
2070 * For Python 3.7, we shouldn't be able to get here due to the
2071 * combination of how _PyMainInterpreter_ReadConfig and _PySys_EndInit
2072 * work, but we expect 3.8+ to make the _PyMainInterpreter_ReadConfig
2073 * call optional for embedding applications, thus making this
2074 * reachable again.
2075 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002076 warnoptions = PyList_New(0);
Victor Stinner838f2642019-06-13 22:41:23 +02002077 if (warnoptions == NULL) {
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002078 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02002079 }
2080 if (sys_set_object_id(tstate, &PyId_warnoptions, warnoptions)) {
Eric Snowdae02762017-09-14 00:35:58 -07002081 Py_DECREF(warnoptions);
2082 return NULL;
2083 }
2084 Py_DECREF(warnoptions);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002085 }
2086 return warnoptions;
2087}
Guido van Rossum23fff912000-12-15 22:02:05 +00002088
2089void
2090PySys_ResetWarnOptions(void)
2091{
Victor Stinner50b48572018-11-01 01:51:40 +01002092 PyThreadState *tstate = _PyThreadState_GET();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002093 if (tstate == NULL) {
2094 _clear_preinit_entries(&_preinit_warnoptions);
2095 return;
2096 }
2097
Victor Stinner838f2642019-06-13 22:41:23 +02002098 PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 if (warnoptions == NULL || !PyList_Check(warnoptions))
2100 return;
2101 PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL);
Guido van Rossum23fff912000-12-15 22:02:05 +00002102}
2103
Victor Stinnere1b29952018-10-30 14:31:42 +01002104static int
Victor Stinner838f2642019-06-13 22:41:23 +02002105_PySys_AddWarnOptionWithError(PyThreadState *tstate, PyObject *option)
Guido van Rossum23fff912000-12-15 22:02:05 +00002106{
Victor Stinner838f2642019-06-13 22:41:23 +02002107 PyObject *warnoptions = get_warnoptions(tstate);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002108 if (warnoptions == NULL) {
2109 return -1;
2110 }
2111 if (PyList_Append(warnoptions, option)) {
2112 return -1;
2113 }
2114 return 0;
2115}
2116
2117void
2118PySys_AddWarnOptionUnicode(PyObject *option)
2119{
Victor Stinner838f2642019-06-13 22:41:23 +02002120 PyThreadState *tstate = _PyThreadState_GET();
2121 if (_PySys_AddWarnOptionWithError(tstate, option) < 0) {
Victor Stinnere1b29952018-10-30 14:31:42 +01002122 /* No return value, therefore clear error state if possible */
Victor Stinner838f2642019-06-13 22:41:23 +02002123 if (tstate) {
2124 _PyErr_Clear(tstate);
Victor Stinnere1b29952018-10-30 14:31:42 +01002125 }
2126 }
Victor Stinner9ca9c252010-05-19 16:53:30 +00002127}
2128
2129void
2130PySys_AddWarnOption(const wchar_t *s)
2131{
Victor Stinner50b48572018-11-01 01:51:40 +01002132 PyThreadState *tstate = _PyThreadState_GET();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002133 if (tstate == NULL) {
2134 _append_preinit_entry(&_preinit_warnoptions, s);
2135 return;
2136 }
Victor Stinner9ca9c252010-05-19 16:53:30 +00002137 PyObject *unicode;
2138 unicode = PyUnicode_FromWideChar(s, -1);
2139 if (unicode == NULL)
2140 return;
2141 PySys_AddWarnOptionUnicode(unicode);
2142 Py_DECREF(unicode);
Guido van Rossum23fff912000-12-15 22:02:05 +00002143}
2144
Christian Heimes33fe8092008-04-13 13:53:33 +00002145int
2146PySys_HasWarnOptions(void)
2147{
Victor Stinner838f2642019-06-13 22:41:23 +02002148 PyThreadState *tstate = _PyThreadState_GET();
2149 PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions);
Serhiy Storchakadffccc62018-12-10 13:50:22 +02002150 return (warnoptions != NULL && PyList_Check(warnoptions)
2151 && PyList_GET_SIZE(warnoptions) > 0);
Christian Heimes33fe8092008-04-13 13:53:33 +00002152}
2153
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002154static PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +02002155get_xoptions(PyThreadState *tstate)
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002156{
Victor Stinner838f2642019-06-13 22:41:23 +02002157 PyObject *xoptions = sys_get_object_id(tstate, &PyId__xoptions);
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002158 if (xoptions == NULL || !PyDict_Check(xoptions)) {
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002159 /* PEP432 TODO: we can reach this if xoptions is NULL in the main
2160 * interpreter config. When that happens, we need to properly set
2161 * the `xoptions` reference in the main interpreter config as well.
2162 *
2163 * For Python 3.7, we shouldn't be able to get here due to the
2164 * combination of how _PyMainInterpreter_ReadConfig and _PySys_EndInit
2165 * work, but we expect 3.8+ to make the _PyMainInterpreter_ReadConfig
2166 * call optional for embedding applications, thus making this
2167 * reachable again.
2168 */
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002169 xoptions = PyDict_New();
Victor Stinner838f2642019-06-13 22:41:23 +02002170 if (xoptions == NULL) {
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002171 return NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02002172 }
2173 if (sys_set_object_id(tstate, &PyId__xoptions, xoptions)) {
Eric Snowdae02762017-09-14 00:35:58 -07002174 Py_DECREF(xoptions);
2175 return NULL;
2176 }
2177 Py_DECREF(xoptions);
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002178 }
2179 return xoptions;
2180}
2181
Victor Stinnere1b29952018-10-30 14:31:42 +01002182static int
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002183_PySys_AddXOptionWithError(const wchar_t *s)
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002184{
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002185 PyObject *name = NULL, *value = NULL;
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002186
Victor Stinner838f2642019-06-13 22:41:23 +02002187 PyThreadState *tstate = _PyThreadState_GET();
2188 PyObject *opts = get_xoptions(tstate);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002189 if (opts == NULL) {
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002190 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002191 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002192
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002193 const wchar_t *name_end = wcschr(s, L'=');
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002194 if (!name_end) {
2195 name = PyUnicode_FromWideChar(s, -1);
2196 value = Py_True;
2197 Py_INCREF(value);
2198 }
2199 else {
2200 name = PyUnicode_FromWideChar(s, name_end - s);
2201 value = PyUnicode_FromWideChar(name_end + 1, -1);
2202 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002203 if (name == NULL || value == NULL) {
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002204 goto error;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002205 }
2206 if (PyDict_SetItem(opts, name, value) < 0) {
2207 goto error;
2208 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002209 Py_DECREF(name);
2210 Py_DECREF(value);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002211 return 0;
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002212
2213error:
2214 Py_XDECREF(name);
2215 Py_XDECREF(value);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002216 return -1;
2217}
2218
2219void
2220PySys_AddXOption(const wchar_t *s)
2221{
Victor Stinner50b48572018-11-01 01:51:40 +01002222 PyThreadState *tstate = _PyThreadState_GET();
Nick Coghlanbc77eff2018-03-25 20:44:30 +10002223 if (tstate == NULL) {
2224 _append_preinit_entry(&_preinit_xoptions, s);
2225 return;
2226 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002227 if (_PySys_AddXOptionWithError(s) < 0) {
2228 /* No return value, therefore clear error state if possible */
Victor Stinner120b7072019-08-23 18:03:08 +01002229 _PyErr_Clear(tstate);
Victor Stinner0cae6092016-11-11 01:43:56 +01002230 }
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002231}
2232
2233PyObject *
2234PySys_GetXOptions(void)
2235{
Victor Stinner838f2642019-06-13 22:41:23 +02002236 PyThreadState *tstate = _PyThreadState_GET();
2237 return get_xoptions(tstate);
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002238}
2239
Guido van Rossum40552d01998-08-06 03:34:39 +00002240/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
2241 Two literals concatenated works just fine. If you have a K&R compiler
2242 or other abomination that however *does* understand longer strings,
2243 get rid of the !!! comment in the middle and the quotes that surround it. */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002244PyDoc_VAR(sys_doc) =
2245PyDoc_STR(
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002246"This module provides access to some objects used or maintained by the\n\
2247interpreter and to functions that interact strongly with the interpreter.\n\
2248\n\
2249Dynamic objects:\n\
2250\n\
2251argv -- command line arguments; argv[0] is the script pathname if known\n\
2252path -- module search path; path[0] is the script directory, else ''\n\
2253modules -- dictionary of loaded modules\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002254\n\
2255displayhook -- called to show results in an interactive session\n\
2256excepthook -- called to handle any uncaught exception other than SystemExit\n\
2257 To customize printing in an interactive session or to install a custom\n\
2258 top-level exception handler, assign other functions to replace these.\n\
2259\n\
Benjamin Peterson06157a42008-07-15 00:28:36 +00002260stdin -- standard input file object; used by input()\n\
Georg Brandl88fc6642007-02-09 21:28:07 +00002261stdout -- standard output file object; used by print()\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002262stderr -- standard error object; used for error messages\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002263 By assigning other file objects (or objects that behave like files)\n\
2264 to these, it is possible to redirect all of the interpreter's I/O.\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002265\n\
2266last_type -- type of last uncaught exception\n\
2267last_value -- value of last uncaught exception\n\
2268last_traceback -- traceback of last uncaught exception\n\
2269 These three are only available in an interactive session after a\n\
2270 traceback has been printed.\n\
Guido van Rossuma71b5f41999-01-14 19:07:00 +00002271"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002272)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002273/* concatenating string here */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002274PyDoc_STR(
Guido van Rossuma71b5f41999-01-14 19:07:00 +00002275"\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002276Static objects:\n\
2277\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002278builtin_module_names -- tuple of module names built into this interpreter\n\
2279copyright -- copyright notice pertaining to this interpreter\n\
2280exec_prefix -- prefix used to find the machine-specific Python library\n\
Petri Lehtinen4b0eab62012-02-02 21:23:15 +02002281executable -- absolute path of the executable binary of the Python interpreter\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07002282float_info -- a named tuple with information about the float implementation.\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002283float_repr_style -- string indicating the style of repr() output for floats\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07002284hash_info -- a named tuple with information about the hash algorithm.\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002285hexversion -- version information encoded as a single integer\n\
Barry Warsaw409da152012-06-03 16:18:47 -04002286implementation -- Python implementation information.\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07002287int_info -- a named tuple with information about the int implementation.\n\
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002288maxsize -- the largest supported length of containers.\n\
Serhiy Storchakad3faf432015-01-18 11:28:37 +02002289maxunicode -- the value of the largest Unicode code point\n\
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002290platform -- platform identifier\n\
2291prefix -- prefix used to find the Python library\n\
Raymond Hettinger71170742019-09-11 07:17:32 -07002292thread_info -- a named tuple with information about the thread implementation.\n\
Fred Drake801c08d2000-04-13 15:29:10 +00002293version -- the version of this interpreter as a string\n\
Eric Smith0e5b5622009-02-06 01:32:42 +00002294version_info -- version information as a named tuple\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002295"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002296)
Steve Dowercc16be82016-09-08 10:35:16 -07002297#ifdef MS_COREDLL
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002298/* concatenating string here */
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002299PyDoc_STR(
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002300"dllhandle -- [Windows only] integer handle of the Python DLL\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002301winver -- [Windows only] version number of the Python DLL\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002302"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002303)
Steve Dowercc16be82016-09-08 10:35:16 -07002304#endif /* MS_COREDLL */
2305#ifdef MS_WINDOWS
2306/* concatenating string here */
2307PyDoc_STR(
oldkaa0735f2018-02-02 16:52:55 +08002308"_enablelegacywindowsfsencoding -- [Windows only]\n\
Steve Dowercc16be82016-09-08 10:35:16 -07002309"
2310)
2311#endif
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002312PyDoc_STR(
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002313"__stdin__ -- the original stdin; don't touch!\n\
2314__stdout__ -- the original stdout; don't touch!\n\
2315__stderr__ -- the original stderr; don't touch!\n\
2316__displayhook__ -- the original displayhook; don't touch!\n\
2317__excepthook__ -- the original excepthook; don't touch!\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002318\n\
2319Functions:\n\
2320\n\
Georg Brandl1a3284e2007-12-02 09:40:06 +00002321displayhook() -- print an object to the screen, and save it in builtins._\n\
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00002322excepthook() -- print an exception and its traceback to sys.stderr\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002323exc_info() -- return thread-safe information about the current exception\n\
2324exit() -- exit the interpreter by raising SystemExit\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +00002325getdlopenflags() -- returns flags to be used for dlopen() calls\n\
Christian Heimes9bd667a2008-01-20 15:14:11 +00002326getprofile() -- get the global profiling function\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002327getrefcount() -- return the reference count for an object (plus one :-)\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00002328getrecursionlimit() -- return the max recursion depth for the interpreter\n\
Martin v. Löwis00709aa2008-06-04 14:18:43 +00002329getsizeof() -- return the size of an object in bytes\n\
Christian Heimes9bd667a2008-01-20 15:14:11 +00002330gettrace() -- get the global debug tracing function\n\
Martin v. Löwisf0473d52001-07-18 16:17:16 +00002331setdlopenflags() -- set the flags to be used for dlopen() calls\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002332setprofile() -- set the global profiling function\n\
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +00002333setrecursionlimit() -- set the max recursion depth for the interpreter\n\
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002334settrace() -- set the global debug tracing function\n\
Fred Drakeccede592000-08-14 20:59:57 +00002335"
Martin v. Löwisa3fb4f72002-06-09 13:33:54 +00002336)
Fred Drakeccede592000-08-14 20:59:57 +00002337/* end of sys_doc */ ;
Guido van Rossumc3bc31e1998-06-27 19:43:25 +00002338
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002339
2340PyDoc_STRVAR(flags__doc__,
2341"sys.flags\n\
2342\n\
2343Flags provided through command line arguments or environment vars.");
2344
2345static PyTypeObject FlagsType;
2346
2347static PyStructSequence_Field flags_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 {"debug", "-d"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 {"inspect", "-i"},
2350 {"interactive", "-i"},
2351 {"optimize", "-O or -OO"},
2352 {"dont_write_bytecode", "-B"},
2353 {"no_user_site", "-s"},
2354 {"no_site", "-S"},
2355 {"ignore_environment", "-E"},
2356 {"verbose", "-v"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 /* {"unbuffered", "-u"}, */
2358 /* {"skip_first", "-x"}, */
Georg Brandl8aa7e992010-12-28 18:30:18 +00002359 {"bytes_warning", "-b"},
2360 {"quiet", "-q"},
Georg Brandl09a7c722012-02-20 21:31:46 +01002361 {"hash_randomization", "-R"},
Christian Heimesad73a9c2013-08-10 16:36:18 +02002362 {"isolated", "-I"},
Victor Stinner5e3806f2017-11-30 11:40:24 +01002363 {"dev_mode", "-X dev"},
Victor Stinner91106cd2017-12-13 12:29:09 +01002364 {"utf8_mode", "-X utf8"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 {0}
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002366};
2367
2368static PyStructSequence_Desc flags_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 "sys.flags", /* name */
2370 flags__doc__, /* doc */
2371 flags_fields, /* fields */
Victor Stinner91106cd2017-12-13 12:29:09 +01002372 15
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002373};
2374
2375static PyObject*
Victor Stinner01b1cc12019-11-20 02:27:56 +01002376make_flags(PyThreadState *tstate)
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002377{
Victor Stinner01b1cc12019-11-20 02:27:56 +01002378 PyInterpreterState *interp = tstate->interp;
2379 const PyPreConfig *preconfig = &interp->runtime->preconfig;
2380 const PyConfig *config = &interp->config;
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002381
Victor Stinner01b1cc12019-11-20 02:27:56 +01002382 PyObject *seq = PyStructSequence_New(&FlagsType);
2383 if (seq == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 return NULL;
Victor Stinner01b1cc12019-11-20 02:27:56 +01002385 }
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002386
Victor Stinner01b1cc12019-11-20 02:27:56 +01002387 int pos = 0;
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002388#define SetFlag(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag))
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002390
Victor Stinnerfbca9082018-08-30 00:50:45 +02002391 SetFlag(config->parser_debug);
2392 SetFlag(config->inspect);
2393 SetFlag(config->interactive);
2394 SetFlag(config->optimization_level);
2395 SetFlag(!config->write_bytecode);
2396 SetFlag(!config->user_site_directory);
2397 SetFlag(!config->site_import);
Victor Stinner20004952019-03-26 02:31:11 +01002398 SetFlag(!config->use_environment);
Victor Stinnerfbca9082018-08-30 00:50:45 +02002399 SetFlag(config->verbose);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 /* SetFlag(saw_unbuffered_flag); */
2401 /* SetFlag(skipfirstline); */
Victor Stinnerfbca9082018-08-30 00:50:45 +02002402 SetFlag(config->bytes_warning);
2403 SetFlag(config->quiet);
2404 SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0);
Victor Stinner20004952019-03-26 02:31:11 +01002405 SetFlag(config->isolated);
2406 PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode));
2407 SetFlag(preconfig->utf8_mode);
Victor Stinner91106cd2017-12-13 12:29:09 +01002408#undef SetFlag
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002409
Victor Stinner838f2642019-06-13 22:41:23 +02002410 if (_PyErr_Occurred(tstate)) {
Serhiy Storchaka87a854d2013-12-17 14:59:42 +02002411 Py_DECREF(seq);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 return NULL;
2413 }
2414 return seq;
Christian Heimesd32ed6f2008-01-14 18:49:24 +00002415}
2416
Eric Smith0e5b5622009-02-06 01:32:42 +00002417PyDoc_STRVAR(version_info__doc__,
2418"sys.version_info\n\
2419\n\
2420Version information as a named tuple.");
2421
2422static PyTypeObject VersionInfoType;
2423
2424static PyStructSequence_Field version_info_fields[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 {"major", "Major release number"},
2426 {"minor", "Minor release number"},
2427 {"micro", "Patch release number"},
Ned Deilyda4887a2016-11-04 17:03:34 -04002428 {"releaselevel", "'alpha', 'beta', 'candidate', or 'final'"},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 {"serial", "Serial release number"},
2430 {0}
Eric Smith0e5b5622009-02-06 01:32:42 +00002431};
2432
2433static PyStructSequence_Desc version_info_desc = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 "sys.version_info", /* name */
2435 version_info__doc__, /* doc */
2436 version_info_fields, /* fields */
2437 5
Eric Smith0e5b5622009-02-06 01:32:42 +00002438};
2439
2440static PyObject *
Victor Stinner838f2642019-06-13 22:41:23 +02002441make_version_info(PyThreadState *tstate)
Eric Smith0e5b5622009-02-06 01:32:42 +00002442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 PyObject *version_info;
2444 char *s;
2445 int pos = 0;
Eric Smith0e5b5622009-02-06 01:32:42 +00002446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 version_info = PyStructSequence_New(&VersionInfoType);
2448 if (version_info == NULL) {
2449 return NULL;
2450 }
Eric Smith0e5b5622009-02-06 01:32:42 +00002451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 /*
2453 * These release level checks are mutually exclusive and cover
2454 * the field, so don't get too fancy with the pre-processor!
2455 */
Eric Smith0e5b5622009-02-06 01:32:42 +00002456#if PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_ALPHA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 s = "alpha";
Eric Smith0e5b5622009-02-06 01:32:42 +00002458#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_BETA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 s = "beta";
Eric Smith0e5b5622009-02-06 01:32:42 +00002460#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_GAMMA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002461 s = "candidate";
Eric Smith0e5b5622009-02-06 01:32:42 +00002462#elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 s = "final";
Eric Smith0e5b5622009-02-06 01:32:42 +00002464#endif
2465
2466#define SetIntItem(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 PyStructSequence_SET_ITEM(version_info, pos++, PyLong_FromLong(flag))
Eric Smith0e5b5622009-02-06 01:32:42 +00002468#define SetStrItem(flag) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 PyStructSequence_SET_ITEM(version_info, pos++, PyUnicode_FromString(flag))
Eric Smith0e5b5622009-02-06 01:32:42 +00002470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 SetIntItem(PY_MAJOR_VERSION);
2472 SetIntItem(PY_MINOR_VERSION);
2473 SetIntItem(PY_MICRO_VERSION);
2474 SetStrItem(s);
2475 SetIntItem(PY_RELEASE_SERIAL);
Eric Smith0e5b5622009-02-06 01:32:42 +00002476#undef SetIntItem
2477#undef SetStrItem
2478
Victor Stinner838f2642019-06-13 22:41:23 +02002479 if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 Py_CLEAR(version_info);
2481 return NULL;
2482 }
2483 return version_info;
Eric Smith0e5b5622009-02-06 01:32:42 +00002484}
2485
Brett Cannon3adc7b72012-07-09 14:22:12 -04002486/* sys.implementation values */
2487#define NAME "cpython"
2488const char *_PySys_ImplName = NAME;
Victor Stinnercf01b682015-11-05 11:21:38 +01002489#define MAJOR Py_STRINGIFY(PY_MAJOR_VERSION)
2490#define MINOR Py_STRINGIFY(PY_MINOR_VERSION)
Ned Deily529ea5d2014-06-30 23:31:14 -07002491#define TAG NAME "-" MAJOR MINOR
Brett Cannon3adc7b72012-07-09 14:22:12 -04002492const char *_PySys_ImplCacheTag = TAG;
2493#undef NAME
Brett Cannon3adc7b72012-07-09 14:22:12 -04002494#undef MAJOR
2495#undef MINOR
2496#undef TAG
2497
Barry Warsaw409da152012-06-03 16:18:47 -04002498static PyObject *
2499make_impl_info(PyObject *version_info)
2500{
2501 int res;
2502 PyObject *impl_info, *value, *ns;
2503
2504 impl_info = PyDict_New();
2505 if (impl_info == NULL)
2506 return NULL;
2507
2508 /* populate the dict */
2509
Brett Cannon3adc7b72012-07-09 14:22:12 -04002510 value = PyUnicode_FromString(_PySys_ImplName);
Barry Warsaw409da152012-06-03 16:18:47 -04002511 if (value == NULL)
2512 goto error;
2513 res = PyDict_SetItemString(impl_info, "name", value);
2514 Py_DECREF(value);
2515 if (res < 0)
2516 goto error;
2517
Brett Cannon3adc7b72012-07-09 14:22:12 -04002518 value = PyUnicode_FromString(_PySys_ImplCacheTag);
Barry Warsaw409da152012-06-03 16:18:47 -04002519 if (value == NULL)
2520 goto error;
2521 res = PyDict_SetItemString(impl_info, "cache_tag", value);
2522 Py_DECREF(value);
2523 if (res < 0)
2524 goto error;
Barry Warsaw409da152012-06-03 16:18:47 -04002525
2526 res = PyDict_SetItemString(impl_info, "version", version_info);
2527 if (res < 0)
2528 goto error;
2529
2530 value = PyLong_FromLong(PY_VERSION_HEX);
2531 if (value == NULL)
2532 goto error;
2533 res = PyDict_SetItemString(impl_info, "hexversion", value);
2534 Py_DECREF(value);
2535 if (res < 0)
2536 goto error;
2537
doko@ubuntu.com55532312016-06-14 08:55:19 +02002538#ifdef MULTIARCH
2539 value = PyUnicode_FromString(MULTIARCH);
2540 if (value == NULL)
2541 goto error;
2542 res = PyDict_SetItemString(impl_info, "_multiarch", value);
2543 Py_DECREF(value);
2544 if (res < 0)
2545 goto error;
2546#endif
2547
Barry Warsaw409da152012-06-03 16:18:47 -04002548 /* dict ready */
2549
2550 ns = _PyNamespace_New(impl_info);
2551 Py_DECREF(impl_info);
2552 return ns;
2553
2554error:
2555 Py_CLEAR(impl_info);
2556 return NULL;
2557}
2558
Martin v. Löwis1a214512008-06-11 05:26:20 +00002559static struct PyModuleDef sysmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 PyModuleDef_HEAD_INIT,
2561 "sys",
2562 sys_doc,
2563 -1, /* multiple "initialization" just copies the module dict. */
2564 sys_methods,
2565 NULL,
2566 NULL,
2567 NULL,
2568 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002569};
2570
Eric Snow6b4be192017-05-22 21:36:03 -07002571/* Updating the sys namespace, returning NULL pointer on error */
Victor Stinner8fea2522013-10-27 17:15:42 +01002572#define SET_SYS_FROM_STRING_BORROW(key, value) \
Victor Stinner58049602013-07-22 22:40:00 +02002573 do { \
Victor Stinner58049602013-07-22 22:40:00 +02002574 PyObject *v = (value); \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002575 if (v == NULL) { \
2576 goto err_occurred; \
2577 } \
Victor Stinner58049602013-07-22 22:40:00 +02002578 res = PyDict_SetItemString(sysdict, key, v); \
2579 if (res < 0) { \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002580 goto err_occurred; \
Victor Stinner8fea2522013-10-27 17:15:42 +01002581 } \
2582 } while (0)
2583#define SET_SYS_FROM_STRING(key, value) \
2584 do { \
Victor Stinner8fea2522013-10-27 17:15:42 +01002585 PyObject *v = (value); \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002586 if (v == NULL) { \
2587 goto err_occurred; \
2588 } \
Victor Stinner8fea2522013-10-27 17:15:42 +01002589 res = PyDict_SetItemString(sysdict, key, v); \
2590 Py_DECREF(v); \
2591 if (res < 0) { \
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002592 goto err_occurred; \
Victor Stinner58049602013-07-22 22:40:00 +02002593 } \
2594 } while (0)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002595
Victor Stinner331a6a52019-05-27 16:39:22 +02002596static PyStatus
Victor Stinner01b1cc12019-11-20 02:27:56 +01002597_PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
Eric Snow6b4be192017-05-22 21:36:03 -07002598{
Victor Stinnerab672812019-01-23 15:04:40 +01002599 PyObject *version_info;
Eric Snow6b4be192017-05-22 21:36:03 -07002600 int res;
2601
Nick Coghland6009512014-11-20 21:39:37 +10002602 /* stdin/stdout/stderr are set in pylifecycle.c */
Martin v. Löwis5467d4c2003-05-10 07:10:12 +00002603
Victor Stinner8fea2522013-10-27 17:15:42 +01002604 SET_SYS_FROM_STRING_BORROW("__displayhook__",
2605 PyDict_GetItemString(sysdict, "displayhook"));
2606 SET_SYS_FROM_STRING_BORROW("__excepthook__",
2607 PyDict_GetItemString(sysdict, "excepthook"));
Barry Warsaw36c1d1f2017-10-05 12:11:18 -04002608 SET_SYS_FROM_STRING_BORROW(
2609 "__breakpointhook__",
2610 PyDict_GetItemString(sysdict, "breakpointhook"));
Victor Stinneref9d9b62019-05-22 11:28:22 +02002611 SET_SYS_FROM_STRING_BORROW("__unraisablehook__",
2612 PyDict_GetItemString(sysdict, "unraisablehook"));
2613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 SET_SYS_FROM_STRING("version",
2615 PyUnicode_FromString(Py_GetVersion()));
2616 SET_SYS_FROM_STRING("hexversion",
2617 PyLong_FromLong(PY_VERSION_HEX));
Ned Deily5c4b0d02017-03-04 00:19:55 -05002618 SET_SYS_FROM_STRING("_git",
2619 Py_BuildValue("(szz)", "CPython", _Py_gitidentifier(),
2620 _Py_gitversion()));
INADA Naoki6b42eb12017-06-29 15:31:38 +09002621 SET_SYS_FROM_STRING("_framework", PyUnicode_FromString(_PYTHONFRAMEWORK));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 SET_SYS_FROM_STRING("api_version",
2623 PyLong_FromLong(PYTHON_API_VERSION));
2624 SET_SYS_FROM_STRING("copyright",
2625 PyUnicode_FromString(Py_GetCopyright()));
2626 SET_SYS_FROM_STRING("platform",
2627 PyUnicode_FromString(Py_GetPlatform()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 SET_SYS_FROM_STRING("maxsize",
2629 PyLong_FromSsize_t(PY_SSIZE_T_MAX));
2630 SET_SYS_FROM_STRING("float_info",
2631 PyFloat_GetInfo());
2632 SET_SYS_FROM_STRING("int_info",
2633 PyLong_GetInfo());
Mark Dickinsondc787d22010-05-23 13:33:13 +00002634 /* initialize hash_info */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002635 if (Hash_InfoType.tp_name == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002636 if (PyStructSequence_InitType2(&Hash_InfoType, &hash_info_desc) < 0) {
2637 goto type_init_failed;
2638 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02002639 }
Mark Dickinsondc787d22010-05-23 13:33:13 +00002640 SET_SYS_FROM_STRING("hash_info",
Victor Stinner838f2642019-06-13 22:41:23 +02002641 get_hash_info(tstate));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 SET_SYS_FROM_STRING("maxunicode",
Ezio Melotti48a2f8f2011-09-29 00:18:19 +03002643 PyLong_FromLong(0x10FFFF));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 SET_SYS_FROM_STRING("builtin_module_names",
2645 list_builtin_module_names());
Christian Heimes743e0cd2012-10-17 23:52:17 +02002646#if PY_BIG_ENDIAN
2647 SET_SYS_FROM_STRING("byteorder",
2648 PyUnicode_FromString("big"));
2649#else
2650 SET_SYS_FROM_STRING("byteorder",
2651 PyUnicode_FromString("little"));
2652#endif
Fred Drake099325e2000-08-14 15:47:03 +00002653
Guido van Rossum8b9ea871996-08-23 18:14:47 +00002654#ifdef MS_COREDLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 SET_SYS_FROM_STRING("dllhandle",
2656 PyLong_FromVoidPtr(PyWin_DLLhModule));
2657 SET_SYS_FROM_STRING("winver",
2658 PyUnicode_FromString(PyWin_DLLVersionString));
Guido van Rossumc606fe11996-04-09 02:37:57 +00002659#endif
Barry Warsaw8cf4eae2010-10-16 01:04:07 +00002660#ifdef ABIFLAGS
2661 SET_SYS_FROM_STRING("abiflags",
2662 PyUnicode_FromString(ABIFLAGS));
2663#endif
Antoine Pitrou9583cac2010-10-21 13:42:28 +00002664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 /* version_info */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002666 if (VersionInfoType.tp_name == NULL) {
2667 if (PyStructSequence_InitType2(&VersionInfoType,
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002668 &version_info_desc) < 0) {
2669 goto type_init_failed;
2670 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02002671 }
Victor Stinner838f2642019-06-13 22:41:23 +02002672 version_info = make_version_info(tstate);
Barry Warsaw409da152012-06-03 16:18:47 -04002673 SET_SYS_FROM_STRING("version_info", version_info);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 /* prevent user from creating new instances */
2675 VersionInfoType.tp_init = NULL;
2676 VersionInfoType.tp_new = NULL;
Antoine Pitrou871dfc42014-04-28 13:07:06 +02002677 res = PyDict_DelItemString(VersionInfoType.tp_dict, "__new__");
Victor Stinner838f2642019-06-13 22:41:23 +02002678 if (res < 0 && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2679 _PyErr_Clear(tstate);
2680 }
Eric Smith0e5b5622009-02-06 01:32:42 +00002681
Barry Warsaw409da152012-06-03 16:18:47 -04002682 /* implementation */
2683 SET_SYS_FROM_STRING("implementation", make_impl_info(version_info));
2684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 /* flags */
Victor Stinner1c8f0592013-07-22 22:24:54 +02002686 if (FlagsType.tp_name == 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002687 if (PyStructSequence_InitType2(&FlagsType, &flags_desc) < 0) {
2688 goto type_init_failed;
2689 }
Victor Stinner1c8f0592013-07-22 22:24:54 +02002690 }
Victor Stinner43125222019-04-24 18:23:53 +02002691 /* Set flags to their default values (updated by _PySys_InitMain()) */
Victor Stinner01b1cc12019-11-20 02:27:56 +01002692 SET_SYS_FROM_STRING("flags", make_flags(tstate));
Eric Smithf7bb5782010-01-27 00:44:57 +00002693
2694#if defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 /* getwindowsversion */
2696 if (WindowsVersionType.tp_name == 0)
Victor Stinner1c8f0592013-07-22 22:24:54 +02002697 if (PyStructSequence_InitType2(&WindowsVersionType,
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002698 &windows_version_desc) < 0) {
2699 goto type_init_failed;
2700 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 /* prevent user from creating new instances */
2702 WindowsVersionType.tp_init = NULL;
2703 WindowsVersionType.tp_new = NULL;
Victor Stinner838f2642019-06-13 22:41:23 +02002704 assert(!_PyErr_Occurred(tstate));
Antoine Pitrou871dfc42014-04-28 13:07:06 +02002705 res = PyDict_DelItemString(WindowsVersionType.tp_dict, "__new__");
Victor Stinner838f2642019-06-13 22:41:23 +02002706 if (res < 0 && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
2707 _PyErr_Clear(tstate);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002708 }
Eric Smithf7bb5782010-01-27 00:44:57 +00002709#endif
2710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 /* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00002712#ifndef PY_NO_SHORT_FLOAT_REPR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 SET_SYS_FROM_STRING("float_repr_style",
2714 PyUnicode_FromString("short"));
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00002715#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 SET_SYS_FROM_STRING("float_repr_style",
2717 PyUnicode_FromString("legacy"));
Mark Dickinsonb08a53a2009-04-16 19:52:09 +00002718#endif
2719
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002720 SET_SYS_FROM_STRING("thread_info", PyThread_GetInfo());
Victor Stinnerd5c355c2011-04-30 14:53:09 +02002721
Yury Selivanoveb636452016-09-08 22:01:51 -07002722 /* initialize asyncgen_hooks */
2723 if (AsyncGenHooksType.tp_name == NULL) {
2724 if (PyStructSequence_InitType2(
2725 &AsyncGenHooksType, &asyncgen_hooks_desc) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002726 goto type_init_failed;
Yury Selivanoveb636452016-09-08 22:01:51 -07002727 }
2728 }
2729
Victor Stinner838f2642019-06-13 22:41:23 +02002730 if (_PyErr_Occurred(tstate)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002731 goto err_occurred;
2732 }
Victor Stinner331a6a52019-05-27 16:39:22 +02002733 return _PyStatus_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002734
2735type_init_failed:
Victor Stinner331a6a52019-05-27 16:39:22 +02002736 return _PyStatus_ERR("failed to initialize a type");
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002737
2738err_occurred:
Victor Stinner331a6a52019-05-27 16:39:22 +02002739 return _PyStatus_ERR("can't initialize sys module");
Guido van Rossum5b3138b1990-11-18 17:41:40 +00002740}
2741
Eric Snow6b4be192017-05-22 21:36:03 -07002742#undef SET_SYS_FROM_STRING
Eric Snow6b4be192017-05-22 21:36:03 -07002743
2744/* Updating the sys namespace, returning integer error codes */
Eric Snow6b4be192017-05-22 21:36:03 -07002745#define SET_SYS_FROM_STRING_INT_RESULT(key, value) \
2746 do { \
2747 PyObject *v = (value); \
2748 if (v == NULL) \
2749 return -1; \
2750 res = PyDict_SetItemString(sysdict, key, v); \
2751 Py_DECREF(v); \
2752 if (res < 0) { \
2753 return res; \
2754 } \
2755 } while (0)
2756
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002757
2758static int
2759sys_add_xoption(PyObject *opts, const wchar_t *s)
2760{
2761 PyObject *name, *value;
2762
2763 const wchar_t *name_end = wcschr(s, L'=');
2764 if (!name_end) {
2765 name = PyUnicode_FromWideChar(s, -1);
2766 value = Py_True;
2767 Py_INCREF(value);
2768 }
2769 else {
2770 name = PyUnicode_FromWideChar(s, name_end - s);
2771 value = PyUnicode_FromWideChar(name_end + 1, -1);
2772 }
2773 if (name == NULL || value == NULL) {
2774 goto error;
2775 }
2776 if (PyDict_SetItem(opts, name, value) < 0) {
2777 goto error;
2778 }
2779 Py_DECREF(name);
2780 Py_DECREF(value);
2781 return 0;
2782
2783error:
2784 Py_XDECREF(name);
2785 Py_XDECREF(value);
2786 return -1;
2787}
2788
2789
2790static PyObject*
Victor Stinner331a6a52019-05-27 16:39:22 +02002791sys_create_xoptions_dict(const PyConfig *config)
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002792{
2793 Py_ssize_t nxoption = config->xoptions.length;
2794 wchar_t * const * xoptions = config->xoptions.items;
2795 PyObject *dict = PyDict_New();
2796 if (dict == NULL) {
2797 return NULL;
2798 }
2799
2800 for (Py_ssize_t i=0; i < nxoption; i++) {
2801 const wchar_t *option = xoptions[i];
2802 if (sys_add_xoption(dict, option) < 0) {
2803 Py_DECREF(dict);
2804 return NULL;
2805 }
2806 }
2807
2808 return dict;
2809}
2810
2811
Eric Snow6b4be192017-05-22 21:36:03 -07002812int
Victor Stinner01b1cc12019-11-20 02:27:56 +01002813_PySys_InitMain(PyThreadState *tstate)
Eric Snow6b4be192017-05-22 21:36:03 -07002814{
Victor Stinner838f2642019-06-13 22:41:23 +02002815 PyObject *sysdict = tstate->interp->sysdict;
2816 const PyConfig *config = &tstate->interp->config;
Eric Snow6b4be192017-05-22 21:36:03 -07002817 int res;
2818
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002819#define COPY_LIST(KEY, VALUE) \
Victor Stinner37cd9822018-11-16 11:55:35 +01002820 do { \
Victor Stinner331a6a52019-05-27 16:39:22 +02002821 PyObject *list = _PyWideStringList_AsList(&(VALUE)); \
Victor Stinner37cd9822018-11-16 11:55:35 +01002822 if (list == NULL) { \
2823 return -1; \
2824 } \
2825 SET_SYS_FROM_STRING_BORROW(KEY, list); \
2826 Py_DECREF(list); \
2827 } while (0)
2828
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002829#define SET_SYS_FROM_WSTR(KEY, VALUE) \
2830 do { \
2831 PyObject *str = PyUnicode_FromWideChar(VALUE, -1); \
2832 if (str == NULL) { \
2833 return -1; \
2834 } \
2835 SET_SYS_FROM_STRING_BORROW(KEY, str); \
2836 Py_DECREF(str); \
2837 } while (0)
Victor Stinner37cd9822018-11-16 11:55:35 +01002838
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002839 COPY_LIST("path", config->module_search_paths);
2840
2841 SET_SYS_FROM_WSTR("executable", config->executable);
Steve Dower9048c492019-06-29 10:34:11 -07002842 SET_SYS_FROM_WSTR("_base_executable", config->base_executable);
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002843 SET_SYS_FROM_WSTR("prefix", config->prefix);
2844 SET_SYS_FROM_WSTR("base_prefix", config->base_prefix);
2845 SET_SYS_FROM_WSTR("exec_prefix", config->exec_prefix);
2846 SET_SYS_FROM_WSTR("base_exec_prefix", config->base_exec_prefix);
Victor Stinner41264f12017-12-15 02:05:29 +01002847
Carl Meyerb193fa92018-06-15 22:40:56 -06002848 if (config->pycache_prefix != NULL) {
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002849 SET_SYS_FROM_WSTR("pycache_prefix", config->pycache_prefix);
Carl Meyerb193fa92018-06-15 22:40:56 -06002850 } else {
2851 PyDict_SetItemString(sysdict, "pycache_prefix", Py_None);
2852 }
2853
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002854 COPY_LIST("argv", config->argv);
2855 COPY_LIST("warnoptions", config->warnoptions);
2856
2857 PyObject *xoptions = sys_create_xoptions_dict(config);
2858 if (xoptions == NULL) {
2859 return -1;
Victor Stinner41264f12017-12-15 02:05:29 +01002860 }
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002861 SET_SYS_FROM_STRING_BORROW("_xoptions", xoptions);
Pablo Galindo34ef64f2019-03-27 12:43:47 +00002862 Py_DECREF(xoptions);
Victor Stinner41264f12017-12-15 02:05:29 +01002863
Victor Stinner37cd9822018-11-16 11:55:35 +01002864#undef COPY_LIST
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002865#undef SET_SYS_FROM_WSTR
Victor Stinner37cd9822018-11-16 11:55:35 +01002866
Eric Snow6b4be192017-05-22 21:36:03 -07002867 /* Set flags to their final values */
Victor Stinner01b1cc12019-11-20 02:27:56 +01002868 SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(tstate));
Eric Snow6b4be192017-05-22 21:36:03 -07002869 /* prevent user from creating new instances */
2870 FlagsType.tp_init = NULL;
2871 FlagsType.tp_new = NULL;
2872 res = PyDict_DelItemString(FlagsType.tp_dict, "__new__");
2873 if (res < 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02002874 if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {
Eric Snow6b4be192017-05-22 21:36:03 -07002875 return res;
2876 }
Victor Stinner838f2642019-06-13 22:41:23 +02002877 _PyErr_Clear(tstate);
Eric Snow6b4be192017-05-22 21:36:03 -07002878 }
2879
2880 SET_SYS_FROM_STRING_INT_RESULT("dont_write_bytecode",
Victor Stinner8b9dbc02019-03-27 01:36:16 +01002881 PyBool_FromLong(!config->write_bytecode));
Eric Snow6b4be192017-05-22 21:36:03 -07002882
Victor Stinner838f2642019-06-13 22:41:23 +02002883 if (get_warnoptions(tstate) == NULL) {
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002884 return -1;
Victor Stinner838f2642019-06-13 22:41:23 +02002885 }
Victor Stinner865de272017-06-08 13:27:47 +02002886
Victor Stinner838f2642019-06-13 22:41:23 +02002887 if (get_xoptions(tstate) == NULL)
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002888 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -07002889
Victor Stinner838f2642019-06-13 22:41:23 +02002890 if (_PyErr_Occurred(tstate)) {
2891 goto err_occurred;
2892 }
2893
Eric Snow6b4be192017-05-22 21:36:03 -07002894 return 0;
Victor Stinner41264f12017-12-15 02:05:29 +01002895
2896err_occurred:
2897 return -1;
Eric Snow6b4be192017-05-22 21:36:03 -07002898}
2899
Victor Stinner41264f12017-12-15 02:05:29 +01002900#undef SET_SYS_FROM_STRING_BORROW
Eric Snow6b4be192017-05-22 21:36:03 -07002901#undef SET_SYS_FROM_STRING_INT_RESULT
Eric Snow6b4be192017-05-22 21:36:03 -07002902
Victor Stinnerab672812019-01-23 15:04:40 +01002903
2904/* Set up a preliminary stderr printer until we have enough
2905 infrastructure for the io module in place.
2906
2907 Use UTF-8/surrogateescape and ignore EAGAIN errors. */
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002908static PyStatus
Victor Stinnerab672812019-01-23 15:04:40 +01002909_PySys_SetPreliminaryStderr(PyObject *sysdict)
2910{
2911 PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr));
2912 if (pstderr == NULL) {
2913 goto error;
2914 }
2915 if (_PyDict_SetItemId(sysdict, &PyId_stderr, pstderr) < 0) {
2916 goto error;
2917 }
2918 if (PyDict_SetItemString(sysdict, "__stderr__", pstderr) < 0) {
2919 goto error;
2920 }
2921 Py_DECREF(pstderr);
Victor Stinner331a6a52019-05-27 16:39:22 +02002922 return _PyStatus_OK();
Victor Stinnerab672812019-01-23 15:04:40 +01002923
2924error:
2925 Py_XDECREF(pstderr);
Victor Stinner331a6a52019-05-27 16:39:22 +02002926 return _PyStatus_ERR("can't set preliminary stderr");
Victor Stinnerab672812019-01-23 15:04:40 +01002927}
2928
2929
2930/* Create sys module without all attributes: _PySys_InitMain() should be called
2931 later to add remaining attributes. */
Victor Stinner331a6a52019-05-27 16:39:22 +02002932PyStatus
Victor Stinner01b1cc12019-11-20 02:27:56 +01002933_PySys_Create(PyThreadState *tstate, PyObject **sysmod_p)
Victor Stinnerab672812019-01-23 15:04:40 +01002934{
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002935 assert(!_PyErr_Occurred(tstate));
2936
Victor Stinnerb45d2592019-06-20 00:05:23 +02002937 PyInterpreterState *interp = tstate->interp;
Victor Stinner838f2642019-06-13 22:41:23 +02002938
Victor Stinnerab672812019-01-23 15:04:40 +01002939 PyObject *modules = PyDict_New();
2940 if (modules == NULL) {
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002941 goto error;
Victor Stinnerab672812019-01-23 15:04:40 +01002942 }
2943 interp->modules = modules;
2944
2945 PyObject *sysmod = _PyModule_CreateInitialized(&sysmodule, PYTHON_API_VERSION);
2946 if (sysmod == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +02002947 return _PyStatus_ERR("failed to create a module object");
Victor Stinnerab672812019-01-23 15:04:40 +01002948 }
2949
2950 PyObject *sysdict = PyModule_GetDict(sysmod);
2951 if (sysdict == NULL) {
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002952 goto error;
Victor Stinnerab672812019-01-23 15:04:40 +01002953 }
2954 Py_INCREF(sysdict);
2955 interp->sysdict = sysdict;
2956
2957 if (PyDict_SetItemString(sysdict, "modules", interp->modules) < 0) {
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002958 goto error;
Victor Stinnerab672812019-01-23 15:04:40 +01002959 }
2960
Victor Stinner331a6a52019-05-27 16:39:22 +02002961 PyStatus status = _PySys_SetPreliminaryStderr(sysdict);
2962 if (_PyStatus_EXCEPTION(status)) {
2963 return status;
Victor Stinnerab672812019-01-23 15:04:40 +01002964 }
2965
Victor Stinner01b1cc12019-11-20 02:27:56 +01002966 status = _PySys_InitCore(tstate, sysdict);
Victor Stinner331a6a52019-05-27 16:39:22 +02002967 if (_PyStatus_EXCEPTION(status)) {
2968 return status;
Victor Stinnerab672812019-01-23 15:04:40 +01002969 }
2970
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002971 if (_PyImport_FixupBuiltin(sysmod, "sys", interp->modules) < 0) {
2972 goto error;
2973 }
2974
2975 assert(!_PyErr_Occurred(tstate));
Victor Stinnerab672812019-01-23 15:04:40 +01002976
2977 *sysmod_p = sysmod;
Victor Stinner331a6a52019-05-27 16:39:22 +02002978 return _PyStatus_OK();
Victor Stinner81fe5bd2019-12-06 02:43:30 +01002979
2980error:
2981 return _PyStatus_ERR("can't initialize sys module");
Victor Stinnerab672812019-01-23 15:04:40 +01002982}
2983
2984
Guido van Rossum65bf9f21997-04-29 18:33:38 +00002985static PyObject *
Martin v. Löwis790465f2008-04-05 20:41:37 +00002986makepathobject(const wchar_t *path, wchar_t delim)
Guido van Rossum5b3138b1990-11-18 17:41:40 +00002987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 int i, n;
2989 const wchar_t *p;
2990 PyObject *v, *w;
Tim Peters216b78b2006-01-06 02:40:53 +00002991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002992 n = 1;
2993 p = path;
2994 while ((p = wcschr(p, delim)) != NULL) {
2995 n++;
2996 p++;
2997 }
2998 v = PyList_New(n);
2999 if (v == NULL)
3000 return NULL;
3001 for (i = 0; ; i++) {
3002 p = wcschr(path, delim);
3003 if (p == NULL)
3004 p = path + wcslen(path); /* End of string */
3005 w = PyUnicode_FromWideChar(path, (Py_ssize_t)(p - path));
3006 if (w == NULL) {
3007 Py_DECREF(v);
3008 return NULL;
3009 }
Zackery Spytz99d56b52018-12-08 07:16:55 -07003010 PyList_SET_ITEM(v, i, w);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 if (*p == '\0')
3012 break;
3013 path = p+1;
3014 }
3015 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003016}
3017
3018void
Martin v. Löwis790465f2008-04-05 20:41:37 +00003019PySys_SetPath(const wchar_t *path)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003020{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 PyObject *v;
3022 if ((v = makepathobject(path, DELIM)) == NULL)
3023 Py_FatalError("can't create sys.path");
Victor Stinner838f2642019-06-13 22:41:23 +02003024 PyThreadState *tstate = _PyThreadState_GET();
3025 if (sys_set_object_id(tstate, &PyId_path, v) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003026 Py_FatalError("can't assign sys.path");
Victor Stinner838f2642019-06-13 22:41:23 +02003027 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003028 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003029}
3030
Guido van Rossum65bf9f21997-04-29 18:33:38 +00003031static PyObject *
Victor Stinner74f65682019-03-15 15:08:05 +01003032make_sys_argv(int argc, wchar_t * const * argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003033{
Victor Stinner74f65682019-03-15 15:08:05 +01003034 PyObject *list = PyList_New(argc);
3035 if (list == NULL) {
3036 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 }
Victor Stinner74f65682019-03-15 15:08:05 +01003038
3039 for (Py_ssize_t i = 0; i < argc; i++) {
3040 PyObject *v = PyUnicode_FromWideChar(argv[i], -1);
3041 if (v == NULL) {
3042 Py_DECREF(list);
3043 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 }
Victor Stinner74f65682019-03-15 15:08:05 +01003045 PyList_SET_ITEM(list, i, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003046 }
Victor Stinner74f65682019-03-15 15:08:05 +01003047 return list;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003048}
3049
Victor Stinner11a247d2017-12-13 21:05:57 +01003050void
3051PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
Victor Stinnerd5dda982017-12-13 17:31:16 +01003052{
Victor Stinnerc4868252019-08-23 11:04:16 +01003053 wchar_t* empty_argv[1] = {L""};
Victor Stinner838f2642019-06-13 22:41:23 +02003054 PyThreadState *tstate = _PyThreadState_GET();
3055
Victor Stinner74f65682019-03-15 15:08:05 +01003056 if (argc < 1 || argv == NULL) {
3057 /* Ensure at least one (empty) argument is seen */
Victor Stinner74f65682019-03-15 15:08:05 +01003058 argv = empty_argv;
3059 argc = 1;
3060 }
3061
3062 PyObject *av = make_sys_argv(argc, argv);
Victor Stinnerd5dda982017-12-13 17:31:16 +01003063 if (av == NULL) {
Victor Stinner11a247d2017-12-13 21:05:57 +01003064 Py_FatalError("no mem for sys.argv");
Victor Stinnerd5dda982017-12-13 17:31:16 +01003065 }
Victor Stinner838f2642019-06-13 22:41:23 +02003066 if (sys_set_object(tstate, "argv", av) != 0) {
Victor Stinnerd5dda982017-12-13 17:31:16 +01003067 Py_DECREF(av);
Victor Stinner11a247d2017-12-13 21:05:57 +01003068 Py_FatalError("can't assign sys.argv");
Victor Stinnerd5dda982017-12-13 17:31:16 +01003069 }
3070 Py_DECREF(av);
3071
3072 if (updatepath) {
3073 /* If argv[0] is not '-c' nor '-m', prepend argv[0] to sys.path.
3074 If argv[0] is a symlink, use the real path. */
Victor Stinner331a6a52019-05-27 16:39:22 +02003075 const PyWideStringList argv_list = {.length = argc, .items = argv};
Victor Stinnerdcf61712019-03-19 16:09:27 +01003076 PyObject *path0 = NULL;
3077 if (_PyPathConfig_ComputeSysPath0(&argv_list, &path0)) {
3078 if (path0 == NULL) {
3079 Py_FatalError("can't compute path0 from argv");
Victor Stinner11a247d2017-12-13 21:05:57 +01003080 }
Victor Stinnerdcf61712019-03-19 16:09:27 +01003081
Victor Stinner838f2642019-06-13 22:41:23 +02003082 PyObject *sys_path = sys_get_object_id(tstate, &PyId_path);
Victor Stinnerdcf61712019-03-19 16:09:27 +01003083 if (sys_path != NULL) {
3084 if (PyList_Insert(sys_path, 0, path0) < 0) {
3085 Py_DECREF(path0);
3086 Py_FatalError("can't prepend path0 to sys.path");
3087 }
3088 }
3089 Py_DECREF(path0);
Victor Stinner11a247d2017-12-13 21:05:57 +01003090 }
Victor Stinnerd5dda982017-12-13 17:31:16 +01003091 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003092}
Guido van Rossuma890e681998-05-12 14:59:24 +00003093
Antoine Pitrouf978fac2010-05-21 17:25:34 +00003094void
3095PySys_SetArgv(int argc, wchar_t **argv)
3096{
Christian Heimesad73a9c2013-08-10 16:36:18 +02003097 PySys_SetArgvEx(argc, argv, Py_IsolatedFlag == 0);
Antoine Pitrouf978fac2010-05-21 17:25:34 +00003098}
3099
Victor Stinner14284c22010-04-23 12:02:30 +00003100/* Reimplementation of PyFile_WriteString() no calling indirectly
3101 PyErr_CheckSignals(): avoid the call to PyObject_Str(). */
3102
3103static int
Victor Stinner79766632010-08-16 17:36:42 +00003104sys_pyfile_write_unicode(PyObject *unicode, PyObject *file)
Victor Stinner14284c22010-04-23 12:02:30 +00003105{
Victor Stinnerecccc4f2010-06-08 20:46:00 +00003106 if (file == NULL)
3107 return -1;
Jeroen Demeyerb1263d52019-06-28 11:49:00 +02003108 assert(unicode != NULL);
Jeroen Demeyer59ad1102019-07-11 10:59:05 +02003109 PyObject *result = _PyObject_CallMethodIdOneArg(file, &PyId_write, unicode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003110 if (result == NULL) {
Jeroen Demeyerb1263d52019-06-28 11:49:00 +02003111 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 }
Jeroen Demeyerb1263d52019-06-28 11:49:00 +02003113 Py_DECREF(result);
3114 return 0;
Victor Stinner14284c22010-04-23 12:02:30 +00003115}
3116
Victor Stinner79766632010-08-16 17:36:42 +00003117static int
3118sys_pyfile_write(const char *text, PyObject *file)
3119{
3120 PyObject *unicode = NULL;
3121 int err;
3122
3123 if (file == NULL)
3124 return -1;
3125
3126 unicode = PyUnicode_FromString(text);
3127 if (unicode == NULL)
3128 return -1;
3129
3130 err = sys_pyfile_write_unicode(unicode, file);
3131 Py_DECREF(unicode);
3132 return err;
3133}
Guido van Rossuma890e681998-05-12 14:59:24 +00003134
3135/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
3136 Adapted from code submitted by Just van Rossum.
3137
3138 PySys_WriteStdout(format, ...)
3139 PySys_WriteStderr(format, ...)
3140
3141 The first function writes to sys.stdout; the second to sys.stderr. When
3142 there is a problem, they write to the real (C level) stdout or stderr;
Guido van Rossum8442af31998-10-12 18:22:10 +00003143 no exceptions are raised.
Guido van Rossuma890e681998-05-12 14:59:24 +00003144
Victor Stinner14284c22010-04-23 12:02:30 +00003145 PyErr_CheckSignals() is not called to avoid the execution of the Python
Victor Stinner79766632010-08-16 17:36:42 +00003146 signal handlers: they may raise a new exception whereas sys_write()
3147 ignores all exceptions.
Victor Stinner14284c22010-04-23 12:02:30 +00003148
Guido van Rossuma890e681998-05-12 14:59:24 +00003149 Both take a printf-style format string as their first argument followed
3150 by a variable length argument list determined by the format string.
3151
3152 *** WARNING ***
3153
3154 The format should limit the total size of the formatted output string to
3155 1000 bytes. In particular, this means that no unrestricted "%s" formats
3156 should occur; these should be limited using "%.<N>s where <N> is a
3157 decimal number calculated so that <N> plus the maximum size of other
3158 formatted text does not exceed 1000 bytes. Also watch out for "%f",
3159 which can print hundreds of digits for very large numbers.
3160
3161 */
3162
3163static void
Victor Stinner09054372013-11-06 22:41:44 +01003164sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va)
Guido van Rossuma890e681998-05-12 14:59:24 +00003165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166 PyObject *file;
3167 PyObject *error_type, *error_value, *error_traceback;
3168 char buffer[1001];
3169 int written;
Victor Stinner838f2642019-06-13 22:41:23 +02003170 PyThreadState *tstate = _PyThreadState_GET();
Guido van Rossuma890e681998-05-12 14:59:24 +00003171
Victor Stinner838f2642019-06-13 22:41:23 +02003172 _PyErr_Fetch(tstate, &error_type, &error_value, &error_traceback);
3173 file = sys_get_object_id(tstate, key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174 written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
3175 if (sys_pyfile_write(buffer, file) != 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02003176 _PyErr_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003177 fputs(buffer, fp);
3178 }
3179 if (written < 0 || (size_t)written >= sizeof(buffer)) {
3180 const char *truncated = "... truncated";
Victor Stinner79766632010-08-16 17:36:42 +00003181 if (sys_pyfile_write(truncated, file) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003182 fputs(truncated, fp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 }
Victor Stinner838f2642019-06-13 22:41:23 +02003184 _PyErr_Restore(tstate, error_type, error_value, error_traceback);
Guido van Rossuma890e681998-05-12 14:59:24 +00003185}
3186
3187void
Guido van Rossuma890e681998-05-12 14:59:24 +00003188PySys_WriteStdout(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00003189{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003190 va_list va;
Guido van Rossuma890e681998-05-12 14:59:24 +00003191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003193 sys_write(&PyId_stdout, stdout, format, va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 va_end(va);
Guido van Rossuma890e681998-05-12 14:59:24 +00003195}
3196
3197void
Guido van Rossuma890e681998-05-12 14:59:24 +00003198PySys_WriteStderr(const char *format, ...)
Guido van Rossuma890e681998-05-12 14:59:24 +00003199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 va_list va;
Guido van Rossuma890e681998-05-12 14:59:24 +00003201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003202 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003203 sys_write(&PyId_stderr, stderr, format, va);
Victor Stinner79766632010-08-16 17:36:42 +00003204 va_end(va);
3205}
3206
3207static void
Victor Stinner09054372013-11-06 22:41:44 +01003208sys_format(_Py_Identifier *key, FILE *fp, const char *format, va_list va)
Victor Stinner79766632010-08-16 17:36:42 +00003209{
3210 PyObject *file, *message;
3211 PyObject *error_type, *error_value, *error_traceback;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02003212 const char *utf8;
Victor Stinner838f2642019-06-13 22:41:23 +02003213 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner79766632010-08-16 17:36:42 +00003214
Victor Stinner838f2642019-06-13 22:41:23 +02003215 _PyErr_Fetch(tstate, &error_type, &error_value, &error_traceback);
3216 file = sys_get_object_id(tstate, key);
Victor Stinner79766632010-08-16 17:36:42 +00003217 message = PyUnicode_FromFormatV(format, va);
3218 if (message != NULL) {
3219 if (sys_pyfile_write_unicode(message, file) != 0) {
Victor Stinner838f2642019-06-13 22:41:23 +02003220 _PyErr_Clear(tstate);
Serhiy Storchaka06515832016-11-20 09:13:07 +02003221 utf8 = PyUnicode_AsUTF8(message);
Victor Stinner79766632010-08-16 17:36:42 +00003222 if (utf8 != NULL)
3223 fputs(utf8, fp);
3224 }
3225 Py_DECREF(message);
3226 }
Victor Stinner838f2642019-06-13 22:41:23 +02003227 _PyErr_Restore(tstate, error_type, error_value, error_traceback);
Victor Stinner79766632010-08-16 17:36:42 +00003228}
3229
3230void
3231PySys_FormatStdout(const char *format, ...)
3232{
3233 va_list va;
3234
3235 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003236 sys_format(&PyId_stdout, stdout, format, va);
Victor Stinner79766632010-08-16 17:36:42 +00003237 va_end(va);
3238}
3239
3240void
3241PySys_FormatStderr(const char *format, ...)
3242{
3243 va_list va;
3244
3245 va_start(va, format);
Victor Stinnerbd303c12013-11-07 23:07:29 +01003246 sys_format(&PyId_stderr, stderr, format, va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 va_end(va);
Guido van Rossuma890e681998-05-12 14:59:24 +00003248}