B
    öçXM	  ã            
   @   sr   d Z ddlZddlZdd„ ZdZye ¡ dkr4eƒ ZW n4 ek
rj Z zej 	d 
e¡¡ W ddZ[X Y nX [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	ƒr¤G 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 )zñThis 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/tblib/cpython.pyÚ	_PyObject   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   Ú
_Traceback.   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_next8   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   ZCPythonz*Failed to initialize cpython support: {!r})Ú__doc__Úplatformr   r   r   Zpython_implementationÚ	ExceptionÚexcÚstderrÚwriteÚformatr   r   r   r   Ú<module>   s   @
$