summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_warnings/__init__.py1
-rw-r--r--Lib/warnings.py1
-rw-r--r--Misc/NEWS.d/next/Library/2017-11-21-16-05-35.bpo-27535.JLhcNz.rst4
-rw-r--r--Python/_warnings.c13
4 files changed, 14 insertions, 5 deletions
diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py
index e007dc7..f2fdaa5 100644
--- a/Lib/test/test_warnings/__init__.py
+++ b/Lib/test/test_warnings/__init__.py
@@ -125,6 +125,7 @@ class FilterTests(BaseTest):
self.module.filterwarnings("ignore", category=UserWarning)
self.module.warn("FilterTests.test_ignore", UserWarning)
self.assertEqual(len(w), 0)
+ self.assertEqual(list(__warningregistry__), ['version'])
def test_ignore_after_default(self):
with original_warnings.catch_warnings(record=True,
diff --git a/Lib/warnings.py b/Lib/warnings.py
index c4bb22e..d7ea057 100644
--- a/Lib/warnings.py
+++ b/Lib/warnings.py
@@ -364,7 +364,6 @@ def warn_explicit(message, category, filename, lineno,
action = defaultaction
# Early exit actions
if action == "ignore":
- registry[key] = 1
return
# Prime the linecache for formatting, in case the
diff --git a/Misc/NEWS.d/next/Library/2017-11-21-16-05-35.bpo-27535.JLhcNz.rst b/Misc/NEWS.d/next/Library/2017-11-21-16-05-35.bpo-27535.JLhcNz.rst
new file mode 100644
index 0000000..51bcfb7
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2017-11-21-16-05-35.bpo-27535.JLhcNz.rst
@@ -0,0 +1,4 @@
+The warnings module doesn't leak memory anymore in the hidden warnings
+registry for the "ignore" action of warnings filters. warn_explicit()
+function doesn't add the warning key to the registry anymore for the
+"ignore" action.
diff --git a/Python/_warnings.c b/Python/_warnings.c
index 27f5b81..2937036 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -528,16 +528,21 @@ warn_explicit(PyObject *category, PyObject *message,
goto cleanup;
}
+ if (_PyUnicode_EqualToASCIIString(action, "ignore")) {
+ goto return_none;
+ }
+
/* Store in the registry that we've been here, *except* when the action
is "always". */
rc = 0;
if (!_PyUnicode_EqualToASCIIString(action, "always")) {
if (registry != NULL && registry != Py_None &&
- PyDict_SetItem(registry, key, Py_True) < 0)
+ PyDict_SetItem(registry, key, Py_True) < 0)
+ {
goto cleanup;
- else if (_PyUnicode_EqualToASCIIString(action, "ignore"))
- goto return_none;
- else if (_PyUnicode_EqualToASCIIString(action, "once")) {
+ }
+
+ if (_PyUnicode_EqualToASCIIString(action, "once")) {
if (registry == NULL || registry == Py_None) {
registry = get_once_registry();
if (registry == NULL)