B
    v9a1                 @   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	 ej
Z
ejZej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ddZyddlZW n ek
r   Y nX ej ZZdS ))CancelledErrorTimeoutErrorInvalidStateErrorFuturewrap_futureisfuture    N   )base_futures)events)format_helpersc               @   s   e Zd Ze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d
d Zejdd Zdd Z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 k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.7/futures.py__init__G   s    
zFuture.__init__c             C   s   d | jjd|  S )Nz<{} {}> )format	__class____name__join
_repr_info)r   r   r   r   __repr__Y   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_tracebackm   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'   q   s    c             C   s   | j S )N)r   )r   r   r   r   get_loopw   s    zFuture.get_loopc             C   s&   d| _ | jtkrdS t| _|   dS )NFT)r"   _state_PENDING
_CANCELLED_Future__schedule_callbacks)r   r   r   r   cancel{   s    
zFuture.cancelc             C   sL   | j d d  }|sd S g | j d d < x"|D ]\}}| jj|| |d q*W 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 )N)r,   r.   )r   r   r   r   	cancelled   s    zFuture.cancelledc             C   s
   | j tkS )N)r,   r-   )r   r   r   r   done   s    zFuture.donec             C   s<   | j tkrt| j tkr tdd| _| jd k	r6| j| jS )NzResult is not ready.F)r,   r.   r   	_FINISHEDr   r"   r#   _result)r   r   r   r   result   s    


zFuture.resultc             C   s,   | j tkrt| j tkr tdd| _| jS )NzException is not set.F)r,   r.   r   r6   r   r"   r#   )r   r   r   r   r       s    

zFuture.exception)r%   c            C   sB   | j tkr| jj|| |d n |d kr.t }| j||f d S )N)r%   )r,   r-   r   r1   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fr3   )r;   r   r   
<listcomp>   s   z/Future.remove_done_callback.<locals>.<listcomp>)r   len)r   r;   Zfiltered_callbacksZremoved_countr   )r;   r   remove_done_callback   s    

zFuture.remove_done_callbackc             C   s4   | j tkrtd| j | || _t| _ |   d S )Nz{}: {!r})r,   r-   r   r   r7   r6   r/   )r   r8   r   r   r   
set_result   s
    
zFuture.set_resultc             C   s^   | j tkrtd| j | t|tr,| }t|tkr@td|| _t	| _ | 
  d| _d S )Nz{}: {!r}zPStopIteration interacts badly with generators and cannot be raised into a FutureT)r,   r-   r   r   
isinstancetypeStopIteration	TypeErrorr#   r6   r/   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)r5   _asyncio_future_blockingRuntimeErrorr8   )r   r   r   r   	__await__  s    zFuture.__await__)!r   
__module____qualname__r-   r,   r7   r#   r   r   rH   r"   r   r	   Z_future_repr_infor   r   r&   propertyr'   setterr+   r0   r/   r4   r5   r8   r    r<   rA   rB   rG   rJ   __iter__r   r   r   r   r       s4   r   c             C   s,   y
| j }W n tk
r   Y nX | S | jS )N)r+   AttributeErrorr   )futr+   r   r   r   	_get_loop  s    
rR   c             C   s   |   rd S | | d S )N)r4   rB   )rQ   r8   r   r   r   _set_result_unless_cancelled  s    rS   c             C   sN   |  r|   |  sd S | }|d k	r8| | n| }| | d S )N)r4   r0   Zset_running_or_notify_cancelr    rG   r8   rB   )
concurrentsourcer    r8   r   r   r   _set_concurrent_future_state#  s    rV   c             C   sP   |  rd S |   r|  n.|  }|d k	r:|| n|  }|| d S )N)r4   r0   r    rG   r8   rB   )rU   destr    r8   r   r   r   _copy_future_state2  s    
rX   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 )N)r   rX   rV   )r!   otherr   r   r   
_set_stateV  s    z!_chain_future.<locals>._set_statec                s2   |   r.d ks kr"  nj d S )N)r4   r0   call_soon_threadsafe)destination)	dest_looprU   source_loopr   r   _call_check_cancel\  s    
z)_chain_future.<locals>._call_check_cancelc                sJ     rd k	r rd S d ks,kr8 |  n |  d S )N)r4   Z	is_closedr[   )rU   )rZ   r]   r\   r^   r   r   _call_set_statec  s    z&_chain_future.<locals>._call_set_state)r   rC   rT   Zfuturesr   rF   rR   r<   )rU   r\   r_   r`   r   )rZ   r]   r\   rU   r^   r   _chain_futureF  s    

	
ra   )r   c            C   s2   t | r| S |d krt }| }t| | |S )N)r   r
   r   Zcreate_futurera   )r!   r   Z
new_futurer   r   r   r   p  s    
r   )__all__concurrent.futuresrT   r9   Zloggingr    r	   r
   r   r   r   r   r   r-   r.   r6   DEBUGZSTACK_DEBUGr   Z	_PyFuturerR   rS   rV   rX   ra   r   Z_asyncioImportErrorZ_CFuturer   r   r   r   <module>   s:   
 n*