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