3
_+                 @   s  d ddgZ ddlZddlZddl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d Zejj oeejjdZyejZejZW n ek
r   dZdZY nX y
ejZW n ek
r   dd ZY nX yddlmZ m!Z" W n e#k
r*   d Z Z"Y nX dd Z$e$ Z%[$dd Z&G dd dZ'dd  Ze( Z)dd Zej*e'fZ+e dk	re+e f7 Z+edk	refe+ Z+dd Z,dd Z-dS )	coroutineiscoroutinefunctioniscoroutine    N   )compat)	constants)events)base_futures)loggerZ
YIELD_FROMZPYTHONASYNCIODEBUGc             C   s   dS )NF )funcr   r   (/usr/lib/python3.6/asyncio/coroutines.py<lambda>/   s    r   )	Coroutine	Awaitablec              C   sF   G dd d} dd }d}|  }||}t | |j| |j|fkS )	Nc               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
z!has_yield_from_bug.<locals>.MyGenc             S   s
   d | _ d S )N)	send_args)selfr   r   r   __init__;   s    z*has_yield_from_bug.<locals>.MyGen.__init__c             S   s   | S )Nr   )r   r   r   r   __iter__=   s    z*has_yield_from_bug.<locals>.MyGen.__iter__c             S   s   dS )N*   r   )r   r   r   r   __next__?   s    z*has_yield_from_bug.<locals>.MyGen.__next__c             W   s
   || _ d S )N)r   )r   Zwhatr   r   r   sendA   s    z&has_yield_from_bug.<locals>.MyGen.sendN)__name__
__module____qualname__r   r   r   r   r   r   r   r   MyGen:   s   r   c             s   s   | E d H  d S )Nr   )genr   r   r   yield_from_genD   s    z*has_yield_from_bug.<locals>.yield_from_genr         )r   r   r   )nextr   r   )r   r   valuer   coror   r   r   has_yield_from_bug9   s    

r#   c             C   s
   t | d S )N)CoroWrapper)r   r   r   r   debug_wrapperP   s    r%   c               @   s   e Zd Zd%ddZdd Zdd Zdd	 Zer8d
d Zndd Zd&ddZ	dd Z
edd Zedd Zedd Zejrdd Zedd Zedd Zedd Zedd  Zed!d" Zd#d$ ZdS )'r$   Nc             C   sZ   t j|st j|st||| _|| _tjtj	d| _
t|dd | _t|dd | _d S )Nr   r   r   )inspectisgeneratorr   AssertionErrorr   r   r   extract_stacksys	_getframe_source_tracebackgetattrr   r   )r   r   r   r   r   r   r   [   s    zCoroWrapper.__init__c             C   s@   t | }| jr0| jd }|d|d |d f 7 }d| jj|f S )Nr   z, created at %s:%sr   z<%s %s>)_format_coroutiner,   	__class__r   )r   	coro_reprframer   r   r   __repr__c   s
    
zCoroWrapper.__repr__c             C   s   | S )Nr   )r   r   r   r   r   j   s    zCoroWrapper.__iter__c             C   s   | j jd S )N)r   r   )r   r   r   r   r   m   s    zCoroWrapper.__next__c             G   sB   t j }|j}|jdkst|jj|j tkr6|d }| jj	|S )Nr   )
r*   r+   f_backf_lastir(   f_codeco_code_YIELD_FROMr   r   )r   r!   r2   Zcallerr   r   r   r   u   s    zCoroWrapper.sendc             C   s   | j j|S )N)r   r   )r   r!   r   r   r   r   }   s    c             C   s   | j j|||S )N)r   throw)r   typer!   	tracebackr   r   r   r9      s    zCoroWrapper.throwc             C   s
   | j j S )N)r   close)r   r   r   r   r<      s    zCoroWrapper.closec             C   s   | j jS )N)r   gi_frame)r   r   r   r   r=      s    zCoroWrapper.gi_framec             C   s   | j jS )N)r   
