blob: 91a78fe72b3bc504765ca7e2ae006615e6ff0efe [file] [log] [blame]
Christian Heimes33fe8092008-04-13 13:53:33 +00001#include "Python.h"
Victor Stinner66b79732020-03-02 15:02:18 +01002#include "pycore_initconfig.h"
Victor Stinner4a3fe082020-04-14 14:26:24 +02003#include "pycore_interp.h" // PyInterpreterState.warnings
Victor Stinner4d231bc2019-11-14 13:36:21 +01004#include "pycore_pyerrors.h"
Victor Stinnere5014be2020-04-14 17:52:15 +02005#include "pycore_pystate.h" // _PyThreadState_GET()
Victor Stinner70364772020-04-29 03:28:46 +02006#include "frameobject.h" // PyFrame_GetBack()
Victor Stinner22f18752016-12-09 18:08:18 +01007#include "clinic/_warnings.c.h"
Christian Heimes33fe8092008-04-13 13:53:33 +00008
9#define MODULE_NAME "_warnings"
Christian Heimes33fe8092008-04-13 13:53:33 +000010
11PyDoc_STRVAR(warnings__doc__,
12MODULE_NAME " provides basic warning filtering support.\n"
13"It is a helper module to speed up interpreter start-up.");
14
Victor Stinnerbd303c12013-11-07 23:07:29 +010015_Py_IDENTIFIER(stderr);
Victor Stinner747f48e2017-12-12 22:59:48 +010016#ifndef Py_DEBUG
Nick Coghlan9b997472018-01-08 12:45:02 +100017_Py_IDENTIFIER(default);
Victor Stinnerb98f1712017-11-23 17:13:44 +010018_Py_IDENTIFIER(ignore);
Victor Stinner747f48e2017-12-12 22:59:48 +010019#endif
Christian Heimes33fe8092008-04-13 13:53:33 +000020
Eric Snow86ea5812019-05-10 13:29:55 -040021
22/*************************************************************************/
23
24typedef struct _warnings_runtime_state WarningsState;
25
26/* Forward declaration of the _warnings module definition. */
27static struct PyModuleDef warningsmodule;
28
Hai Shi46874c22020-01-30 17:20:25 -060029_Py_IDENTIFIER(__name__);
30
Eric Snow86ea5812019-05-10 13:29:55 -040031/* Given a module object, get its per-module state. */
32static WarningsState *
Victor Stinner66b79732020-03-02 15:02:18 +010033warnings_get_state(void)
Eric Snow86ea5812019-05-10 13:29:55 -040034{
Victor Stinner4d231bc2019-11-14 13:36:21 +010035 PyThreadState *tstate = _PyThreadState_GET();
Eric Snow86ea5812019-05-10 13:29:55 -040036 if (tstate == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +010037 _PyErr_SetString(tstate, PyExc_RuntimeError,
Victor Stinner66b79732020-03-02 15:02:18 +010038 "warnings_get_state: could not identify "
Victor Stinner4d231bc2019-11-14 13:36:21 +010039 "current interpreter");
Eric Snow86ea5812019-05-10 13:29:55 -040040 return NULL;
41 }
42 return &tstate->interp->warnings;
43}
44
45/* Clear the given warnings module state. */
46static void
Victor Stinner66b79732020-03-02 15:02:18 +010047warnings_clear_state(WarningsState *st)
Eric Snow86ea5812019-05-10 13:29:55 -040048{
49 Py_CLEAR(st->filters);
50 Py_CLEAR(st->once_registry);
51 Py_CLEAR(st->default_action);
52}
53
54#ifndef Py_DEBUG
55static PyObject *
56create_filter(PyObject *category, _Py_Identifier *id, const char *modname)
57{
58 PyObject *modname_obj = NULL;
59 PyObject *action_str = _PyUnicode_FromId(id);
60 if (action_str == NULL) {
61 return NULL;
62 }
63
64 /* Default to "no module name" for initial filter set */
65 if (modname != NULL) {
66 modname_obj = PyUnicode_InternFromString(modname);
67 if (modname_obj == NULL) {
68 return NULL;
69 }
70 } else {
71 modname_obj = Py_None;
Christian Heimes35bf8ea2020-11-18 18:45:29 +010072 Py_INCREF(modname_obj);
Eric Snow86ea5812019-05-10 13:29:55 -040073 }
74
75 /* This assumes the line number is zero for now. */
Christian Heimes35bf8ea2020-11-18 18:45:29 +010076 PyObject *filter = PyTuple_Pack(5, action_str, Py_None,
77 category, modname_obj, _PyLong_Zero);
78 Py_DECREF(modname_obj);
79 return filter;
Eric Snow86ea5812019-05-10 13:29:55 -040080}
81#endif
82
83static PyObject *
84init_filters(void)
85{
86#ifdef Py_DEBUG
87 /* Py_DEBUG builds show all warnings by default */
88 return PyList_New(0);
89#else
90 /* Other builds ignore a number of warning categories by default */
91 PyObject *filters = PyList_New(5);
92 if (filters == NULL) {
93 return NULL;
94 }
95
96 size_t pos = 0; /* Post-incremented in each use. */
97 PyList_SET_ITEM(filters, pos++,
98 create_filter(PyExc_DeprecationWarning, &PyId_default, "__main__"));
99 PyList_SET_ITEM(filters, pos++,
100 create_filter(PyExc_DeprecationWarning, &PyId_ignore, NULL));
101 PyList_SET_ITEM(filters, pos++,
102 create_filter(PyExc_PendingDeprecationWarning, &PyId_ignore, NULL));
103 PyList_SET_ITEM(filters, pos++,
104 create_filter(PyExc_ImportWarning, &PyId_ignore, NULL));
105 PyList_SET_ITEM(filters, pos++,
106 create_filter(PyExc_ResourceWarning, &PyId_ignore, NULL));
107
108 for (size_t x = 0; x < pos; x++) {
109 if (PyList_GET_ITEM(filters, x) == NULL) {
110 Py_DECREF(filters);
111 return NULL;
112 }
113 }
114 return filters;
115#endif
116}
117
118/* Initialize the given warnings module state. */
119static int
Victor Stinner66b79732020-03-02 15:02:18 +0100120warnings_init_state(WarningsState *st)
Eric Snow86ea5812019-05-10 13:29:55 -0400121{
122 if (st->filters == NULL) {
123 st->filters = init_filters();
124 if (st->filters == NULL) {
125 goto error;
126 }
127 }
128
129 if (st->once_registry == NULL) {
130 st->once_registry = PyDict_New();
131 if (st->once_registry == NULL) {
132 goto error;
133 }
134 }
135
136 if (st->default_action == NULL) {
137 st->default_action = PyUnicode_FromString("default");
138 if (st->default_action == NULL) {
139 goto error;
140 }
141 }
142
143 st->filters_version = 0;
144
145 return 0;
146
147error:
Victor Stinner66b79732020-03-02 15:02:18 +0100148 warnings_clear_state(st);
Eric Snow86ea5812019-05-10 13:29:55 -0400149 return -1;
150}
151
152
153/*************************************************************************/
154
Christian Heimes33fe8092008-04-13 13:53:33 +0000155static int
156check_matched(PyObject *obj, PyObject *arg)
157{
158 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200159 _Py_IDENTIFIER(match);
Christian Heimes33fe8092008-04-13 13:53:33 +0000160 int rc;
161
Nick Coghlan9b997472018-01-08 12:45:02 +1000162 /* A 'None' filter always matches */
Christian Heimes33fe8092008-04-13 13:53:33 +0000163 if (obj == Py_None)
164 return 1;
Nick Coghlan9b997472018-01-08 12:45:02 +1000165
166 /* An internal plain text default filter must match exactly */
167 if (PyUnicode_CheckExact(obj)) {
168 int cmp_result = PyUnicode_Compare(obj, arg);
169 if (cmp_result == -1 && PyErr_Occurred()) {
170 return -1;
171 }
172 return !cmp_result;
173 }
174
175 /* Otherwise assume a regex filter and call its match() method */
Jeroen Demeyer59ad1102019-07-11 10:59:05 +0200176 result = _PyObject_CallMethodIdOneArg(obj, &PyId_match, arg);
Christian Heimes33fe8092008-04-13 13:53:33 +0000177 if (result == NULL)
178 return -1;
179
180 rc = PyObject_IsTrue(result);
181 Py_DECREF(result);
182 return rc;
183}
184
185/*
186 Returns a new reference.
187 A NULL return value can mean false or an error.
188*/
189static PyObject *
Victor Stinner82656272017-11-22 23:51:42 +0100190get_warnings_attr(_Py_Identifier *attr_id, int try_import)
Christian Heimes33fe8092008-04-13 13:53:33 +0000191{
Victor Stinner82656272017-11-22 23:51:42 +0100192 PyObject *warnings_str;
Victor Stinnere98445a2016-03-23 00:54:48 +0100193 PyObject *warnings_module, *obj;
Victor Stinner82656272017-11-22 23:51:42 +0100194 _Py_IDENTIFIER(warnings);
Christian Heimes33fe8092008-04-13 13:53:33 +0000195
Victor Stinner82656272017-11-22 23:51:42 +0100196 warnings_str = _PyUnicode_FromId(&PyId_warnings);
Christian Heimes33fe8092008-04-13 13:53:33 +0000197 if (warnings_str == NULL) {
Victor Stinner82656272017-11-22 23:51:42 +0100198 return NULL;
Christian Heimes33fe8092008-04-13 13:53:33 +0000199 }
200
Victor Stinnere98445a2016-03-23 00:54:48 +0100201 /* don't try to import after the start of the Python finallization */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600202 if (try_import && !_Py_IsFinalizing()) {
Victor Stinnere98445a2016-03-23 00:54:48 +0100203 warnings_module = PyImport_Import(warnings_str);
204 if (warnings_module == NULL) {
205 /* Fallback to the C implementation if we cannot get
206 the Python implementation */
Serhiy Storchakad4f84802017-11-11 15:19:47 +0200207 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
208 PyErr_Clear();
209 }
Christian Heimes33fe8092008-04-13 13:53:33 +0000210 return NULL;
Victor Stinnere98445a2016-03-23 00:54:48 +0100211 }
212 }
213 else {
Nathaniel J. Smithdba976b2018-01-26 11:28:31 -0800214 /* if we're so late into Python finalization that the module dict is
215 gone, then we can't even use PyImport_GetModule without triggering
216 an interpreter abort.
217 */
Victor Stinner81a7be32020-04-14 15:14:01 +0200218 if (!_PyInterpreterState_GET()->modules) {
Nathaniel J. Smithdba976b2018-01-26 11:28:31 -0800219 return NULL;
220 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600221 warnings_module = PyImport_GetModule(warnings_str);
Victor Stinner023654f2016-03-23 17:48:22 +0100222 if (warnings_module == NULL)
223 return NULL;
Victor Stinnere98445a2016-03-23 00:54:48 +0100224 }
225
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200226 (void)_PyObject_LookupAttrId(warnings_module, attr_id, &obj);
Victor Stinnere98445a2016-03-23 00:54:48 +0100227 Py_DECREF(warnings_module);
228 return obj;
Christian Heimes33fe8092008-04-13 13:53:33 +0000229}
230
231
Neal Norwitz32dde222008-04-15 06:43:13 +0000232static PyObject *
Eric Snow86ea5812019-05-10 13:29:55 -0400233get_once_registry(WarningsState *st)
Christian Heimes33fe8092008-04-13 13:53:33 +0000234{
235 PyObject *registry;
Victor Stinner82656272017-11-22 23:51:42 +0100236 _Py_IDENTIFIER(onceregistry);
Christian Heimes33fe8092008-04-13 13:53:33 +0000237
Victor Stinner82656272017-11-22 23:51:42 +0100238 registry = get_warnings_attr(&PyId_onceregistry, 0);
Christian Heimes33fe8092008-04-13 13:53:33 +0000239 if (registry == NULL) {
240 if (PyErr_Occurred())
241 return NULL;
Eric Snow86ea5812019-05-10 13:29:55 -0400242 assert(st->once_registry);
243 return st->once_registry;
Christian Heimes33fe8092008-04-13 13:53:33 +0000244 }
Oren Milman252033d2017-09-11 09:28:39 +0300245 if (!PyDict_Check(registry)) {
Serhiy Storchakad4f84802017-11-11 15:19:47 +0200246 PyErr_Format(PyExc_TypeError,
247 MODULE_NAME ".onceregistry must be a dict, "
248 "not '%.200s'",
249 Py_TYPE(registry)->tp_name);
Oren Milman252033d2017-09-11 09:28:39 +0300250 Py_DECREF(registry);
251 return NULL;
252 }
Eric Snow86ea5812019-05-10 13:29:55 -0400253 Py_SETREF(st->once_registry, registry);
Christian Heimes33fe8092008-04-13 13:53:33 +0000254 return registry;
255}
256
257
Brett Cannon0759dd62009-04-01 18:13:07 +0000258static PyObject *
Eric Snow86ea5812019-05-10 13:29:55 -0400259get_default_action(WarningsState *st)
Brett Cannon0759dd62009-04-01 18:13:07 +0000260{
261 PyObject *default_action;
Victor Stinner82656272017-11-22 23:51:42 +0100262 _Py_IDENTIFIER(defaultaction);
Brett Cannon0759dd62009-04-01 18:13:07 +0000263
Victor Stinner82656272017-11-22 23:51:42 +0100264 default_action = get_warnings_attr(&PyId_defaultaction, 0);
Brett Cannon0759dd62009-04-01 18:13:07 +0000265 if (default_action == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 if (PyErr_Occurred()) {
267 return NULL;
268 }
Eric Snow86ea5812019-05-10 13:29:55 -0400269 assert(st->default_action);
270 return st->default_action;
Brett Cannon0759dd62009-04-01 18:13:07 +0000271 }
Oren Milman9d984fd2017-09-12 00:18:09 +0300272 if (!PyUnicode_Check(default_action)) {
273 PyErr_Format(PyExc_TypeError,
274 MODULE_NAME ".defaultaction must be a string, "
275 "not '%.200s'",
276 Py_TYPE(default_action)->tp_name);
277 Py_DECREF(default_action);
278 return NULL;
279 }
Eric Snow86ea5812019-05-10 13:29:55 -0400280 Py_SETREF(st->default_action, default_action);
Brett Cannon0759dd62009-04-01 18:13:07 +0000281 return default_action;
282}
283
284
Benjamin Petersondeff2b72015-05-03 11:23:37 -0400285/* The item is a new reference. */
Victor Stinnera4c704b2013-10-29 23:43:41 +0100286static PyObject*
Christian Heimes33fe8092008-04-13 13:53:33 +0000287get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno,
288 PyObject *module, PyObject **item)
289{
Brett Cannon0759dd62009-04-01 18:13:07 +0000290 PyObject *action;
Christian Heimes33fe8092008-04-13 13:53:33 +0000291 Py_ssize_t i;
292 PyObject *warnings_filters;
Victor Stinner82656272017-11-22 23:51:42 +0100293 _Py_IDENTIFIER(filters);
Victor Stinner66b79732020-03-02 15:02:18 +0100294 WarningsState *st = warnings_get_state();
Eric Snow86ea5812019-05-10 13:29:55 -0400295 if (st == NULL) {
296 return NULL;
297 }
Christian Heimes33fe8092008-04-13 13:53:33 +0000298
Victor Stinner82656272017-11-22 23:51:42 +0100299 warnings_filters = get_warnings_attr(&PyId_filters, 0);
Christian Heimes33fe8092008-04-13 13:53:33 +0000300 if (warnings_filters == NULL) {
301 if (PyErr_Occurred())
302 return NULL;
303 }
304 else {
Eric Snow86ea5812019-05-10 13:29:55 -0400305 Py_SETREF(st->filters, warnings_filters);
Christian Heimes33fe8092008-04-13 13:53:33 +0000306 }
307
Eric Snow86ea5812019-05-10 13:29:55 -0400308 PyObject *filters = st->filters;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600309 if (filters == NULL || !PyList_Check(filters)) {
Christian Heimes33fe8092008-04-13 13:53:33 +0000310 PyErr_SetString(PyExc_ValueError,
311 MODULE_NAME ".filters must be a list");
312 return NULL;
313 }
314
Eric Snow86ea5812019-05-10 13:29:55 -0400315 /* WarningsState.filters could change while we are iterating over it. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600316 for (i = 0; i < PyList_GET_SIZE(filters); i++) {
Christian Heimes33fe8092008-04-13 13:53:33 +0000317 PyObject *tmp_item, *action, *msg, *cat, *mod, *ln_obj;
318 Py_ssize_t ln;
319 int is_subclass, good_msg, good_mod;
320
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600321 tmp_item = PyList_GET_ITEM(filters, i);
Benjamin Petersondeff2b72015-05-03 11:23:37 -0400322 if (!PyTuple_Check(tmp_item) || PyTuple_GET_SIZE(tmp_item) != 5) {
Christian Heimes33fe8092008-04-13 13:53:33 +0000323 PyErr_Format(PyExc_ValueError,
324 MODULE_NAME ".filters item %zd isn't a 5-tuple", i);
325 return NULL;
326 }
327
328 /* Python code: action, msg, cat, mod, ln = item */
Benjamin Petersondeff2b72015-05-03 11:23:37 -0400329 Py_INCREF(tmp_item);
Christian Heimes33fe8092008-04-13 13:53:33 +0000330 action = PyTuple_GET_ITEM(tmp_item, 0);
331 msg = PyTuple_GET_ITEM(tmp_item, 1);
332 cat = PyTuple_GET_ITEM(tmp_item, 2);
333 mod = PyTuple_GET_ITEM(tmp_item, 3);
334 ln_obj = PyTuple_GET_ITEM(tmp_item, 4);
335
Oren Milman9d984fd2017-09-12 00:18:09 +0300336 if (!PyUnicode_Check(action)) {
337 PyErr_Format(PyExc_TypeError,
338 "action must be a string, not '%.200s'",
339 Py_TYPE(action)->tp_name);
340 Py_DECREF(tmp_item);
341 return NULL;
342 }
343
Christian Heimes33fe8092008-04-13 13:53:33 +0000344 good_msg = check_matched(msg, text);
Benjamin Peterson8c598162015-05-03 11:28:46 -0400345 if (good_msg == -1) {
346 Py_DECREF(tmp_item);
Victor Stinner3cd04aa2013-10-31 14:46:00 +0100347 return NULL;
Benjamin Peterson8c598162015-05-03 11:28:46 -0400348 }
Victor Stinner3cd04aa2013-10-31 14:46:00 +0100349
Christian Heimes33fe8092008-04-13 13:53:33 +0000350 good_mod = check_matched(mod, module);
Benjamin Peterson8c598162015-05-03 11:28:46 -0400351 if (good_mod == -1) {
352 Py_DECREF(tmp_item);
Victor Stinner3cd04aa2013-10-31 14:46:00 +0100353 return NULL;
Benjamin Peterson8c598162015-05-03 11:28:46 -0400354 }
Victor Stinner3cd04aa2013-10-31 14:46:00 +0100355
Christian Heimes33fe8092008-04-13 13:53:33 +0000356 is_subclass = PyObject_IsSubclass(category, cat);
Benjamin Peterson8c598162015-05-03 11:28:46 -0400357 if (is_subclass == -1) {
358 Py_DECREF(tmp_item);
Victor Stinner3cd04aa2013-10-31 14:46:00 +0100359 return NULL;
Benjamin Peterson8c598162015-05-03 11:28:46 -0400360 }
Victor Stinner3cd04aa2013-10-31 14:46:00 +0100361
Christian Heimes33fe8092008-04-13 13:53:33 +0000362 ln = PyLong_AsSsize_t(ln_obj);
Benjamin Peterson8c598162015-05-03 11:28:46 -0400363 if (ln == -1 && PyErr_Occurred()) {
Benjamin Petersondeff2b72015-05-03 11:23:37 -0400364 Py_DECREF(tmp_item);
Christian Heimes33fe8092008-04-13 13:53:33 +0000365 return NULL;
Benjamin Petersondeff2b72015-05-03 11:23:37 -0400366 }
Christian Heimes33fe8092008-04-13 13:53:33 +0000367
Benjamin Petersondeff2b72015-05-03 11:23:37 -0400368 if (good_msg && is_subclass && good_mod && (ln == 0 || lineno == ln)) {
369 *item = tmp_item;
Victor Stinnera4c704b2013-10-29 23:43:41 +0100370 return action;
Benjamin Petersondeff2b72015-05-03 11:23:37 -0400371 }
372
373 Py_DECREF(tmp_item);
Christian Heimes33fe8092008-04-13 13:53:33 +0000374 }
375
Eric Snow86ea5812019-05-10 13:29:55 -0400376 action = get_default_action(st);
Brett Cannon0759dd62009-04-01 18:13:07 +0000377 if (action != NULL) {
Benjamin Petersondeff2b72015-05-03 11:23:37 -0400378 Py_INCREF(Py_None);
379 *item = Py_None;
Victor Stinnera4c704b2013-10-29 23:43:41 +0100380 return action;
Brett Cannon0759dd62009-04-01 18:13:07 +0000381 }
Christian Heimes33fe8092008-04-13 13:53:33 +0000382
Christian Heimes33fe8092008-04-13 13:53:33 +0000383 return NULL;
384}
385
Brett Cannon0759dd62009-04-01 18:13:07 +0000386
Christian Heimes33fe8092008-04-13 13:53:33 +0000387static int
388already_warned(PyObject *registry, PyObject *key, int should_set)
389{
Antoine Pitroucb0a0062014-09-18 02:40:46 +0200390 PyObject *version_obj, *already_warned;
391 _Py_IDENTIFIER(version);
Christian Heimes33fe8092008-04-13 13:53:33 +0000392
393 if (key == NULL)
394 return -1;
395
Victor Stinner66b79732020-03-02 15:02:18 +0100396 WarningsState *st = warnings_get_state();
Eric Snow86ea5812019-05-10 13:29:55 -0400397 if (st == NULL) {
398 return -1;
399 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200400 version_obj = _PyDict_GetItemIdWithError(registry, &PyId_version);
Antoine Pitroucb0a0062014-09-18 02:40:46 +0200401 if (version_obj == NULL
402 || !PyLong_CheckExact(version_obj)
Eric Snow86ea5812019-05-10 13:29:55 -0400403 || PyLong_AsLong(version_obj) != st->filters_version)
Serhiy Storchaka8905fcc2018-12-11 08:38:03 +0200404 {
405 if (PyErr_Occurred()) {
406 return -1;
407 }
Antoine Pitroucb0a0062014-09-18 02:40:46 +0200408 PyDict_Clear(registry);
Eric Snow86ea5812019-05-10 13:29:55 -0400409 version_obj = PyLong_FromLong(st->filters_version);
Antoine Pitroucb0a0062014-09-18 02:40:46 +0200410 if (version_obj == NULL)
411 return -1;
412 if (_PyDict_SetItemId(registry, &PyId_version, version_obj) < 0) {
413 Py_DECREF(version_obj);
414 return -1;
415 }
416 Py_DECREF(version_obj);
417 }
418 else {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200419 already_warned = PyDict_GetItemWithError(registry, key);
Antoine Pitroucb0a0062014-09-18 02:40:46 +0200420 if (already_warned != NULL) {
421 int rc = PyObject_IsTrue(already_warned);
422 if (rc != 0)
423 return rc;
424 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200425 else if (PyErr_Occurred()) {
426 return -1;
427 }
Christian Heimes33fe8092008-04-13 13:53:33 +0000428 }
429
430 /* This warning wasn't found in the registry, set it. */
431 if (should_set)
432 return PyDict_SetItem(registry, key, Py_True);
433 return 0;
434}
435
436/* New reference. */
437static PyObject *
438normalize_module(PyObject *filename)
439{
440 PyObject *module;
Victor Stinnera4c704b2013-10-29 23:43:41 +0100441 int kind;
Serhiy Storchakacd8295f2020-04-11 10:48:40 +0300442 const void *data;
Christian Heimes33fe8092008-04-13 13:53:33 +0000443 Py_ssize_t len;
444
Victor Stinner9e30aa52011-11-21 02:49:52 +0100445 len = PyUnicode_GetLength(filename);
Christian Heimes33fe8092008-04-13 13:53:33 +0000446 if (len < 0)
447 return NULL;
Victor Stinnera4c704b2013-10-29 23:43:41 +0100448
449 if (len == 0)
450 return PyUnicode_FromString("<unknown>");
451
452 kind = PyUnicode_KIND(filename);
453 data = PyUnicode_DATA(filename);
454
455 /* if filename.endswith(".py"): */
Christian Heimes33fe8092008-04-13 13:53:33 +0000456 if (len >= 3 &&
Victor Stinnera4c704b2013-10-29 23:43:41 +0100457 PyUnicode_READ(kind, data, len-3) == '.' &&
458 PyUnicode_READ(kind, data, len-2) == 'p' &&
459 PyUnicode_READ(kind, data, len-1) == 'y')
460 {
Victor Stinner9e30aa52011-11-21 02:49:52 +0100461 module = PyUnicode_Substring(filename, 0, len-3);
Christian Heimes33fe8092008-04-13 13:53:33 +0000462 }
463 else {
464 module = filename;
465 Py_INCREF(module);
466 }
467 return module;
468}
469
470static int
471update_registry(PyObject *registry, PyObject *text, PyObject *category,
472 int add_zero)
473{
Serhiy Storchakaba85d692017-03-30 09:09:41 +0300474 PyObject *altkey;
Christian Heimes33fe8092008-04-13 13:53:33 +0000475 int rc;
476
Serhiy Storchakaba85d692017-03-30 09:09:41 +0300477 if (add_zero)
478 altkey = PyTuple_Pack(3, text, category, _PyLong_Zero);
Christian Heimes33fe8092008-04-13 13:53:33 +0000479 else
480 altkey = PyTuple_Pack(2, text, category);
481
482 rc = already_warned(registry, altkey, 1);
Christian Heimes33fe8092008-04-13 13:53:33 +0000483 Py_XDECREF(altkey);
484 return rc;
485}
486
487static void
Victor Stinner914cde82016-03-19 01:03:51 +0100488show_warning(PyObject *filename, int lineno, PyObject *text,
489 PyObject *category, PyObject *sourceline)
Christian Heimes33fe8092008-04-13 13:53:33 +0000490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 PyObject *f_stderr;
492 PyObject *name;
Christian Heimes33fe8092008-04-13 13:53:33 +0000493 char lineno_str[128];
494
495 PyOS_snprintf(lineno_str, sizeof(lineno_str), ":%d: ", lineno);
496
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200497 name = _PyObject_GetAttrId(category, &PyId___name__);
Hai Shi57c78102020-03-14 21:40:58 +0800498 if (name == NULL) {
Victor Stinnerae233ea2013-10-31 14:51:38 +0100499 goto error;
Hai Shi57c78102020-03-14 21:40:58 +0800500 }
Christian Heimes33fe8092008-04-13 13:53:33 +0000501
Victor Stinnerbd303c12013-11-07 23:07:29 +0100502 f_stderr = _PySys_GetObjectId(&PyId_stderr);
Christian Heimes33fe8092008-04-13 13:53:33 +0000503 if (f_stderr == NULL) {
504 fprintf(stderr, "lost sys.stderr\n");
Victor Stinnerae233ea2013-10-31 14:51:38 +0100505 goto error;
Christian Heimes33fe8092008-04-13 13:53:33 +0000506 }
507
508 /* Print "filename:lineno: category: text\n" */
Victor Stinnerae233ea2013-10-31 14:51:38 +0100509 if (PyFile_WriteObject(filename, f_stderr, Py_PRINT_RAW) < 0)
510 goto error;
511 if (PyFile_WriteString(lineno_str, f_stderr) < 0)
512 goto error;
513 if (PyFile_WriteObject(name, f_stderr, Py_PRINT_RAW) < 0)
514 goto error;
515 if (PyFile_WriteString(": ", f_stderr) < 0)
516 goto error;
517 if (PyFile_WriteObject(text, f_stderr, Py_PRINT_RAW) < 0)
518 goto error;
519 if (PyFile_WriteString("\n", f_stderr) < 0)
520 goto error;
521 Py_CLEAR(name);
Christian Heimes33fe8092008-04-13 13:53:33 +0000522
523 /* Print " source_line\n" */
Christian Heimes33fe8092008-04-13 13:53:33 +0000524 if (sourceline) {
Victor Stinnera4c704b2013-10-29 23:43:41 +0100525 int kind;
Serhiy Storchakacd8295f2020-04-11 10:48:40 +0300526 const void *data;
Victor Stinnera4c704b2013-10-29 23:43:41 +0100527 Py_ssize_t i, len;
528 Py_UCS4 ch;
529 PyObject *truncated;
Christian Heimes33fe8092008-04-13 13:53:33 +0000530
Victor Stinnera4c704b2013-10-29 23:43:41 +0100531 if (PyUnicode_READY(sourceline) < 1)
532 goto error;
533
534 kind = PyUnicode_KIND(sourceline);
535 data = PyUnicode_DATA(sourceline);
536 len = PyUnicode_GET_LENGTH(sourceline);
537 for (i=0; i<len; i++) {
538 ch = PyUnicode_READ(kind, data, i);
539 if (ch != ' ' && ch != '\t' && ch != '\014')
540 break;
541 }
542
543 truncated = PyUnicode_Substring(sourceline, i, len);
544 if (truncated == NULL)
545 goto error;
546
547 PyFile_WriteObject(sourceline, f_stderr, Py_PRINT_RAW);
548 Py_DECREF(truncated);
Christian Heimes33fe8092008-04-13 13:53:33 +0000549 PyFile_WriteString("\n", f_stderr);
550 }
Victor Stinner78e2c982013-07-16 01:54:37 +0200551 else {
552 _Py_DisplaySourceLine(f_stderr, filename, lineno, 2);
553 }
Victor Stinnera4c704b2013-10-29 23:43:41 +0100554
555error:
Victor Stinnerae233ea2013-10-31 14:51:38 +0100556 Py_XDECREF(name);
Christian Heimes33fe8092008-04-13 13:53:33 +0000557 PyErr_Clear();
558}
559
Victor Stinner1231a462016-03-19 00:47:17 +0100560static int
561call_show_warning(PyObject *category, PyObject *text, PyObject *message,
562 PyObject *filename, int lineno, PyObject *lineno_obj,
Victor Stinner914cde82016-03-19 01:03:51 +0100563 PyObject *sourceline, PyObject *source)
Victor Stinner1231a462016-03-19 00:47:17 +0100564{
565 PyObject *show_fn, *msg, *res, *warnmsg_cls = NULL;
Victor Stinner82656272017-11-22 23:51:42 +0100566 _Py_IDENTIFIER(_showwarnmsg);
567 _Py_IDENTIFIER(WarningMessage);
Victor Stinner1231a462016-03-19 00:47:17 +0100568
Victor Stinnere98445a2016-03-23 00:54:48 +0100569 /* If the source parameter is set, try to get the Python implementation.
570 The Python implementation is able to log the traceback where the source
luzpaza5293b42017-11-05 07:37:50 -0600571 was allocated, whereas the C implementation doesn't. */
Victor Stinner82656272017-11-22 23:51:42 +0100572 show_fn = get_warnings_attr(&PyId__showwarnmsg, source != NULL);
Victor Stinner1231a462016-03-19 00:47:17 +0100573 if (show_fn == NULL) {
574 if (PyErr_Occurred())
575 return -1;
576 show_warning(filename, lineno, text, category, sourceline);
577 return 0;
578 }
579
580 if (!PyCallable_Check(show_fn)) {
581 PyErr_SetString(PyExc_TypeError,
582 "warnings._showwarnmsg() must be set to a callable");
583 goto error;
584 }
585
Victor Stinner82656272017-11-22 23:51:42 +0100586 warnmsg_cls = get_warnings_attr(&PyId_WarningMessage, 0);
Victor Stinner1231a462016-03-19 00:47:17 +0100587 if (warnmsg_cls == NULL) {
Serhiy Storchakad4f84802017-11-11 15:19:47 +0200588 if (!PyErr_Occurred()) {
589 PyErr_SetString(PyExc_RuntimeError,
590 "unable to get warnings.WarningMessage");
591 }
Victor Stinner1231a462016-03-19 00:47:17 +0100592 goto error;
593 }
594
595 msg = PyObject_CallFunctionObjArgs(warnmsg_cls, message, category,
Victor Stinner914cde82016-03-19 01:03:51 +0100596 filename, lineno_obj, Py_None, Py_None, source,
Victor Stinner1231a462016-03-19 00:47:17 +0100597 NULL);
598 Py_DECREF(warnmsg_cls);
599 if (msg == NULL)
600 goto error;
601
Petr Viktorinffd97532020-02-11 17:46:57 +0100602 res = PyObject_CallOneArg(show_fn, msg);
Victor Stinner1231a462016-03-19 00:47:17 +0100603 Py_DECREF(show_fn);
604 Py_DECREF(msg);
605
606 if (res == NULL)
607 return -1;
608
609 Py_DECREF(res);
610 return 0;
611
612error:
613 Py_XDECREF(show_fn);
614 return -1;
615}
616
Christian Heimes33fe8092008-04-13 13:53:33 +0000617static PyObject *
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618warn_explicit(PyObject *category, PyObject *message,
Christian Heimes33fe8092008-04-13 13:53:33 +0000619 PyObject *filename, int lineno,
Victor Stinner914cde82016-03-19 01:03:51 +0100620 PyObject *module, PyObject *registry, PyObject *sourceline,
621 PyObject *source)
Christian Heimes33fe8092008-04-13 13:53:33 +0000622{
623 PyObject *key = NULL, *text = NULL, *result = NULL, *lineno_obj = NULL;
Benjamin Petersondeff2b72015-05-03 11:23:37 -0400624 PyObject *item = NULL;
Victor Stinnera4c704b2013-10-29 23:43:41 +0100625 PyObject *action;
Christian Heimes33fe8092008-04-13 13:53:33 +0000626 int rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627
Victor Stinnerdcdd05b2013-11-01 00:55:30 +0100628 /* module can be None if a warning is emitted late during Python shutdown.
629 In this case, the Python warnings module was probably unloaded, filters
630 are no more available to choose as action. It is safer to ignore the
631 warning and do nothing. */
632 if (module == Py_None)
633 Py_RETURN_NONE;
634
Brett Cannondb734912008-06-27 00:52:15 +0000635 if (registry && !PyDict_Check(registry) && (registry != Py_None)) {
Oren Milman252033d2017-09-11 09:28:39 +0300636 PyErr_SetString(PyExc_TypeError, "'registry' must be a dict or None");
Brett Cannondb734912008-06-27 00:52:15 +0000637 return NULL;
638 }
Christian Heimes33fe8092008-04-13 13:53:33 +0000639
640 /* Normalize module. */
641 if (module == NULL) {
642 module = normalize_module(filename);
643 if (module == NULL)
644 return NULL;
645 }
646 else
647 Py_INCREF(module);
648
649 /* Normalize message. */
650 Py_INCREF(message); /* DECREF'ed in cleanup. */
651 rc = PyObject_IsInstance(message, PyExc_Warning);
652 if (rc == -1) {
653 goto cleanup;
654 }
655 if (rc == 1) {
656 text = PyObject_Str(message);
Hirokazu Yamamoto1c0c0032009-07-17 06:55:42 +0000657 if (text == NULL)
658 goto cleanup;
Victor Stinnera102ed72020-02-07 02:24:48 +0100659 category = (PyObject*)Py_TYPE(message);
Christian Heimes33fe8092008-04-13 13:53:33 +0000660 }
661 else {
662 text = message;
Petr Viktorinffd97532020-02-11 17:46:57 +0100663 message = PyObject_CallOneArg(category, message);
Brett Cannondb734912008-06-27 00:52:15 +0000664 if (message == NULL)
665 goto cleanup;
Christian Heimes33fe8092008-04-13 13:53:33 +0000666 }
667
668 lineno_obj = PyLong_FromLong(lineno);
669 if (lineno_obj == NULL)
670 goto cleanup;
671
Victor Stinner22f18752016-12-09 18:08:18 +0100672 if (source == Py_None) {
673 source = NULL;
674 }
675
Christian Heimes33fe8092008-04-13 13:53:33 +0000676 /* Create key. */
677 key = PyTuple_Pack(3, text, category, lineno_obj);
678 if (key == NULL)
679 goto cleanup;
680
Brett Cannondb734912008-06-27 00:52:15 +0000681 if ((registry != NULL) && (registry != Py_None)) {
Christian Heimes33fe8092008-04-13 13:53:33 +0000682 rc = already_warned(registry, key, 0);
683 if (rc == -1)
684 goto cleanup;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 else if (rc == 1)
Christian Heimes33fe8092008-04-13 13:53:33 +0000686 goto return_none;
687 /* Else this warning hasn't been generated before. */
688 }
689
690 action = get_filter(category, text, lineno, module, &item);
691 if (action == NULL)
692 goto cleanup;
693
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200694 if (_PyUnicode_EqualToASCIIString(action, "error")) {
Christian Heimes33fe8092008-04-13 13:53:33 +0000695 PyErr_SetObject(category, message);
696 goto cleanup;
697 }
698
Victor Stinnerc9758782017-11-27 16:57:07 +0100699 if (_PyUnicode_EqualToASCIIString(action, "ignore")) {
700 goto return_none;
701 }
702
Christian Heimes33fe8092008-04-13 13:53:33 +0000703 /* Store in the registry that we've been here, *except* when the action
704 is "always". */
705 rc = 0;
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200706 if (!_PyUnicode_EqualToASCIIString(action, "always")) {
Brett Cannondb734912008-06-27 00:52:15 +0000707 if (registry != NULL && registry != Py_None &&
Victor Stinnerc9758782017-11-27 16:57:07 +0100708 PyDict_SetItem(registry, key, Py_True) < 0)
709 {
Christian Heimes33fe8092008-04-13 13:53:33 +0000710 goto cleanup;
Victor Stinnerc9758782017-11-27 16:57:07 +0100711 }
712
713 if (_PyUnicode_EqualToASCIIString(action, "once")) {
Brett Cannondb734912008-06-27 00:52:15 +0000714 if (registry == NULL || registry == Py_None) {
Victor Stinner66b79732020-03-02 15:02:18 +0100715 WarningsState *st = warnings_get_state();
Eric Snow86ea5812019-05-10 13:29:55 -0400716 if (st == NULL) {
717 goto cleanup;
718 }
719 registry = get_once_registry(st);
Christian Heimes33fe8092008-04-13 13:53:33 +0000720 if (registry == NULL)
721 goto cleanup;
722 }
Eric Snow86ea5812019-05-10 13:29:55 -0400723 /* WarningsState.once_registry[(text, category)] = 1 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 rc = update_registry(registry, text, category, 0);
Christian Heimes33fe8092008-04-13 13:53:33 +0000725 }
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200726 else if (_PyUnicode_EqualToASCIIString(action, "module")) {
Christian Heimes33fe8092008-04-13 13:53:33 +0000727 /* registry[(text, category, 0)] = 1 */
Brett Cannondb734912008-06-27 00:52:15 +0000728 if (registry != NULL && registry != Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 rc = update_registry(registry, text, category, 0);
Christian Heimes33fe8092008-04-13 13:53:33 +0000730 }
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200731 else if (!_PyUnicode_EqualToASCIIString(action, "default")) {
Christian Heimes33fe8092008-04-13 13:53:33 +0000732 PyErr_Format(PyExc_RuntimeError,
Victor Stinnera4c704b2013-10-29 23:43:41 +0100733 "Unrecognized action (%R) in warnings.filters:\n %R",
734 action, item);
Christian Heimes33fe8092008-04-13 13:53:33 +0000735 goto cleanup;
736 }
737 }
738
Christian Heimes1a8501c2008-10-02 19:56:01 +0000739 if (rc == 1) /* Already warned for this module. */
Christian Heimes33fe8092008-04-13 13:53:33 +0000740 goto return_none;
741 if (rc == 0) {
Victor Stinner1231a462016-03-19 00:47:17 +0100742 if (call_show_warning(category, text, message, filename, lineno,
Victor Stinner914cde82016-03-19 01:03:51 +0100743 lineno_obj, sourceline, source) < 0)
Victor Stinner1231a462016-03-19 00:47:17 +0100744 goto cleanup;
Christian Heimes33fe8092008-04-13 13:53:33 +0000745 }
746 else /* if (rc == -1) */
747 goto cleanup;
748
749 return_none:
750 result = Py_None;
751 Py_INCREF(result);
752
753 cleanup:
Benjamin Petersondeff2b72015-05-03 11:23:37 -0400754 Py_XDECREF(item);
Christian Heimes33fe8092008-04-13 13:53:33 +0000755 Py_XDECREF(key);
756 Py_XDECREF(text);
757 Py_XDECREF(lineno_obj);
758 Py_DECREF(module);
Brett Cannondb734912008-06-27 00:52:15 +0000759 Py_XDECREF(message);
Christian Heimes33fe8092008-04-13 13:53:33 +0000760 return result; /* Py_None or NULL. */
761}
762
Larry Hastings714e4932015-09-06 00:39:37 -0700763static int
764is_internal_frame(PyFrameObject *frame)
765{
766 static PyObject *importlib_string = NULL;
767 static PyObject *bootstrap_string = NULL;
Larry Hastings714e4932015-09-06 00:39:37 -0700768 int contains;
769
770 if (importlib_string == NULL) {
771 importlib_string = PyUnicode_FromString("importlib");
772 if (importlib_string == NULL) {
773 return 0;
774 }
775
776 bootstrap_string = PyUnicode_FromString("_bootstrap");
777 if (bootstrap_string == NULL) {
778 Py_DECREF(importlib_string);
779 return 0;
780 }
781 Py_INCREF(importlib_string);
782 Py_INCREF(bootstrap_string);
783 }
784
Victor Stinnera42ca742020-04-28 19:01:31 +0200785 if (frame == NULL) {
Larry Hastings714e4932015-09-06 00:39:37 -0700786 return 0;
787 }
Victor Stinnera42ca742020-04-28 19:01:31 +0200788
789 PyCodeObject *code = PyFrame_GetCode(frame);
Victor Stinnera42ca742020-04-28 19:01:31 +0200790 PyObject *filename = code->co_filename;
Victor Stinner8852ad42020-04-29 01:28:13 +0200791 Py_DECREF(code);
792
Victor Stinnera42ca742020-04-28 19:01:31 +0200793 if (filename == NULL) {
794 return 0;
795 }
Larry Hastings714e4932015-09-06 00:39:37 -0700796 if (!PyUnicode_Check(filename)) {
797 return 0;
798 }
Victor Stinnera42ca742020-04-28 19:01:31 +0200799
Larry Hastings714e4932015-09-06 00:39:37 -0700800 contains = PyUnicode_Contains(filename, importlib_string);
801 if (contains < 0) {
802 return 0;
803 }
804 else if (contains > 0) {
805 contains = PyUnicode_Contains(filename, bootstrap_string);
806 if (contains < 0) {
807 return 0;
808 }
809 else if (contains > 0) {
810 return 1;
811 }
812 }
813
814 return 0;
815}
816
817static PyFrameObject *
818next_external_frame(PyFrameObject *frame)
819{
820 do {
Victor Stinner70364772020-04-29 03:28:46 +0200821 PyFrameObject *back = PyFrame_GetBack(frame);
822 Py_DECREF(frame);
823 frame = back;
Larry Hastings714e4932015-09-06 00:39:37 -0700824 } while (frame != NULL && is_internal_frame(frame));
825
826 return frame;
827}
828
Christian Heimes33fe8092008-04-13 13:53:33 +0000829/* filename, module, and registry are new refs, globals is borrowed */
830/* Returns 0 on error (no new refs), 1 on success */
831static int
832setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno,
833 PyObject **module, PyObject **registry)
834{
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200835 _Py_IDENTIFIER(__warningregistry__);
Christian Heimes33fe8092008-04-13 13:53:33 +0000836 PyObject *globals;
837
Thomas Kluyver11a89662018-06-08 21:28:37 +0200838 /* Setup globals, filename and lineno. */
Victor Stinner70364772020-04-29 03:28:46 +0200839 PyThreadState *tstate = _PyThreadState_GET();
840 PyFrameObject *f = PyThreadState_GetFrame(tstate);
Larry Hastings714e4932015-09-06 00:39:37 -0700841 // Stack level comparisons to Python code is off by one as there is no
842 // warnings-related stack level to avoid.
843 if (stack_level <= 0 || is_internal_frame(f)) {
844 while (--stack_level > 0 && f != NULL) {
Victor Stinner70364772020-04-29 03:28:46 +0200845 PyFrameObject *back = PyFrame_GetBack(f);
846 Py_DECREF(f);
847 f = back;
Larry Hastings714e4932015-09-06 00:39:37 -0700848 }
849 }
850 else {
851 while (--stack_level > 0 && f != NULL) {
852 f = next_external_frame(f);
853 }
854 }
Christian Heimes33fe8092008-04-13 13:53:33 +0000855
856 if (f == NULL) {
Victor Stinner81a7be32020-04-14 15:14:01 +0200857 globals = _PyInterpreterState_GET()->sysdict;
Thomas Kluyver11a89662018-06-08 21:28:37 +0200858 *filename = PyUnicode_FromString("sys");
Christian Heimes33fe8092008-04-13 13:53:33 +0000859 *lineno = 1;
860 }
861 else {
862 globals = f->f_globals;
Victor Stinner8852ad42020-04-29 01:28:13 +0200863 PyCodeObject *code = PyFrame_GetCode(f);
864 *filename = code->co_filename;
865 Py_DECREF(code);
Thomas Kluyver11a89662018-06-08 21:28:37 +0200866 Py_INCREF(*filename);
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +0000867 *lineno = PyFrame_GetLineNumber(f);
Victor Stinner70364772020-04-29 03:28:46 +0200868 Py_DECREF(f);
Christian Heimes33fe8092008-04-13 13:53:33 +0000869 }
870
871 *module = NULL;
872
873 /* Setup registry. */
874 assert(globals != NULL);
875 assert(PyDict_Check(globals));
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200876 *registry = _PyDict_GetItemIdWithError(globals, &PyId___warningregistry__);
Christian Heimes33fe8092008-04-13 13:53:33 +0000877 if (*registry == NULL) {
878 int rc;
879
Victor Stinner70364772020-04-29 03:28:46 +0200880 if (_PyErr_Occurred(tstate)) {
Serhiy Storchaka2d2f8552020-03-02 22:05:08 +0200881 goto handle_error;
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200882 }
Christian Heimes33fe8092008-04-13 13:53:33 +0000883 *registry = PyDict_New();
884 if (*registry == NULL)
Serhiy Storchaka2d2f8552020-03-02 22:05:08 +0200885 goto handle_error;
Christian Heimes33fe8092008-04-13 13:53:33 +0000886
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200887 rc = _PyDict_SetItemId(globals, &PyId___warningregistry__, *registry);
Christian Heimes33fe8092008-04-13 13:53:33 +0000888 if (rc < 0)
889 goto handle_error;
890 }
891 else
892 Py_INCREF(*registry);
893
894 /* Setup module. */
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200895 *module = _PyDict_GetItemIdWithError(globals, &PyId___name__);
Oren Milman5d3e8002017-09-24 21:28:42 +0300896 if (*module == Py_None || (*module != NULL && PyUnicode_Check(*module))) {
897 Py_INCREF(*module);
898 }
Victor Stinner70364772020-04-29 03:28:46 +0200899 else if (_PyErr_Occurred(tstate)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200900 goto handle_error;
901 }
Oren Milman5d3e8002017-09-24 21:28:42 +0300902 else {
Christian Heimes33fe8092008-04-13 13:53:33 +0000903 *module = PyUnicode_FromString("<string>");
904 if (*module == NULL)
905 goto handle_error;
906 }
Christian Heimes33fe8092008-04-13 13:53:33 +0000907
Christian Heimes33fe8092008-04-13 13:53:33 +0000908 return 1;
909
910 handle_error:
Christian Heimes33fe8092008-04-13 13:53:33 +0000911 Py_XDECREF(*registry);
912 Py_XDECREF(*module);
Serhiy Storchakaae75a292020-03-03 19:43:29 +0200913 Py_DECREF(*filename);
Christian Heimes33fe8092008-04-13 13:53:33 +0000914 return 0;
915}
916
917static PyObject *
918get_category(PyObject *message, PyObject *category)
919{
920 int rc;
921
922 /* Get category. */
923 rc = PyObject_IsInstance(message, PyExc_Warning);
924 if (rc == -1)
925 return NULL;
926
927 if (rc == 1)
Victor Stinnera102ed72020-02-07 02:24:48 +0100928 category = (PyObject*)Py_TYPE(message);
Berker Peksagd8089e02014-07-11 19:50:25 +0300929 else if (category == NULL || category == Py_None)
Christian Heimes33fe8092008-04-13 13:53:33 +0000930 category = PyExc_UserWarning;
931
932 /* Validate category. */
933 rc = PyObject_IsSubclass(category, PyExc_Warning);
Berker Peksagd8089e02014-07-11 19:50:25 +0300934 /* category is not a subclass of PyExc_Warning or
935 PyObject_IsSubclass raised an error */
936 if (rc == -1 || rc == 0) {
937 PyErr_Format(PyExc_TypeError,
938 "category must be a Warning subclass, not '%s'",
939 Py_TYPE(category)->tp_name);
Christian Heimes33fe8092008-04-13 13:53:33 +0000940 return NULL;
941 }
942
943 return category;
944}
945
946static PyObject *
Victor Stinner914cde82016-03-19 01:03:51 +0100947do_warn(PyObject *message, PyObject *category, Py_ssize_t stack_level,
948 PyObject *source)
Christian Heimes33fe8092008-04-13 13:53:33 +0000949{
950 PyObject *filename, *module, *registry, *res;
951 int lineno;
952
953 if (!setup_context(stack_level, &filename, &lineno, &module, &registry))
954 return NULL;
955
Victor Stinnerdcdd05b2013-11-01 00:55:30 +0100956 res = warn_explicit(category, message, filename, lineno, module, registry,
Victor Stinner914cde82016-03-19 01:03:51 +0100957 NULL, source);
Christian Heimes33fe8092008-04-13 13:53:33 +0000958 Py_DECREF(filename);
959 Py_DECREF(registry);
960 Py_DECREF(module);
961 return res;
962}
963
Victor Stinner22f18752016-12-09 18:08:18 +0100964/*[clinic input]
965warn as warnings_warn
966
967 message: object
968 category: object = None
969 stacklevel: Py_ssize_t = 1
970 source: object = None
971
972Issue a warning, or maybe ignore it or raise an exception.
973[clinic start generated code]*/
974
Christian Heimes33fe8092008-04-13 13:53:33 +0000975static PyObject *
Victor Stinner22f18752016-12-09 18:08:18 +0100976warnings_warn_impl(PyObject *module, PyObject *message, PyObject *category,
977 Py_ssize_t stacklevel, PyObject *source)
978/*[clinic end generated code: output=31ed5ab7d8d760b2 input=bfdf5cf99f6c4edd]*/
Christian Heimes33fe8092008-04-13 13:53:33 +0000979{
Christian Heimes33fe8092008-04-13 13:53:33 +0000980 category = get_category(message, category);
981 if (category == NULL)
982 return NULL;
Victor Stinner22f18752016-12-09 18:08:18 +0100983 return do_warn(message, category, stacklevel, source);
Christian Heimes33fe8092008-04-13 13:53:33 +0000984}
985
986static PyObject *
Serhiy Storchakad4f84802017-11-11 15:19:47 +0200987get_source_line(PyObject *module_globals, int lineno)
988{
989 _Py_IDENTIFIER(get_source);
990 _Py_IDENTIFIER(__loader__);
Serhiy Storchakad4f84802017-11-11 15:19:47 +0200991 PyObject *loader;
992 PyObject *module_name;
993 PyObject *get_source;
994 PyObject *source;
995 PyObject *source_list;
996 PyObject *source_line;
997
998 /* Check/get the requisite pieces needed for the loader. */
999 loader = _PyDict_GetItemIdWithError(module_globals, &PyId___loader__);
1000 if (loader == NULL) {
1001 return NULL;
1002 }
1003 Py_INCREF(loader);
1004 module_name = _PyDict_GetItemIdWithError(module_globals, &PyId___name__);
1005 if (!module_name) {
1006 Py_DECREF(loader);
1007 return NULL;
1008 }
1009 Py_INCREF(module_name);
1010
1011 /* Make sure the loader implements the optional get_source() method. */
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001012 (void)_PyObject_LookupAttrId(loader, &PyId_get_source, &get_source);
Serhiy Storchakad4f84802017-11-11 15:19:47 +02001013 Py_DECREF(loader);
1014 if (!get_source) {
1015 Py_DECREF(module_name);
Serhiy Storchakad4f84802017-11-11 15:19:47 +02001016 return NULL;
1017 }
1018 /* Call get_source() to get the source code. */
Petr Viktorinffd97532020-02-11 17:46:57 +01001019 source = PyObject_CallOneArg(get_source, module_name);
Serhiy Storchakad4f84802017-11-11 15:19:47 +02001020 Py_DECREF(get_source);
1021 Py_DECREF(module_name);
1022 if (!source) {
1023 return NULL;
1024 }
1025 if (source == Py_None) {
1026 Py_DECREF(source);
1027 return NULL;
1028 }
1029
1030 /* Split the source into lines. */
1031 source_list = PyUnicode_Splitlines(source, 0);
1032 Py_DECREF(source);
1033 if (!source_list) {
1034 return NULL;
1035 }
1036
1037 /* Get the source line. */
1038 source_line = PyList_GetItem(source_list, lineno-1);
1039 Py_XINCREF(source_line);
1040 Py_DECREF(source_list);
1041 return source_line;
1042}
1043
1044static PyObject *
Christian Heimes33fe8092008-04-13 13:53:33 +00001045warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds)
1046{
1047 static char *kwd_list[] = {"message", "category", "filename", "lineno",
Victor Stinner914cde82016-03-19 01:03:51 +01001048 "module", "registry", "module_globals",
1049 "source", 0};
Christian Heimes33fe8092008-04-13 13:53:33 +00001050 PyObject *message;
1051 PyObject *category;
1052 PyObject *filename;
1053 int lineno;
1054 PyObject *module = NULL;
1055 PyObject *registry = NULL;
1056 PyObject *module_globals = NULL;
Victor Stinner914cde82016-03-19 01:03:51 +01001057 PyObject *sourceobj = NULL;
Serhiy Storchakad4f84802017-11-11 15:19:47 +02001058 PyObject *source_line = NULL;
1059 PyObject *returned;
Christian Heimes33fe8092008-04-13 13:53:33 +00001060
Victor Stinner914cde82016-03-19 01:03:51 +01001061 if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOUi|OOOO:warn_explicit",
Christian Heimes33fe8092008-04-13 13:53:33 +00001062 kwd_list, &message, &category, &filename, &lineno, &module,
Victor Stinner914cde82016-03-19 01:03:51 +01001063 &registry, &module_globals, &sourceobj))
Christian Heimes33fe8092008-04-13 13:53:33 +00001064 return NULL;
1065
Victor Stinnerb0565622018-05-15 20:42:12 +02001066 if (module_globals && module_globals != Py_None) {
1067 if (!PyDict_Check(module_globals)) {
1068 PyErr_Format(PyExc_TypeError,
1069 "module_globals must be a dict, not '%.200s'",
1070 Py_TYPE(module_globals)->tp_name);
1071 return NULL;
1072 }
1073
Serhiy Storchakad4f84802017-11-11 15:19:47 +02001074 source_line = get_source_line(module_globals, lineno);
1075 if (source_line == NULL && PyErr_Occurred()) {
Christian Heimes33fe8092008-04-13 13:53:33 +00001076 return NULL;
1077 }
Christian Heimes33fe8092008-04-13 13:53:33 +00001078 }
Serhiy Storchakad4f84802017-11-11 15:19:47 +02001079 returned = warn_explicit(category, message, filename, lineno, module,
1080 registry, source_line, sourceobj);
1081 Py_XDECREF(source_line);
1082 return returned;
Christian Heimes33fe8092008-04-13 13:53:33 +00001083}
1084
Antoine Pitroucb0a0062014-09-18 02:40:46 +02001085static PyObject *
1086warnings_filters_mutated(PyObject *self, PyObject *args)
1087{
Victor Stinner66b79732020-03-02 15:02:18 +01001088 WarningsState *st = warnings_get_state();
Eric Snow86ea5812019-05-10 13:29:55 -04001089 if (st == NULL) {
1090 return NULL;
1091 }
1092 st->filters_version++;
Antoine Pitroucb0a0062014-09-18 02:40:46 +02001093 Py_RETURN_NONE;
1094}
1095
Christian Heimes33fe8092008-04-13 13:53:33 +00001096
1097/* Function to issue a warning message; may raise an exception. */
Victor Stinner4a2b7a12010-08-13 14:03:48 +00001098
1099static int
1100warn_unicode(PyObject *category, PyObject *message,
Victor Stinner914cde82016-03-19 01:03:51 +01001101 Py_ssize_t stack_level, PyObject *source)
Christian Heimes33fe8092008-04-13 13:53:33 +00001102{
1103 PyObject *res;
Christian Heimes33fe8092008-04-13 13:53:33 +00001104
1105 if (category == NULL)
1106 category = PyExc_RuntimeWarning;
1107
Victor Stinner914cde82016-03-19 01:03:51 +01001108 res = do_warn(message, category, stack_level, source);
Christian Heimes33fe8092008-04-13 13:53:33 +00001109 if (res == NULL)
1110 return -1;
1111 Py_DECREF(res);
1112
1113 return 0;
1114}
1115
Victor Stinner914cde82016-03-19 01:03:51 +01001116static int
1117_PyErr_WarnFormatV(PyObject *source,
1118 PyObject *category, Py_ssize_t stack_level,
1119 const char *format, va_list vargs)
1120{
1121 PyObject *message;
1122 int res;
1123
1124 message = PyUnicode_FromFormatV(format, vargs);
1125 if (message == NULL)
1126 return -1;
1127
1128 res = warn_unicode(category, message, stack_level, source);
1129 Py_DECREF(message);
1130 return res;
1131}
1132
Victor Stinner4a2b7a12010-08-13 14:03:48 +00001133int
1134PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level,
1135 const char *format, ...)
1136{
Victor Stinner914cde82016-03-19 01:03:51 +01001137 int res;
Victor Stinner4a2b7a12010-08-13 14:03:48 +00001138 va_list vargs;
1139
1140#ifdef HAVE_STDARG_PROTOTYPES
1141 va_start(vargs, format);
1142#else
1143 va_start(vargs);
1144#endif
Victor Stinner914cde82016-03-19 01:03:51 +01001145 res = _PyErr_WarnFormatV(NULL, category, stack_level, format, vargs);
Victor Stinner4a2b7a12010-08-13 14:03:48 +00001146 va_end(vargs);
Victor Stinner914cde82016-03-19 01:03:51 +01001147 return res;
Victor Stinner4a2b7a12010-08-13 14:03:48 +00001148}
1149
Victor Stinner8d84adc2020-03-31 17:25:12 +02001150static int
1151_PyErr_WarnFormat(PyObject *source, PyObject *category, Py_ssize_t stack_level,
1152 const char *format, ...)
1153{
1154 int res;
1155 va_list vargs;
1156
1157#ifdef HAVE_STDARG_PROTOTYPES
1158 va_start(vargs, format);
1159#else
1160 va_start(vargs);
1161#endif
1162 res = _PyErr_WarnFormatV(source, category, stack_level, format, vargs);
1163 va_end(vargs);
1164 return res;
1165}
1166
Victor Stinner4a2b7a12010-08-13 14:03:48 +00001167int
Victor Stinner914cde82016-03-19 01:03:51 +01001168PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level,
1169 const char *format, ...)
1170{
1171 int res;
1172 va_list vargs;
1173
1174#ifdef HAVE_STDARG_PROTOTYPES
1175 va_start(vargs, format);
1176#else
1177 va_start(vargs);
1178#endif
1179 res = _PyErr_WarnFormatV(source, PyExc_ResourceWarning,
1180 stack_level, format, vargs);
1181 va_end(vargs);
1182 return res;
1183}
1184
1185
1186int
Victor Stinner4a2b7a12010-08-13 14:03:48 +00001187PyErr_WarnEx(PyObject *category, const char *text, Py_ssize_t stack_level)
1188{
1189 int ret;
1190 PyObject *message = PyUnicode_FromString(text);
1191 if (message == NULL)
1192 return -1;
Victor Stinner914cde82016-03-19 01:03:51 +01001193 ret = warn_unicode(category, message, stack_level, NULL);
Victor Stinner4a2b7a12010-08-13 14:03:48 +00001194 Py_DECREF(message);
1195 return ret;
1196}
1197
Ezio Melotti42da6632011-03-15 05:18:48 +02001198/* PyErr_Warn is only for backwards compatibility and will be removed.
Christian Heimes33fe8092008-04-13 13:53:33 +00001199 Use PyErr_WarnEx instead. */
1200
1201#undef PyErr_Warn
1202
Benjamin Petersone5024512018-09-12 12:06:42 -07001203int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001204PyErr_Warn(PyObject *category, const char *text)
Christian Heimes33fe8092008-04-13 13:53:33 +00001205{
1206 return PyErr_WarnEx(category, text, 1);
1207}
1208
1209/* Warning with explicit origin */
1210int
Victor Stinner14e461d2013-08-26 22:28:21 +02001211PyErr_WarnExplicitObject(PyObject *category, PyObject *message,
1212 PyObject *filename, int lineno,
1213 PyObject *module, PyObject *registry)
1214{
1215 PyObject *res;
1216 if (category == NULL)
1217 category = PyExc_RuntimeWarning;
1218 res = warn_explicit(category, message, filename, lineno,
Victor Stinner914cde82016-03-19 01:03:51 +01001219 module, registry, NULL, NULL);
Victor Stinner14e461d2013-08-26 22:28:21 +02001220 if (res == NULL)
1221 return -1;
1222 Py_DECREF(res);
1223 return 0;
1224}
1225
1226int
Christian Heimes33fe8092008-04-13 13:53:33 +00001227PyErr_WarnExplicit(PyObject *category, const char *text,
1228 const char *filename_str, int lineno,
1229 const char *module_str, PyObject *registry)
1230{
Christian Heimes33fe8092008-04-13 13:53:33 +00001231 PyObject *message = PyUnicode_FromString(text);
Victor Stinnercb428f02010-12-27 20:10:36 +00001232 PyObject *filename = PyUnicode_DecodeFSDefault(filename_str);
Christian Heimes33fe8092008-04-13 13:53:33 +00001233 PyObject *module = NULL;
1234 int ret = -1;
1235
1236 if (message == NULL || filename == NULL)
1237 goto exit;
1238 if (module_str != NULL) {
1239 module = PyUnicode_FromString(module_str);
Antoine Pitrou070cb3c2013-05-08 13:23:25 +02001240 if (module == NULL)
1241 goto exit;
Christian Heimes33fe8092008-04-13 13:53:33 +00001242 }
1243
Victor Stinner14e461d2013-08-26 22:28:21 +02001244 ret = PyErr_WarnExplicitObject(category, message, filename, lineno,
1245 module, registry);
Christian Heimes33fe8092008-04-13 13:53:33 +00001246
1247 exit:
1248 Py_XDECREF(message);
1249 Py_XDECREF(module);
1250 Py_XDECREF(filename);
1251 return ret;
1252}
1253
Antoine Pitrou070cb3c2013-05-08 13:23:25 +02001254int
1255PyErr_WarnExplicitFormat(PyObject *category,
1256 const char *filename_str, int lineno,
1257 const char *module_str, PyObject *registry,
1258 const char *format, ...)
1259{
1260 PyObject *message;
1261 PyObject *module = NULL;
1262 PyObject *filename = PyUnicode_DecodeFSDefault(filename_str);
1263 int ret = -1;
1264 va_list vargs;
1265
1266 if (filename == NULL)
1267 goto exit;
1268 if (module_str != NULL) {
1269 module = PyUnicode_FromString(module_str);
1270 if (module == NULL)
1271 goto exit;
1272 }
1273
1274#ifdef HAVE_STDARG_PROTOTYPES
1275 va_start(vargs, format);
1276#else
1277 va_start(vargs);
1278#endif
1279 message = PyUnicode_FromFormatV(format, vargs);
1280 if (message != NULL) {
1281 PyObject *res;
1282 res = warn_explicit(category, message, filename, lineno,
Victor Stinner914cde82016-03-19 01:03:51 +01001283 module, registry, NULL, NULL);
Antoine Pitrou070cb3c2013-05-08 13:23:25 +02001284 Py_DECREF(message);
1285 if (res != NULL) {
1286 Py_DECREF(res);
1287 ret = 0;
1288 }
1289 }
1290 va_end(vargs);
1291exit:
1292 Py_XDECREF(module);
1293 Py_XDECREF(filename);
1294 return ret;
1295}
1296
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001297void
1298_PyErr_WarnUnawaitedCoroutine(PyObject *coro)
1299{
1300 /* First, we attempt to funnel the warning through
1301 warnings._warn_unawaited_coroutine.
1302
1303 This could raise an exception, due to:
1304 - a bug
1305 - some kind of shutdown-related brokenness
1306 - succeeding, but with an "error" warning filter installed, so the
1307 warning is converted into a RuntimeWarning exception
1308
1309 In the first two cases, we want to print the error (so we know what it
1310 is!), and then print a warning directly as a fallback. In the last
1311 case, we want to print the error (since it's the warning!), but *not*
1312 do a fallback. And after we print the error we can't check for what
1313 type of error it was (because PyErr_WriteUnraisable clears it), so we
1314 need a flag to keep track.
1315
1316 Since this is called from __del__ context, it's careful to never raise
1317 an exception.
1318 */
1319 _Py_IDENTIFIER(_warn_unawaited_coroutine);
1320 int warned = 0;
1321 PyObject *fn = get_warnings_attr(&PyId__warn_unawaited_coroutine, 1);
1322 if (fn) {
Petr Viktorinffd97532020-02-11 17:46:57 +01001323 PyObject *res = PyObject_CallOneArg(fn, coro);
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001324 Py_DECREF(fn);
1325 if (res || PyErr_ExceptionMatches(PyExc_RuntimeWarning)) {
1326 warned = 1;
1327 }
1328 Py_XDECREF(res);
1329 }
1330
1331 if (PyErr_Occurred()) {
1332 PyErr_WriteUnraisable(coro);
1333 }
1334 if (!warned) {
Victor Stinner8d84adc2020-03-31 17:25:12 +02001335 if (_PyErr_WarnFormat(coro, PyExc_RuntimeWarning, 1,
1336 "coroutine '%S' was never awaited",
1337 ((PyCoroObject *)coro)->cr_qualname) < 0)
Yury Selivanov35103342018-01-21 20:47:04 -05001338 {
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -08001339 PyErr_WriteUnraisable(coro);
1340 }
1341 }
1342}
Christian Heimes33fe8092008-04-13 13:53:33 +00001343
Christian Heimes33fe8092008-04-13 13:53:33 +00001344PyDoc_STRVAR(warn_explicit_doc,
Hansraj Das5dfbb4d2019-10-08 14:26:07 +05301345"Low-level interface to warnings functionality.");
Christian Heimes33fe8092008-04-13 13:53:33 +00001346
1347static PyMethodDef warnings_functions[] = {
Victor Stinner22f18752016-12-09 18:08:18 +01001348 WARNINGS_WARN_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02001349 {"warn_explicit", (PyCFunction)(void(*)(void))warnings_warn_explicit,
Christian Heimes33fe8092008-04-13 13:53:33 +00001350 METH_VARARGS | METH_KEYWORDS, warn_explicit_doc},
Antoine Pitroucb0a0062014-09-18 02:40:46 +02001351 {"_filters_mutated", (PyCFunction)warnings_filters_mutated, METH_NOARGS,
1352 NULL},
Christian Heimes1a8501c2008-10-02 19:56:01 +00001353 /* XXX(brett.cannon): add showwarning? */
1354 /* XXX(brett.cannon): Reasonable to add formatwarning? */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 {NULL, NULL} /* sentinel */
Christian Heimes33fe8092008-04-13 13:53:33 +00001356};
1357
1358
Martin v. Löwis1a214512008-06-11 05:26:20 +00001359static struct PyModuleDef warningsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 PyModuleDef_HEAD_INIT,
Eric Snow86ea5812019-05-10 13:29:55 -04001361 MODULE_NAME, /* m_name */
1362 warnings__doc__, /* m_doc */
1363 0, /* m_size */
1364 warnings_functions, /* m_methods */
1365 NULL, /* m_reload */
1366 NULL, /* m_traverse */
1367 NULL, /* m_clear */
1368 NULL /* m_free */
Martin v. Löwis1a214512008-06-11 05:26:20 +00001369};
1370
Christian Heimes33fe8092008-04-13 13:53:33 +00001371
Victor Stinner66b79732020-03-02 15:02:18 +01001372PyStatus
1373_PyWarnings_InitState(PyThreadState *tstate)
1374{
1375 if (warnings_init_state(&tstate->interp->warnings) < 0) {
1376 return _PyStatus_ERR("can't initialize warnings");
1377 }
1378 return _PyStatus_OK();
1379}
1380
1381
Victor Stinner5d862462017-12-19 11:35:58 +01001382PyMODINIT_FUNC
1383_PyWarnings_Init(void)
Christian Heimes33fe8092008-04-13 13:53:33 +00001384{
Brett Cannon0759dd62009-04-01 18:13:07 +00001385 PyObject *m;
Christian Heimes33fe8092008-04-13 13:53:33 +00001386
Martin v. Löwis1a214512008-06-11 05:26:20 +00001387 m = PyModule_Create(&warningsmodule);
Eric Snow86ea5812019-05-10 13:29:55 -04001388 if (m == NULL) {
Martin v. Löwis1a214512008-06-11 05:26:20 +00001389 return NULL;
Antoine Pitrouaa5c5c62012-01-18 21:45:15 +01001390 }
Christian Heimes33fe8092008-04-13 13:53:33 +00001391
Victor Stinner66b79732020-03-02 15:02:18 +01001392 WarningsState *st = warnings_get_state();
Eric Snow86ea5812019-05-10 13:29:55 -04001393 if (st == NULL) {
1394 goto error;
Antoine Pitrouaa5c5c62012-01-18 21:45:15 +01001395 }
Victor Stinner66b79732020-03-02 15:02:18 +01001396 if (warnings_init_state(st) < 0) {
Eric Snow86ea5812019-05-10 13:29:55 -04001397 goto error;
Antoine Pitrouaa5c5c62012-01-18 21:45:15 +01001398 }
Antoine Pitroucb0a0062014-09-18 02:40:46 +02001399
Eric Snow86ea5812019-05-10 13:29:55 -04001400 Py_INCREF(st->filters);
1401 if (PyModule_AddObject(m, "filters", st->filters) < 0) {
1402 goto error;
1403 }
1404
1405 Py_INCREF(st->once_registry);
1406 if (PyModule_AddObject(m, "_onceregistry", st->once_registry) < 0) {
1407 goto error;
1408 }
1409
1410 Py_INCREF(st->default_action);
1411 if (PyModule_AddObject(m, "_defaultaction", st->default_action) < 0) {
1412 goto error;
1413 }
1414
Martin v. Löwis1a214512008-06-11 05:26:20 +00001415 return m;
Eric Snow86ea5812019-05-10 13:29:55 -04001416
1417error:
1418 if (st != NULL) {
Victor Stinner66b79732020-03-02 15:02:18 +01001419 warnings_clear_state(st);
Eric Snow86ea5812019-05-10 13:29:55 -04001420 }
1421 Py_DECREF(m);
1422 return NULL;
Christian Heimes33fe8092008-04-13 13:53:33 +00001423}
Victor Stinner87d23a02019-04-26 05:49:26 +02001424
Eric Snow86ea5812019-05-10 13:29:55 -04001425// We need this to ensure that warnings still work until late in finalization.
Victor Stinner87d23a02019-04-26 05:49:26 +02001426void
Eric Snow86ea5812019-05-10 13:29:55 -04001427_PyWarnings_Fini(PyInterpreterState *interp)
Victor Stinner87d23a02019-04-26 05:49:26 +02001428{
Victor Stinner66b79732020-03-02 15:02:18 +01001429 warnings_clear_state(&interp->warnings);
Victor Stinner87d23a02019-04-26 05:49:26 +02001430}