î
\á[\û  ã               @   s3  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 e j d	 Z e j j oÂ e e j j d
 ƒ ƒ Z d d „  Z e ƒ  Z [ Gd d „  d ƒ Z d d  „  Z d d „  Z e j e f Z d d „  Z d d „  Z d S)Ú	coroutineÚiscoroutinefunctionÚiscoroutineé    Né   )Úevents)Úfutures)ÚloggerZ
YIELD_FROMZPYTHONASYNCIODEBUGc              C   sa   Gd 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)Úself© r   ú(/usr/lib/python3.4/asyncio/coroutines.pyÚ__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   Úsend*   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   |  Dd  Hd  S)Nr   )Úgenr   r   r   Úyield_from_gen-   s    z*has_yield_from_bug.<locals>.yield_from_genr   é   é   )r   r   r   )Únextr   r	   )r   r   Úvaluer   Úcoror   r   r   Úhas_yield_from_bug"   s    
	
r   c               @   s»   e  Z d  Z d d „  Z d d „  Z d d „  Z d d „  Z e rQ d	 d
 „  Z n d d
 „  Z d d „  Z	 d d „  Z
 e d d „  ƒ Z e d d „  ƒ Z e d d „  ƒ Z d d „  Z d S)ÚCoroWrapperc             C   sL   t  j | ƒ s t | ƒ ‚ | |  _ | |  _ t j t j d ƒ ƒ |  _	 d  S)Nr   )
ÚinspectÚisgeneratorÚAssertionErrorr   ÚfuncÚ	tracebackÚextract_stackÚsysÚ	_getframeÚ_source_traceback)r
   r   r"   r   r   r   r   <   s    		zCoroWrapper.__init__c             C   sU   t  |  ƒ } |  j rA |  j d } | d | d | d f 7} n  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__D   s
    	zCoroWrapper.__repr__c             C   s   |  S)Nr   )r
   r   r   r   r   K   s    zCoroWrapper.__iter__c             C   s   t  |  j ƒ S)N)r   r   )r
   r   r   r   r   N   s    zCoroWrapper.__next__c             G   s`   t  j ƒ  } | j } | j d k s* t ‚ | j j | j t k rP | d } n  |  j j	 | ƒ S)Nr   )
r%   r&   Úf_backÚf_lastir!   Úf_codeÚco_codeÚ_YIELD_FROMr   r   )r
   r   r,   Zcallerr   r   r   r   V   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
   Úexcr   r   r   r3   a   s    zCoroWrapper.throwc             C   s   |  j  j ƒ  S)N)r   Úclose)r
   r   r   r   r5   d   s    zCoroWrapper.closec             C   s
   |  j  j S)N)r   Úgi_frame)r
   r   r   r   r6   g   s    zCoroWrapper.gi_framec             C   s
   |  j  j S)N)r   Ú
gi_running)r
   r   r   r   r7   k   s    zCoroWrapper.gi_runningc             C   s
   |  j  j S)N)r   Úgi_code)r
   r   r   r   r8   o   s    zCoroWrapper.gi_codec             C   sª   t  |  d d  ƒ } t  | d d  ƒ } | d  k	 r¦ | j d k r¦ d |  } t  |  d f  ƒ } | r– d j t j | ƒ ƒ } | d 7} | | j ƒ  7} n  t j | ƒ n  d  S)	Nr   r6   r   z%r was never yielded fromr'   Ú z6
Coroutine object created at (most recent call last):
r(   )Úgetattrr/   Újoinr#   Úformat_listÚrstripr   Úerror)r
   r   r,   ÚmsgÚtbr   r   r   Ú__del__s   s    

zCoroWrapper.__del__N)r   r   r   r   r-   r   r   Ú_YIELD_FROM_BUGr   r3   r5   Úpropertyr6   r7   r8   rA   r   r   r   r   r   9   s   r   c                sy   t  j ˆ ƒ r ˆ ‰  n! t j ˆ ƒ ‡ f d d †  ƒ ‰  t sH ˆ  } n$ t j ˆ ƒ ‡  ‡ f d d †  ƒ } d | _ | S)z„Decorator to mark coroutines.

    If the coroutine is not yielded from before it is destroyed,
    an error message is logged.
    c              ?   sB   ˆ  |  | Ž  } t  | t j ƒ s0 t j | ƒ r> | Dd  H} n  | S)N)Ú
isinstancer   ZFuturer   r    )ÚargsÚkwZres)r"   r   r   r   ‹   s    !zcoroutine.<locals>.coroc                 sh   t  ˆ  |  | Ž  ˆ ƒ } | j r. | j d =n  ˆ j | _ t ˆ d ƒ rX ˆ j | _ n  ˆ j | _ | S)Nr   r   r(   )r   r'   r   Úhasattrr   Ú__doc__)rE   ÚkwdsÚw)r   r"   r   r   Úwrapper•   s    	zcoroutine.<locals>.wrapperT)r   ÚisgeneratorfunctionÚ	functoolsÚwrapsÚ_DEBUGÚ_is_coroutine)r"   rK   r   )r   r"   r   r   ‚   s    	!	$	c             C   s   t  |  d d ƒ S)z6Return True if func is a decorated coroutine function.rP   F)r:   )r"   r   r   r   r   ¤   s    c             C   s   t  |  t ƒ S)z)Return True if obj is a coroutine object.)rD   Ú_COROUTINE_TYPES)Úobjr   r   r   r   «   s    c             C   sü   t  |  ƒ s t ‚ t |  d |  j ƒ } |  j j } t |  t ƒ r¨ t j	 |  j
 ƒ r¨ t j |  j
 ƒ \ } } |  j d  k r’ d | | | f } qø d | | | f } nP |  j d  k	 rÙ |  j j } d | | | f } n |  j j } d | | | f } | S)Nr   z%s() done, defined at %s:%sz%s() running, defined at %s:%sz%s() running at %s:%s)r   r!   r:   r   r8   Úco_filenamerD   r   r   rL   r"   r   Z_get_function_sourcer6   Úf_linenoÚco_firstlineno)r   Z	coro_nameÚfilenameÚlinenor+   r   r   r   r)   °   s    r)   )Ú__all__rM   r   ZopcodeÚosr%   r#   Útypesr9   r   r   Úlogr   Zopmapr2   ÚflagsÚignore_environmentÚboolÚenvironÚgetrO   r   rB   r   r   r   ÚGeneratorTyperQ   r   r)   r   r   r   r   Ú<module>   s.   	I"