17db96d56Sopenharmony_ci__all__ = ()
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciimport reprlib
47db96d56Sopenharmony_cifrom _thread import get_ident
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_cifrom . import format_helpers
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci# States for Future.
97db96d56Sopenharmony_ci_PENDING = 'PENDING'
107db96d56Sopenharmony_ci_CANCELLED = 'CANCELLED'
117db96d56Sopenharmony_ci_FINISHED = 'FINISHED'
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_cidef isfuture(obj):
157db96d56Sopenharmony_ci    """Check for a Future.
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci    This returns True when obj is a Future instance or is advertising
187db96d56Sopenharmony_ci    itself as duck-type compatible by setting _asyncio_future_blocking.
197db96d56Sopenharmony_ci    See comment in Future for more details.
207db96d56Sopenharmony_ci    """
217db96d56Sopenharmony_ci    return (hasattr(obj.__class__, '_asyncio_future_blocking') and
227db96d56Sopenharmony_ci            obj._asyncio_future_blocking is not None)
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_cidef _format_callbacks(cb):
267db96d56Sopenharmony_ci    """helper function for Future.__repr__"""
277db96d56Sopenharmony_ci    size = len(cb)
287db96d56Sopenharmony_ci    if not size:
297db96d56Sopenharmony_ci        cb = ''
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci    def format_cb(callback):
327db96d56Sopenharmony_ci        return format_helpers._format_callback_source(callback, ())
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci    if size == 1:
357db96d56Sopenharmony_ci        cb = format_cb(cb[0][0])
367db96d56Sopenharmony_ci    elif size == 2:
377db96d56Sopenharmony_ci        cb = '{}, {}'.format(format_cb(cb[0][0]), format_cb(cb[1][0]))
387db96d56Sopenharmony_ci    elif size > 2:
397db96d56Sopenharmony_ci        cb = '{}, <{} more>, {}'.format(format_cb(cb[0][0]),
407db96d56Sopenharmony_ci                                        size - 2,
417db96d56Sopenharmony_ci                                        format_cb(cb[-1][0]))
427db96d56Sopenharmony_ci    return f'cb=[{cb}]'
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_cidef _future_repr_info(future):
467db96d56Sopenharmony_ci    # (Future) -> str
477db96d56Sopenharmony_ci    """helper function for Future.__repr__"""
487db96d56Sopenharmony_ci    info = [future._state.lower()]
497db96d56Sopenharmony_ci    if future._state == _FINISHED:
507db96d56Sopenharmony_ci        if future._exception is not None:
517db96d56Sopenharmony_ci            info.append(f'exception={future._exception!r}')
527db96d56Sopenharmony_ci        else:
537db96d56Sopenharmony_ci            # use reprlib to limit the length of the output, especially
547db96d56Sopenharmony_ci            # for very long strings
557db96d56Sopenharmony_ci            result = reprlib.repr(future._result)
567db96d56Sopenharmony_ci            info.append(f'result={result}')
577db96d56Sopenharmony_ci    if future._callbacks:
587db96d56Sopenharmony_ci        info.append(_format_callbacks(future._callbacks))
597db96d56Sopenharmony_ci    if future._source_traceback:
607db96d56Sopenharmony_ci        frame = future._source_traceback[-1]
617db96d56Sopenharmony_ci        info.append(f'created at {frame[0]}:{frame[1]}')
627db96d56Sopenharmony_ci    return info
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci@reprlib.recursive_repr()
667db96d56Sopenharmony_cidef _future_repr(future):
677db96d56Sopenharmony_ci    info = ' '.join(_future_repr_info(future))
687db96d56Sopenharmony_ci    return f'<{future.__class__.__name__} {info}>'
69