Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/asyncio/base_tasks.py: 11%
65 statements
« prev ^ index » next coverage.py v7.0.1, created at 2022-12-25 06:11 +0000
« prev ^ index » next coverage.py v7.0.1, created at 2022-12-25 06:11 +0000
1import linecache
2import traceback
4from . import base_futures
5from . import coroutines
8def _task_repr_info(task):
9 info = base_futures._future_repr_info(task)
11 if task._must_cancel:
12 # replace status
13 info[0] = 'cancelling'
15 info.insert(1, 'name=%r' % task.get_name())
17 coro = coroutines._format_coroutine(task._coro)
18 info.insert(2, f'coro=<{coro}>')
20 if task._fut_waiter is not None:
21 info.insert(3, f'wait_for={task._fut_waiter!r}')
22 return info
25def _task_get_stack(task, limit):
26 frames = []
27 if hasattr(task._coro, 'cr_frame'):
28 # case 1: 'async def' coroutines
29 f = task._coro.cr_frame
30 elif hasattr(task._coro, 'gi_frame'):
31 # case 2: legacy coroutines
32 f = task._coro.gi_frame
33 elif hasattr(task._coro, 'ag_frame'):
34 # case 3: async generators
35 f = task._coro.ag_frame
36 else:
37 # case 4: unknown objects
38 f = None
39 if f is not None:
40 while f is not None:
41 if limit is not None:
42 if limit <= 0:
43 break
44 limit -= 1
45 frames.append(f)
46 f = f.f_back
47 frames.reverse()
48 elif task._exception is not None:
49 tb = task._exception.__traceback__
50 while tb is not None:
51 if limit is not None:
52 if limit <= 0:
53 break
54 limit -= 1
55 frames.append(tb.tb_frame)
56 tb = tb.tb_next
57 return frames
60def _task_print_stack(task, limit, file):
61 extracted_list = []
62 checked = set()
63 for f in task.get_stack(limit=limit):
64 lineno = f.f_lineno
65 co = f.f_code
66 filename = co.co_filename
67 name = co.co_name
68 if filename not in checked:
69 checked.add(filename)
70 linecache.checkcache(filename)
71 line = linecache.getline(filename, lineno, f.f_globals)
72 extracted_list.append((filename, lineno, name, line))
74 exc = task._exception
75 if not extracted_list:
76 print(f'No stack for {task!r}', file=file)
77 elif exc is not None:
78 print(f'Traceback for {task!r} (most recent call last):', file=file)
79 else:
80 print(f'Stack for {task!r} (most recent call last):', file=file)
82 traceback.print_list(extracted_list, file=file)
83 if exc is not None:
84 for line in traceback.format_exception_only(exc.__class__, exc):
85 print(line, file=file, end='')