From d6ff29533748d4eb6a91be4dda10cd1170b0ab9c Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Fri, 23 Jul 2021 15:57:22 +0300 Subject: [PATCH 1/3] bpo-44353: Fix memory leak at _typing__idfunc --- Modules/_typingmodule.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/_typingmodule.c b/Modules/_typingmodule.c index 8b6faa646d61878..81b1963339e7d8e 100644 --- a/Modules/_typingmodule.c +++ b/Modules/_typingmodule.c @@ -23,7 +23,6 @@ static PyObject * _typing__idfunc(PyObject *module, PyObject *x) /*[clinic end generated code: output=63c38be4a6ec5f2c input=49f17284b43de451]*/ { - Py_INCREF(x); return x; } From c4dfbcf2801915bc9f3824995fde092a4c7420eb Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Fri, 23 Jul 2021 16:43:55 +0300 Subject: [PATCH 2/3] Clear typing module cache after test execution --- Lib/test/test_typing.py | 7 +++++++ Modules/_typingmodule.c | 1 + 2 files changed, 8 insertions(+) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 6f1d4f6ce20e16d..08620dd4f24f613 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3692,10 +3692,15 @@ def test_c_functions(self): class NewTypeTests: + def cleanup(self): + for f in self.module._cleanups: + f() + def setUp(self): sys.modules['typing'] = self.module def tearDown(self): + self.cleanup() sys.modules['typing'] = typing def test_basic(self): @@ -3715,6 +3720,8 @@ class D(UserName): pass def test_or(self): + self.addCleanup(self.cleanup) + UserId = self.module.NewType('UserId', int) UserName = self.module.NewType('UserName', str) diff --git a/Modules/_typingmodule.c b/Modules/_typingmodule.c index 81b1963339e7d8e..8b6faa646d61878 100644 --- a/Modules/_typingmodule.c +++ b/Modules/_typingmodule.c @@ -23,6 +23,7 @@ static PyObject * _typing__idfunc(PyObject *module, PyObject *x) /*[clinic end generated code: output=63c38be4a6ec5f2c input=49f17284b43de451]*/ { + Py_INCREF(x); return x; } From c27c64349ea8be740ac12090a9768527023cfd95 Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Fri, 23 Jul 2021 16:54:10 +0300 Subject: [PATCH 3/3] Set correct base cls order --- Lib/test/test_typing.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 08620dd4f24f613..ebe6c8d37e501f1 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3720,8 +3720,6 @@ class D(UserName): pass def test_or(self): - self.addCleanup(self.cleanup) - UserId = self.module.NewType('UserId', int) UserName = self.module.NewType('UserName', str) @@ -3745,12 +3743,12 @@ def test_repr(self): self.assertEqual(repr(UserId), f'{__name__}.UserId') -class NewTypePythonTests(BaseTestCase, NewTypeTests): +class NewTypePythonTests(NewTypeTests, BaseTestCase): module = py_typing @skipUnless(c_typing, 'requires _typing') -class NewTypeCTests(BaseTestCase, NewTypeTests): +class NewTypeCTests(NewTypeTests, BaseTestCase): module = c_typing