diff options
-rw-r--r-- | Lib/test/test_coroutines.py | 22 | ||||
-rw-r--r-- | Python/_warnings.c | 7 |
2 files changed, 29 insertions, 0 deletions
diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 8a531b8..a97535a 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -8,6 +8,7 @@ import types import unittest import warnings from test import support +from test.support.script_helper import assert_python_ok class AsyncYieldFrom: @@ -2168,6 +2169,27 @@ class OriginTrackingTest(unittest.TestCase): finally: warnings._warn_unawaited_coroutine = orig_wuc + +class UnawaitedWarningDuringShutdownTest(unittest.TestCase): + # https://bugs.python.org/issue32591#msg310726 + def test_unawaited_warning_during_shutdown(self): + code = ("import asyncio\n" + "async def f(): pass\n" + "asyncio.gather(f())\n") + assert_python_ok("-c", code) + + code = ("import sys\n" + "async def f(): pass\n" + "sys.coro = f()\n") + assert_python_ok("-c", code) + + code = ("import sys\n" + "async def f(): pass\n" + "sys.corocycle = [f()]\n" + "sys.corocycle.append(sys.corocycle)\n") + assert_python_ok("-c", code) + + @support.cpython_only class CAPITest(unittest.TestCase): diff --git a/Python/_warnings.c b/Python/_warnings.c index 16ae932..0568af4 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -75,6 +75,13 @@ get_warnings_attr(_Py_Identifier *attr_id, int try_import) } } else { + /* if we're so late into Python finalization that the module dict is + gone, then we can't even use PyImport_GetModule without triggering + an interpreter abort. + */ + if (!PyThreadState_GET()->interp->modules) { + return NULL; + } warnings_module = PyImport_GetModule(warnings_str); if (warnings_module == NULL) return NULL; |