gi_running)r   r   r   r   r>      s    zCoroWrapper.gi_runningc             C   s   | j jS )N)r   gi_code)r   r   r   r   r?      s    zCoroWrapper.gi_codec             C   s,   t | jdd }|d k	r(tdj| j|| S )Ncr_awaitz;Cannot await on coroutine {!r} while it's awaiting for {!r})r-   r   RuntimeErrorformat)r   r@   r   r   r   	__await__   s    zCoroWrapper.__await__c             C   s   | j jS )N)r   gi_yieldfrom)r   r   r   r   rD      s    zCoroWrapper.gi_yieldfromc             C   s   | j jS )N)r   r@   )r   r   r   r   r@      s    zCoroWrapper.cr_awaitc             C   s   | j jS )N)r   
cr_running)r   r   r   r   rE      s    zCoroWrapper.cr_runningc             C   s   | j jS )N)r   cr_code)r   r   r   r   rF      s    zCoroWrapper.cr_codec             C   s   | j jS )N)r   cr_frame)r   r   r   r   rG      s    zCoroWrapper.cr_framec             C   s   t | dd }t |dd }|d kr,t |dd }|d k	r|jd
krd|  }t | df }|rdjtj|}|dtj d	7 }||j 7 }tj	| d S )Nr   r=   rG   r   z%r was never yielded fromr,    zB
Coroutine object created at (most recent call last, truncated to z last lines):
r.   )
r-   r5   joinr;   format_listr   ZDEBUG_STACK_DEPTHrstripr
   error)r   r   r2   msgtbr   r   r   __del__   s    zCoroWrapper.__del__)N)NN)r   r   r   r   r3   r   r   _YIELD_FROM_BUGr   r9   r<   propertyr=   r>   r?   r   ZPY35rC   rD   r@   rE   rF   rG   rO   r   r   r   r   r$   X   s(   


r$   c                sp   t rS tjr ntjfdd tsNtdkrD }qft }ntj fdd}t|_|S )zDecorator to mark coroutines.

    If the coroutine is not yielded from before it is destroyed,
    an error message is logged.
    c              ?   sv    | |}t j|s(tj|s(t|tr4|E d H }n>td k	rry
|j}W n tk
rZ   Y nX t|trr| E d H }|S )N)	r	   Zisfuturer&   r'   
isinstancer$   _AwaitableABCrC   AttributeError)argskwZresZ
await_meth)r   r   r   r"      s    



zcoroutine.<locals>.coroNc                 s@   t  | |d}|jr |jd= tdd |_tdd |_|S )N)r   r   r   r   r.   )r$   r,   r-   r   r   )rU   kwdsw)r"   r   r   r   wrapper   s    zcoroutine.<locals>.wrapper)_inspect_iscoroutinefunctionr&   isgeneratorfunction	functoolswraps_DEBUG_types_coroutine_is_coroutine)r   rY   r   )r"   r   r   r      s    

c             C   s   t | ddtkpt| S )z6Return True if func is a decorated coroutine function.r`   N)r-   r`   rZ   )r   r   r   r   r      s    c             C   s
   t | tS )z)Return True if obj is a coroutine object.)rR   _COROUTINE_TYPES)objr   r   r   r     s    c       
      C   s&  t | stt| d rt| d rt| dt| dt| j}dj|}d}y
| j}W n4 tk
r   y
| j	}W n tk
r   Y nX Y nX |rdj|S |S d }t
| tr| j}| j}|d k	rdj|}n| }|d krtj|f i }d }t| do| jr| j}nt| dr| jr| j}d }t| dr>| jr>| j}nt| d	rX| jrX| j}d
}|rp|jrp|j}d}|}t
| trtj| j r| jd k	rtj| j}	|	d k	r|	\}}|d krd|||f }nd|||f }n:|d k	r|j}d|||f }n|r"|j}d|||f }|S )NrF   r?   r   r   z{}()Fz
{} runningrG   r=   z<empty co_filename>r   z%s done, defined at %s:%sz%s running, defined at %s:%sz%s running at %s:%s)r   r(   hasattrr-   r:   r   rB   rE   rT   r>   rR   r$   r   r   r   Z_format_callbackrF   r?   rG   r=   co_filenamer&   r[   Z_get_function_sourcef_linenoco_firstlineno)
r"   Z	coro_nameZrunningr   Z	coro_codeZ
coro_framefilenamelinenor1   sourcer   r   r   r/     sz    







r/   ).__all__r\   r&   Zopcodeosr*   r;   typesrH   r   r   r   r	   logr
   Zopmapr8   flagsignore_environmentboolenvirongetr^   r   r_   CoroutineTypeZ_types_CoroutineTyperT   r   rZ   collections.abcr   Z_CoroutineABCr   rS   ImportErrorr#   rP   r%   r$   objectr`   GeneratorTypera   r   r/   r   r   r   r   <module>   sZ   




j:




