a
    ze6                     @   s   d Z ddlZddlZddlZddlZddlmZ ddlm	Z	 ddlm
Z
 ddlmZ ddlmZ e	jZe	jZe	jZe	jZejd ZG d	d
 d
ZeZdd Zdd Zdd Zdd Zdd Zdd ZddddZzddlZW n ey   Y n0 ej ZZdS ))Futurewrap_futureisfuture    N)GenericAlias   )base_futures)events)
exceptions)format_helpersc                   @   s   e Zd ZeZdZdZdZdZdZ	dZ
dZdZddddZejZdd Zdd	 ZeeZed
d Zejdd Zdd Zdd Zd(ddZdd Zdd Zdd Zdd Zdd Z ddddZ!d d! Z"d"d# Z#d$d% Z$d&d' Z%e%Z&dS ))r   NFloopc                C   s@   |d u rt  | _n|| _g | _| j r<ttd| _	d S )Nr   )
r   get_event_loop_loop
_callbacksZ	get_debugr
   extract_stacksys	_getframe_source_tracebackselfr    r   %/usr/lib/python3.9/asyncio/futures.py__init__H   s    
zFuture.__init__c                 C   s   d | jjd|  S )Nz<{} {}> )format	__class____name__join
_repr_infor   r   r   r   __repr__Z   s    
zFuture.__repr__c                 C   sF   | j s
d S | j}| jj d|| d}| jr6| j|d< | j| d S )Nz exception was never retrieved)message	exceptionfutureZsource_traceback)_Future__log_traceback
_exceptionr   r   r   r   Zcall_exception_handler)r   exccontextr   r   r   __del__^   s    
zFuture.__del__c                 C   s   | j S N)r$   r   r   r   r   _log_tracebackp   s    zFuture._log_tracebackc                 C   s   t |rtdd| _d S )Nz'_log_traceback can only be set to FalseF)bool
ValueErrorr$   )r   valr   r   r   r*   t   s    c                 C   s   | j }|d u rtd|S )Nz!Future object is not initialized.)r   RuntimeErrorr   r   r   r   get_loopz   s    zFuture.get_loopc                 C   s2   | j d u rt }nt| j }| j|_d | _|S r)   )_cancel_messager	   CancelledError_cancelled_exc__context__r   r&   r   r   r   _make_cancelled_error   s    

zFuture._make_cancelled_errorc                 C   s,   d| _ | jtkrdS t| _|| _|   dS )NFT)r$   _state_PENDING
_CANCELLEDr0   _Future__schedule_callbacks)r   msgr   r   r   cancel   s    
zFuture.cancelc                 C   sH   | j d d  }|sd S g | j d d < |D ]\}}| jj|| |d q(d S Nr'   )r   r   	call_soon)r   Z	callbackscallbackctxr   r   r   Z__schedule_callbacks   s    zFuture.__schedule_callbacksc                 C   s
   | j tkS r)   )r6   r8   r   r   r   r   	cancelled   s    zFuture.cancelledc                 C   s
   | j tkS r)   )r6   r7   r   r   r   r   done   s    zFuture.donec                 C   sF   | j tkr|  }|| j tkr*tdd| _| jd ur@| j| jS )NzResult is not ready.F)	r6   r8   r5   	_FINISHEDr	   InvalidStateErrorr$   r%   _resultr4   r   r   r   result   s    



zFuture.resultc                 C   s6   | j tkr|  }|| j tkr*tdd| _| jS )NzException is not set.F)r6   r8   r5   rC   r	   rD   r$   r%   r4   r   r   r   r"      s    


zFuture.exceptionr=   c                C   sB   | j tkr| jj|| |d n |d u r.t }| j||f d S r<   )r6   r7   r   r>   contextvarsZcopy_contextr   append)r   fnr'   r   r   r   add_done_callback   s
    
