17db96d56Sopenharmony_ciimport linecache
27db96d56Sopenharmony_ciimport reprlib
37db96d56Sopenharmony_ciimport traceback
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_cifrom . import base_futures
67db96d56Sopenharmony_cifrom . import coroutines
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_cidef _task_repr_info(task):
107db96d56Sopenharmony_ci    info = base_futures._future_repr_info(task)
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci    if task.cancelling() and not task.done():
137db96d56Sopenharmony_ci        # replace status
147db96d56Sopenharmony_ci        info[0] = 'cancelling'
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci    info.insert(1, 'name=%r' % task.get_name())
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci    coro = coroutines._format_coroutine(task._coro)
197db96d56Sopenharmony_ci    info.insert(2, f'coro=<{coro}>')
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci    if task._fut_waiter is not None:
227db96d56Sopenharmony_ci        info.insert(3, f'wait_for={task._fut_waiter!r}')
237db96d56Sopenharmony_ci    return info
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci@reprlib.recursive_repr()
277db96d56Sopenharmony_cidef _task_repr(task):
287db96d56Sopenharmony_ci    info = ' '.join(_task_repr_info(task))
297db96d56Sopenharmony_ci    return f'<{task.__class__.__name__} {info}>'
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_cidef _task_get_stack(task, limit):
337db96d56Sopenharmony_ci    frames = []
347db96d56Sopenharmony_ci    if hasattr(task._coro, 'cr_frame'):
357db96d56Sopenharmony_ci        # case 1: 'async def' coroutines
367db96d56Sopenharmony_ci        f = task._coro.cr_frame
377db96d56Sopenharmony_ci    elif hasattr(task._coro, 'gi_frame'):
387db96d56Sopenharmony_ci        # case 2: legacy coroutines
397db96d56Sopenharmony_ci        f = task._coro.gi_frame
407db96d56Sopenharmony_ci    elif hasattr(task._coro, 'ag_frame'):
417db96d56Sopenharmony_ci        # case 3: async generators
427db96d56Sopenharmony_ci        f = task._coro.ag_frame
437db96d56Sopenharmony_ci    else:
447db96d56Sopenharmony_ci        # case 4: unknown objects
457db96d56Sopenharmony_ci        f = None
467db96d56Sopenharmony_ci    if f is not None:
477db96d56Sopenharmony_ci        while f is not None:
487db96d56Sopenharmony_ci            if limit is not None:
497db96d56Sopenharmony_ci                if limit <= 0:
507db96d56Sopenharmony_ci                    break
517db96d56Sopenharmony_ci                limit -= 1
527db96d56Sopenharmony_ci            frames.append(f)
537db96d56Sopenharmony_ci            f = f.f_back
547db96d56Sopenharmony_ci        frames.reverse()
557db96d56Sopenharmony_ci    elif task._exception is not None:
567db96d56Sopenharmony_ci        tb = task._exception.__traceback__
577db96d56Sopenharmony_ci        while tb is not None:
587db96d56Sopenharmony_ci            if limit is not None:
597db96d56Sopenharmony_ci                if limit <= 0:
607db96d56Sopenharmony_ci                    break
617db96d56Sopenharmony_ci                limit -= 1
627db96d56Sopenharmony_ci            frames.append(tb.tb_frame)
637db96d56Sopenharmony_ci            tb = tb.tb_next
647db96d56Sopenharmony_ci    return frames
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_cidef _task_print_stack(task, limit, file):
687db96d56Sopenharmony_ci    extracted_list = []
697db96d56Sopenharmony_ci    checked = set()
707db96d56Sopenharmony_ci    for f in task.get_stack(limit=limit):
717db96d56Sopenharmony_ci        lineno = f.f_lineno
727db96d56Sopenharmony_ci        co = f.f_code
737db96d56Sopenharmony_ci        filename = co.co_filename
747db96d56Sopenharmony_ci        name = co.co_name
757db96d56Sopenharmony_ci        if filename not in checked:
767db96d56Sopenharmony_ci            checked.add(filename)
777db96d56Sopenharmony_ci            linecache.checkcache(filename)
787db96d56Sopenharmony_ci        line = linecache.getline(filename, lineno, f.f_globals)
797db96d56Sopenharmony_ci        extracted_list.append((filename, lineno, name, line))
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci    exc = task._exception
827db96d56Sopenharmony_ci    if not extracted_list:
837db96d56Sopenharmony_ci        print(f'No stack for {task!r}', file=file)
847db96d56Sopenharmony_ci    elif exc is not None:
857db96d56Sopenharmony_ci        print(f'Traceback for {task!r} (most recent call last):', file=file)
867db96d56Sopenharmony_ci    else:
877db96d56Sopenharmony_ci        print(f'Stack for {task!r} (most recent call last):', file=file)
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci    traceback.print_list(extracted_list, file=file)
907db96d56Sopenharmony_ci    if exc is not None:
917db96d56Sopenharmony_ci        for line in traceback.format_exception_only(exc.__class__, exc):
927db96d56Sopenharmony_ci            print(line, file=file, end='')
93