summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_coroutines.py22
-rw-r--r--Python/_warnings.c7
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;