From d1477074458ef1de3762dd41f45d2b5a5be08c0f Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 26 Feb 2020 11:01:41 -0800 Subject: [PATCH 1/2] Make get_stack accept ag_frame --- Lib/asyncio/base_tasks.py | 13 ++++++++++--- Lib/test/test_asyncgen.py | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Lib/asyncio/base_tasks.py b/Lib/asyncio/base_tasks.py index e2da462fde7400..09bb171a2ce750 100644 --- a/Lib/asyncio/base_tasks.py +++ b/Lib/asyncio/base_tasks.py @@ -24,11 +24,18 @@ def _task_repr_info(task): def _task_get_stack(task, limit): frames = [] - try: - # 'async def' coroutines + if hasattr(task._coro, 'cr_frame'): + # case 1: 'async def' coroutines f = task._coro.cr_frame - except AttributeError: + elif hasattr(task._coro, 'gi_frame'): + # case 2: legacy coroutines f = task._coro.gi_frame + elif hasattr(task._coro, 'ag_frame'): + # case 3: async generators + f = task._coro.ag_frame + else: + # case 4: unknown objects + f = None if f is not None: while f is not None: if limit is not None: diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index fb6321d2264f31..62bf8774166529 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -1191,5 +1191,20 @@ async def run(): self.loop.run_until_complete(run()) + def test_async_gen_aclose_compatible_with_get_stack(self): + async def async_generator(): + yield object() + + async def run(): + ag = async_generator() + asyncio.create_task(ag.aclose()) + tasks = asyncio.all_tasks() + for task in tasks: + # No AttributeError raised + task.get_stack() + + self.loop.run_until_complete(run()) + + if __name__ == "__main__": unittest.main() From 480dbda18c0531f1230d2d7ed42e1da0b8c181d2 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Thu, 27 Feb 2020 18:21:08 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NEWS.d/next/Library/2020-02-27-18-21-07.bpo-39764.wqPk68.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2020-02-27-18-21-07.bpo-39764.wqPk68.rst diff --git a/Misc/NEWS.d/next/Library/2020-02-27-18-21-07.bpo-39764.wqPk68.rst b/Misc/NEWS.d/next/Library/2020-02-27-18-21-07.bpo-39764.wqPk68.rst new file mode 100644 index 00000000000000..d61db2ea221f26 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-27-18-21-07.bpo-39764.wqPk68.rst @@ -0,0 +1 @@ +Fix AttributeError when calling get_stack on a PyAsyncGenObject Task \ No newline at end of file