changeset: 97496:9b28f41f1353 branch: 3.5 parent: 97494:b77ceefc34ff parent: 97495:595614c08eeb user: Larry Hastings date: Mon Aug 24 16:53:45 2015 -0700 files: Misc/NEWS description: Merged in 1st1/cpython350 (pull request #5) Issue #24867: Fix asyncio.Task.get_stack() for 'async def' coroutines diff -r b77ceefc34ff -r 9b28f41f1353 Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py Mon Aug 24 16:47:56 2015 -0700 +++ b/Lib/asyncio/tasks.py Mon Aug 24 16:53:45 2015 -0700 @@ -128,7 +128,11 @@ returned for a suspended coroutine. """ frames = [] - f = self._coro.gi_frame + try: + # 'async def' coroutines + f = self._coro.cr_frame + except AttributeError: + f = self._coro.gi_frame if f is not None: while f is not None: if limit is not None: diff -r b77ceefc34ff -r 9b28f41f1353 Lib/test/test_asyncio/test_pep492.py --- a/Lib/test/test_asyncio/test_pep492.py Mon Aug 24 16:47:56 2015 -0700 +++ b/Lib/test/test_asyncio/test_pep492.py Mon Aug 24 16:53:45 2015 -0700 @@ -186,6 +186,23 @@ data = self.loop.run_until_complete(coro()) self.assertEqual(data, 'spam') + def test_task_print_stack(self): + T = None + + async def foo(): + f = T.get_stack(limit=1) + try: + self.assertEqual(f[0].f_code.co_name, 'foo') + finally: + f = None + + async def runner(): + nonlocal T + T = asyncio.ensure_future(foo(), loop=self.loop) + await T + + self.loop.run_until_complete(runner()) + if __name__ == '__main__': unittest.main() diff -r b77ceefc34ff -r 9b28f41f1353 Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py Mon Aug 24 16:47:56 2015 -0700 +++ b/Lib/test/test_asyncio/test_tasks.py Mon Aug 24 16:53:45 2015 -0700 @@ -2,6 +2,7 @@ import contextlib import functools +import io import os import re import sys @@ -162,6 +163,37 @@ 'function is deprecated, use ensure_'): self.assertIs(f, asyncio.async(f)) + def test_get_stack(self): + T = None + + @asyncio.coroutine + def foo(): + yield from bar() + + @asyncio.coroutine + def bar(): + # test get_stack() + f = T.get_stack(limit=1) + try: + self.assertEqual(f[0].f_code.co_name, 'foo') + finally: + f = None + + # test print_stack() + file = io.StringIO() + T.print_stack(limit=1, file=file) + file.seek(0) + tb = file.read() + self.assertRegex(tb, r'foo\(\) running') + + @asyncio.coroutine + def runner(): + nonlocal T + T = asyncio.ensure_future(foo(), loop=self.loop) + yield from T + + self.loop.run_until_complete(runner()) + def test_task_repr(self): self.loop.set_debug(False) diff -r b77ceefc34ff -r 9b28f41f1353 Misc/NEWS --- a/Misc/NEWS Mon Aug 24 16:47:56 2015 -0700 +++ b/Misc/NEWS Mon Aug 24 16:53:45 2015 -0700 @@ -79,6 +79,8 @@ - Issue #24791: Fix grammar regression for call syntax: 'g(*a or b)'. +- Issue #24867: Fix Task.get_stack() for 'async def' coroutines + Documentation -------------