diff -r 44253ce374fc Doc/library/inspect.rst --- a/Doc/library/inspect.rst Mon Jun 22 12:31:24 2015 -0400 +++ b/Doc/library/inspect.rst Mon Jun 22 18:24:35 2015 -0400 @@ -182,6 +182,9 @@ +-----------+-----------------+---------------------------+ | | __qualname__ | qualified name | +-----------+-----------------+---------------------------+ +| | cr_await | object being awaited on, | +| | | or ``None`` | ++-----------+-----------------+---------------------------+ | | cr_frame | frame | +-----------+-----------------+---------------------------+ | | cr_running | is the coroutine running? | diff -r 44253ce374fc Lib/test/test_coroutines.py --- a/Lib/test/test_coroutines.py Mon Jun 22 12:31:24 2015 -0400 +++ b/Lib/test/test_coroutines.py Mon Jun 22 18:24:35 2015 -0400 @@ -340,6 +340,33 @@ "coroutine ignored GeneratorExit"): c.close() + def test_cr_await(self): + @types.coroutine + def a(): + self.assertEqual(inspect.getcoroutinestate(coro_b), inspect.CORO_RUNNING) + self.assertIsNone(coro_b.cr_await) + yield + self.assertEqual(inspect.getcoroutinestate(coro_b), inspect.CORO_RUNNING) + self.assertIsNone(coro_b.cr_await) + + async def b(): + self.assertIsNone(coro_b.cr_await) + await a() + self.assertIsNone(coro_b.cr_await) + + coro_b = b() + self.assertEqual(inspect.getcoroutinestate(coro_b), inspect.CORO_CREATED) + self.assertIsNone(coro_b.cr_await) + + coro_b.send(None) + self.assertEqual(inspect.getcoroutinestate(coro_b), inspect.CORO_SUSPENDED) + self.assertEqual(coro_b.cr_await.gi_code.co_name, 'a') + + with self.assertRaises(StopIteration): + coro_b.send(None) # complete coroutine + self.assertEqual(inspect.getcoroutinestate(coro_b), inspect.CORO_CLOSED) + self.assertIsNone(coro_b.cr_await) + def test_corotype_1(self): ct = types.CoroutineType self.assertIn('into coroutine', ct.send.__doc__) diff -r 44253ce374fc Objects/genobject.c --- a/Objects/genobject.c Mon Jun 22 12:31:24 2015 -0400 +++ b/Objects/genobject.c Mon Jun 22 18:24:35 2015 -0400 @@ -776,11 +776,22 @@ return (PyObject *)cw; } +static PyObject * +coro_get_cr_await(PyCoroObject *coro) +{ + PyObject *yf = gen_yf((PyGenObject *)coro); + if (yf == NULL) + Py_RETURN_NONE; + return yf; +} + static PyGetSetDef coro_getsetlist[] = { {"__name__", (getter)gen_get_name, (setter)gen_set_name, PyDoc_STR("name of the coroutine")}, {"__qualname__", (getter)gen_get_qualname, (setter)gen_set_qualname, PyDoc_STR("qualified name of the coroutine")}, + {"cr_await", (getter)coro_get_cr_await, NULL, + PyDoc_STR("object being awaited on, or None")}, {NULL} /* Sentinel */ };