zFuture.add_done_callbackc                    s<    fdd| j D }t| j t| }|r8|| j d d < |S )Nc                    s    g | ]\}}| kr||fqS r   r   ).0fr@   rI   r   r   
<listcomp>   s   z/Future.remove_done_callback.<locals>.<listcomp>)r   len)r   rI   Zfiltered_callbacksZremoved_countr   rM   r   remove_done_callback   s    
zFuture.remove_done_callbackc                 C   s8   | j tkr t| j  d| || _t| _ |   d S )N: )r6   r7   r	   rD   rE   rC   r9   )r   rF   r   r   r   
set_result   s
    
zFuture.set_resultc                 C   sb   | j tkr t| j  d| t|tr0| }t|tu rDtd|| _t	| _ | 
  d| _d S )NrQ   zPStopIteration interacts badly with generators and cannot be raised into a FutureT)r6   r7   r	   rD   
isinstancetypeStopIteration	TypeErrorr%   rC   r9   r$   )r   r"   r   r   r   set_exception  s    

zFuture.set_exceptionc                 c   s,   |   sd| _| V  |   s$td|  S )NTzawait wasn't used with future)rB   _asyncio_future_blockingr.   rF   r   r   r   r   	__await__  s    zFuture.__await__)N)'r   
__module____qualname__r7   r6   rE   r%   r   r   r0   r2   rX   r$   r   r   Z_future_repr_infor   r    r(   classmethodr   __class_getitem__propertyr*   setterr/   r5   r;   r9   rA   rB   rF   r"   rJ   rP   rR   rW   rY   __iter__r   r   r   r   r      s@   


r   c                 C   s*   z
| j }W n ty   Y n0 | S | jS r)   )r/   AttributeErrorr   )futr/   r   r   r   	_get_loop(  s    
rc   c                 C   s   |   rd S | | d S r)   )rA   rR   )rb   rF   r   r   r   _set_result_unless_cancelled4  s    rd   c                 C   sX   t | }|tjju r tj| j S |tjju r8tj| j S |tjju rPtj| j S | S d S r)   )rT   
concurrentfuturesr1   r	   argsTimeoutErrorrD   )r&   Z	exc_classr   r   r   _convert_future_exc;  s    ri   c                 C   sR   |  r|   |  sd S | }|d ur<| t| n| }| | d S r)   )rA   r;   set_running_or_notify_cancelr"   rW   ri   rF   rR   )re   sourcer"   rF   r   r   r   _set_concurrent_future_stateG  s    rl   c                 C   sT   |  rd S |   r|  n2|  }|d ur>|t| n|  }|| d S r)   )rA   r;   r"   rW   ri   rF   rR   )rk   destr"   rF   r   r   r   _copy_future_stateV  s    
rn   c                    s   t sttjjstdt s<ttjjs<tdt rLtnd t r`tnd dd  fdd} fdd}| | d S )	Nz(A future is required for source argumentz-A future is required for destination argumentc                 S   s"   t | rt||  n
t| | d S r)   )r   rn   rl   )r#   otherr   r   r   
_set_statez  s    z!_chain_future.<locals>._set_statec                    s2   |   r.d u s u r"  nj d S r)   )rA   r;   call_soon_threadsafe)destination)	dest_looprk   source_loopr   r   _call_check_cancel  s    
z)_chain_future.<locals>._call_check_cancelc                    sJ     rd ur rd S d u s,u r8 |  n |  d S r)   )rA   Z	is_closedrq   )rk   )rp   rs   rr   rt   r   r   _call_set_state  s    z&_chain_future.<locals>._call_set_state)r   rS   re   rf   r   rV   rc   rJ   )rk   rr   ru   rv   r   )rp   rs   rr   rk   rt   r   _chain_futurej  s    	
rw   r   c                C   s2   t | r| S |d u rt }| }t| | |S r)   )r   r   r   Zcreate_futurerw   )r#   r   Z
new_futurer   r   r   r     s    
r   )__all__concurrent.futuresre   rG   loggingr   typesr    r   r   r	   r
   r   r7   r8   rC   DEBUGZSTACK_DEBUGr   Z	_PyFuturerc   rd   ri   rl   rn   rw   r   Z_asyncioImportErrorZ_CFuturer   r   r   r   <module>   s<   
  	*