mirror of https://github.com/python/cpython
Issue #24867: Fix Task.get_stack() for 'async def' coroutines
This commit is contained in:
parent
ac37ba0742
commit
233983380d
|
@ -128,7 +128,11 @@ class Task(futures.Future):
|
||||||
returned for a suspended coroutine.
|
returned for a suspended coroutine.
|
||||||
"""
|
"""
|
||||||
frames = []
|
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:
|
if f is not None:
|
||||||
while f is not None:
|
while f is not None:
|
||||||
if limit is not None:
|
if limit is not None:
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
import contextlib
|
import contextlib
|
||||||
import functools
|
import functools
|
||||||
|
import io
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
@ -162,6 +163,37 @@ class TaskTests(test_utils.TestCase):
|
||||||
'function is deprecated, use ensure_'):
|
'function is deprecated, use ensure_'):
|
||||||
self.assertIs(f, asyncio.async(f))
|
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):
|
def test_task_repr(self):
|
||||||
self.loop.set_debug(False)
|
self.loop.set_debug(False)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue