xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/asyncio/base_futures.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker__all__ = ()
2*cda5da8dSAndroid Build Coastguard Worker
3*cda5da8dSAndroid Build Coastguard Workerimport reprlib
4*cda5da8dSAndroid Build Coastguard Workerfrom _thread import get_ident
5*cda5da8dSAndroid Build Coastguard Worker
6*cda5da8dSAndroid Build Coastguard Workerfrom . import format_helpers
7*cda5da8dSAndroid Build Coastguard Worker
8*cda5da8dSAndroid Build Coastguard Worker# States for Future.
9*cda5da8dSAndroid Build Coastguard Worker_PENDING = 'PENDING'
10*cda5da8dSAndroid Build Coastguard Worker_CANCELLED = 'CANCELLED'
11*cda5da8dSAndroid Build Coastguard Worker_FINISHED = 'FINISHED'
12*cda5da8dSAndroid Build Coastguard Worker
13*cda5da8dSAndroid Build Coastguard Worker
14*cda5da8dSAndroid Build Coastguard Workerdef isfuture(obj):
15*cda5da8dSAndroid Build Coastguard Worker    """Check for a Future.
16*cda5da8dSAndroid Build Coastguard Worker
17*cda5da8dSAndroid Build Coastguard Worker    This returns True when obj is a Future instance or is advertising
18*cda5da8dSAndroid Build Coastguard Worker    itself as duck-type compatible by setting _asyncio_future_blocking.
19*cda5da8dSAndroid Build Coastguard Worker    See comment in Future for more details.
20*cda5da8dSAndroid Build Coastguard Worker    """
21*cda5da8dSAndroid Build Coastguard Worker    return (hasattr(obj.__class__, '_asyncio_future_blocking') and
22*cda5da8dSAndroid Build Coastguard Worker            obj._asyncio_future_blocking is not None)
23*cda5da8dSAndroid Build Coastguard Worker
24*cda5da8dSAndroid Build Coastguard Worker
25*cda5da8dSAndroid Build Coastguard Workerdef _format_callbacks(cb):
26*cda5da8dSAndroid Build Coastguard Worker    """helper function for Future.__repr__"""
27*cda5da8dSAndroid Build Coastguard Worker    size = len(cb)
28*cda5da8dSAndroid Build Coastguard Worker    if not size:
29*cda5da8dSAndroid Build Coastguard Worker        cb = ''
30*cda5da8dSAndroid Build Coastguard Worker
31*cda5da8dSAndroid Build Coastguard Worker    def format_cb(callback):
32*cda5da8dSAndroid Build Coastguard Worker        return format_helpers._format_callback_source(callback, ())
33*cda5da8dSAndroid Build Coastguard Worker
34*cda5da8dSAndroid Build Coastguard Worker    if size == 1:
35*cda5da8dSAndroid Build Coastguard Worker        cb = format_cb(cb[0][0])
36*cda5da8dSAndroid Build Coastguard Worker    elif size == 2:
37*cda5da8dSAndroid Build Coastguard Worker        cb = '{}, {}'.format(format_cb(cb[0][0]), format_cb(cb[1][0]))
38*cda5da8dSAndroid Build Coastguard Worker    elif size > 2:
39*cda5da8dSAndroid Build Coastguard Worker        cb = '{}, <{} more>, {}'.format(format_cb(cb[0][0]),
40*cda5da8dSAndroid Build Coastguard Worker                                        size - 2,
41*cda5da8dSAndroid Build Coastguard Worker                                        format_cb(cb[-1][0]))
42*cda5da8dSAndroid Build Coastguard Worker    return f'cb=[{cb}]'
43*cda5da8dSAndroid Build Coastguard Worker
44*cda5da8dSAndroid Build Coastguard Worker
45*cda5da8dSAndroid Build Coastguard Workerdef _future_repr_info(future):
46*cda5da8dSAndroid Build Coastguard Worker    # (Future) -> str
47*cda5da8dSAndroid Build Coastguard Worker    """helper function for Future.__repr__"""
48*cda5da8dSAndroid Build Coastguard Worker    info = [future._state.lower()]
49*cda5da8dSAndroid Build Coastguard Worker    if future._state == _FINISHED:
50*cda5da8dSAndroid Build Coastguard Worker        if future._exception is not None:
51*cda5da8dSAndroid Build Coastguard Worker            info.append(f'exception={future._exception!r}')
52*cda5da8dSAndroid Build Coastguard Worker        else:
53*cda5da8dSAndroid Build Coastguard Worker            # use reprlib to limit the length of the output, especially
54*cda5da8dSAndroid Build Coastguard Worker            # for very long strings
55*cda5da8dSAndroid Build Coastguard Worker            result = reprlib.repr(future._result)
56*cda5da8dSAndroid Build Coastguard Worker            info.append(f'result={result}')
57*cda5da8dSAndroid Build Coastguard Worker    if future._callbacks:
58*cda5da8dSAndroid Build Coastguard Worker        info.append(_format_callbacks(future._callbacks))
59*cda5da8dSAndroid Build Coastguard Worker    if future._source_traceback:
60*cda5da8dSAndroid Build Coastguard Worker        frame = future._source_traceback[-1]
61*cda5da8dSAndroid Build Coastguard Worker        info.append(f'created at {frame[0]}:{frame[1]}')
62*cda5da8dSAndroid Build Coastguard Worker    return info
63*cda5da8dSAndroid Build Coastguard Worker
64*cda5da8dSAndroid Build Coastguard Worker
65*cda5da8dSAndroid Build Coastguard Worker@reprlib.recursive_repr()
66*cda5da8dSAndroid Build Coastguard Workerdef _future_repr(future):
67*cda5da8dSAndroid Build Coastguard Worker    info = ' '.join(_future_repr_info(future))
68*cda5da8dSAndroid Build Coastguard Worker    return f'<{future.__class__.__name__} {info}>'
69