B
    H/\3                 @   s:  d Z ddlZdd ZdaddlZddlmZ ddlmZ yddlm	Z	 W n e
k
r`   dZ	Y nX dZd	Zejd d
kZedZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdd Zdd Zdd Zdd Zd d! Zd aa d"a!d#d$ Z"ed%d& Z#ed'd( Z$dS ))zc
Taken verbatim from Jinja2.

https://github.com/mitsuhiko/jinja2/blob/master/jinja2/debug.py#L267
    Nc                 s   ddl ddlm  tjdr(j} nj} G dd dj}d| fd|fg|_	tt
d	rG d
d dj}d|fd|fd| fd|fg|_	G dd d|dfd|fdjfdjfg_	 fdd}|S )zThis function implements a few ugly things so that we can patch the
    traceback objects.  The function returned allows resetting `tb_next` on
    any python traceback object.  Do not attempt to use this on non cpython
    interpreters
    r   N)TracebackTypeZPy_InitModule4_64c               @   s   e Zd ZdS )z"_init_ugly_crap.<locals>._PyObjectN)__name__
__module____qualname__ r   r   ,lib/python3.7/site-packages/gevent/_tblib.py	_PyObject6   s   r   	ob_refcntob_typeZ
getobjectsc               @   s   e Zd ZdS )z"_init_ugly_crap.<locals>._PyObjectN)r   r   r   r   r   r   r   r   @   s   Z_ob_nextZ_ob_prevc               @   s   e Zd ZdS )z#_init_ugly_crap.<locals>._TracebackN)r   r   r   r   r   r   r   
_TracebackJ   s   r   tb_nexttb_frametb_lasti	tb_linenoc                s   t |  r|dks$t | s$tdt| }| jdk	rZt| j}| jd8  _|dkrr |_n(t|}| jd7  _||_dS )z0Set the tb_next attribute of a traceback object.Nz/tb_set_next arguments must be traceback objects   )
isinstance	TypeErrorZfrom_addressidr   r	   POINTERZpointer)tbnextobjold)r   r   ctypesr   r   tb_set_nextT   s    
z$_init_ugly_crap.<locals>.tb_set_next)r   typesr   hasattrZ	pythonapiZc_int64Zc_intZ	Structurer   Z_fields_sys)Z_Py_ssize_tr   r   r   )r   r   r   r   _init_ugly_crap&   s*    
r   )CodeType)r   )tproxyz1.3.0)	Traceback   zO^\s*File "(?P<co_filename>.+)", line (?P<tb_lineno>\d+)(, in (?P<co_name>.+))?$c               @   s   e Zd ZdZejZdS )	_AttrDictr   N)r   r   r   	__slots__dict__getitem____getattr__r   r   r   r   r#      s   r#   c               @   s   e Zd ZdS )__traceback_makerN)r   r   r   r   r   r   r   r(      s   r(   c               @   s   e Zd ZdS )TracebackParseErrorN)r   r   r   r   r   r   r   r)      s   r)   c               @   s   e Zd Zdd ZdS )Codec             C   s4   |j | _ |j| _|j| _|j| _|j| _|j| _d S )N)co_filenameco_name
co_nlocalsco_stacksizeco_flagsco_firstlineno)selfcoder   r   r   __init__   s    zCode.__init__N)r   r   r   r3   r   r   r   r   r*      s   r*   c               @   s   e Zd Zdd Zdd ZdS )Framec             C   s*   t dd |j D | _t|j| _d S )Nc             S   s    g | ]\}}|d kr||fqS ))__file__r   r   ).0kvr   r   r   
<listcomp>   s   z"Frame.__init__.<locals>.<listcomp>)r%   	f_globalsitemsr*   f_code)r1   framer   r   r   r3      s    zFrame.__init__c             C   s   d S )Nr   )r1   r   r   r   clear   s    zFrame.clearN)r   r   r   r3   r>   r   r   r   r   r4      s   r4   c               @   sJ   e Zd ZdZdd Zdd Zdd Zdd	 Zed
d Z	edddZ
dS )r!   Nc             C   sn   t |j| _t|j| _|j}| }t| }x>|d k	rht|}t |j|_t|j|_||_|}|j}q,W d S )N)r4   r   intr   r   typeobject__new__)r1   r   Zprev_tracebackcls	tracebackr   r   r   r3      s    

zTraceback.__init__c             C   sN  t rt t| jS tstd| }d }d }x|r<|jj}td|jd  d |jjj	d}t
rtd|j|j|j|j|j|j|j|j|j	|j|j|jdd}n@td|j|j|j|j|j|j|j|j	 |j |j|jdd}yt||jji  W nB   t d j}|d kr|}|d k	r(t|| |}~Y nX |j}q,W z|S ~~X d S )	NzCannot re-create traceback !
r   zraise __traceback_makerexecr   r      )r    r   _Traceback__tproxy_handlerr   RuntimeErrorr   r<   compiler   r+   PY3r   co_kwonlyargcountr-   r.   r/   co_code	co_constsco_namesco_varnamesr,   r0   	co_lnotabencoderF   r:   r   exc_infor   )r1   ZcurrentZtop_tbr   r<   r2   Znext_tbr   r   r   as_traceback   sL    
 



zTraceback.as_tracebackc             O   sH   |dkr4|d dkr$| j o"| j  S t| |d S nt| |||S d S )N)__getattribute__r'   r   r   )r   rT   getattr)r1   Z	operationargskwargsr   r   r   Z__tproxy_handler   s
    zTraceback.__tproxy_handlerc             C   sL   | j dkrd}n
| j  }| jjj| jjjd}| jj|d}|| j|dS )z4Convert a Traceback into a dictionary representationN)r+   r,   )r:   r<   )r   r   r   )r   to_dictr   r<   r+   r,   r:   r   )r1   r   r2   r=   r   r   r   rY      s    

zTraceback.to_dictc             C   sn   |d r|  |d }nd }t|d d d |d d d d}t|d d |d}t||d	 |d
}| |S )Nr   r   r<   r+   r,   )r+   r,   r:   )r:   r<   r   )r   r   r   )	from_dictr#   )rC   Zdctr   r2   r=   r   r   r   r   rZ     s    
zTraceback.from_dictTc       	   	   C   s   g }|}xZ|  D ]N}| }|r0|dkrd}qt|}|rN||  q|drZq|rP qW |rd }x8t|D ],}t|t|t|d ddt|d|d}qvW | |S t	d	| d S )
Nz"Traceback (most recent call last):Fz  r+   ?)r5   r   )r:   r<   )r   r   z Could not find any frames in %r.)

splitlinesrstripFRAME_REmatchappend	groupdict
startswithreversedr#   r)   )	rC   stringstrictZframesheaderlineZframe_matchZpreviousr=   r   r   r   from_string#  s:    


zTraceback.from_string)T)r   r   r   r   r3   rT   rH   rY   classmethodrZ   rh   r   r   r   r   r!      s   2	r!   c             C   s$   t t}| |_||_||_| S )N)rA   rB   r!   r   r   r   rT   )r   r   r   Zretr   r   r   unpickle_tracebackL  s
    
rj   c             C   s"   t t| j| j| jot| jffS )N)rj   r4   r   r   r   r!   )r   r   r   r   pickle_tracebackT  s    rk   c              C   s:   ydd l } W n tk
r(   dd l} Y nX | tt d S )Nr   )copy_regImportErrorcopyregpickler   rk   )rl   r   r   r   installX  s
    rp   c                s     fdd} j |_  j|_|S )Nc                sL   t d krd S d }dt jkr,t jd }|  z | S |d k	rF|  X d S )Nzgevent.builtins)r   modulesZ_unlock_importsZ_lock_imports)aZgb)fr   r   gi  s    

z_unlocked_imports.<locals>.g)r   r   )rs   rt   r   )rs   r   _unlocked_importsh  s    ru   c              C   s:   ydd l } W n tk
r(   dd l} Y nX | ja| jad S )Nr   )ZcPicklerm   ro   dumpsloads)ro   r   r   r   _import_dump_load|  s    rx   Fc           
   C   s   t rd S da dd l} y|  dkr(t aW n4 tk
r^ } ztjd	| W d d }~X Y nX yddl
m} W n tk
r   d }Y nX ts|stdt  t  d S )NTr   ZCPythonz*Failed to initialize cpython support: {!r})r    z(Cannot use tblib. Runtime not supported.)
_installedplatformZpython_implementationr   r   	Exceptionr   stderrwriteformat__pypy__r    rm   rx   rp   )rz   excr    r   r   r   _init  s"    
$
r   c             C   s   t   t| S )N)r   rv   )r   r   r   r   dump_traceback  s    r   c             C   s   t   t| S )N)r   rw   )sr   r   r   load_traceback  s    r   )%__doc__r   r   r   rer   r   r   r   r    rm   __version____all__version_inforK   rJ   r^   r%   r#   r{   r(   r)   rA   r*   r4   r!   rj   rk   rp   ru   rx   rv   rw   ry   r   r   r   r   r   r   r   <module>    s>   @	

 %
	