Skip to content

Commit 43b157b

Browse files
Fix inspect.getcoroutinestate for generator-based coroutines
1 parent a9ca49d commit 43b157b

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

Lib/test/test_inspect/test_inspect.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2878,6 +2878,17 @@ def _coroutinestate(self):
28782878

28792879
def test_created(self):
28802880
self.assertEqual(self._coroutinestate(), inspect.CORO_CREATED)
2881+
2882+
def test_generator_based_coroutine_introspection(self):
2883+
from inspect import getcoroutinestate
2884+
from types import coroutine
2885+
2886+
@coroutine
2887+
def gen_coro():
2888+
yield
2889+
2890+
# Must not raise AttributeError
2891+
getcoroutinestate(gen_coro())
28812892

28822893
def test_suspended(self):
28832894
self.coroutine.send(None)
@@ -2927,6 +2938,7 @@ async def func(a=None):
29272938
{'a': None, 'gencoro': gencoro, 'b': 'spam'})
29282939

29292940

2941+
29302942
@support.requires_working_socket()
29312943
class TestGetAsyncGenState(unittest.IsolatedAsyncioTestCase):
29322944

Objects/genobject.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -935,6 +935,36 @@ gen_getcode(PyObject *self, void *Py_UNUSED(ignored))
935935
return _gen_getcode(gen, "gi_code");
936936
}
937937

938+
static PyObject *
939+
gen_get_cr_frame(PyObject *self, void *closure)
940+
{
941+
return gen_getframe((PyGenObject *)self, closure);
942+
}
943+
944+
static PyObject *
945+
gen_get_cr_code(PyObject *self, void *closure)
946+
{
947+
return gen_getcode((PyGenObject *)self, closure);
948+
}
949+
950+
static PyObject *
951+
gen_get_cr_running(PyObject *self, void *closure)
952+
{
953+
return gen_getrunning((PyGenObject *)self, closure);
954+
}
955+
956+
static PyObject *
957+
gen_get_cr_suspended(PyObject *self, void *closure)
958+
{
959+
return gen_getsuspended((PyGenObject *)self, closure);
960+
}
961+
962+
static PyObject *
963+
gen_get_cr_origin(PyObject *self, void *closure)
964+
{
965+
Py_RETURN_NONE;
966+
}
967+
938968
static PyGetSetDef gen_getsetlist[] = {
939969
{"__name__", gen_get_name, gen_set_name,
940970
PyDoc_STR("name of the generator")},
@@ -946,6 +976,11 @@ static PyGetSetDef gen_getsetlist[] = {
946976
{"gi_frame", gen_getframe, NULL, NULL},
947977
{"gi_suspended", gen_getsuspended, NULL, NULL},
948978
{"gi_code", gen_getcode, NULL, NULL},
979+
{"cr_running", gen_get_cr_running, NULL, NULL},
980+
{"cr_frame", gen_get_cr_frame, NULL, NULL},
981+
{"cr_code", gen_get_cr_code, NULL, NULL},
982+
{"cr_suspended", gen_get_cr_suspended, NULL, NULL},
983+
{"cr_origin", gen_get_cr_origin, NULL, NULL},
949984
{NULL} /* Sentinel */
950985
};
951986

0 commit comments

Comments
 (0)