
~bU!-                 @   s  d  Z  d d l Z d d l Z d d l m Z m Z d d l m Z m Z d d l	 m
 Z
 d d l m Z m Z m Z y d d l m Z Wn e k
 r d Z Yn Xy e d  Wn/ e k
 r d	 Z Yn e k
 r d
 Z Yn XGd d   d e  Z d d   Z Gd d   d e  Z d d d  Z d d d  Z d d d  Z d d   Z d d   Z d Z e d k ry e   Z Wn Yn X[ d S)aQ  
    jinja2.debug
    ~~~~~~~~~~~~

    Implements the debug interface for Jinja.  This module does some pretty
    ugly stuff with the Python traceback system in order to achieve tracebacks
    with correct line numbers, locals and contents.

    :copyright: (c) 2010 by the Jinja Team.
    :license: BSD, see LICENSE for more details.
    N)TracebackTypeCodeType)missinginternal_code)TemplateSyntaxError)	iteritemsreraisePY2)tproxyzraise TypeError, 'foo'zraise __jinja_exception__[1]z4raise __jinja_exception__[0], __jinja_exception__[1]c               @   s^   e  Z d  Z d Z d d   Z e d d    Z d d   Z e d d	    Z d
 d   Z	 d S)TracebackFrameProxyzProxies a traceback frame.c             C   s   | |  _  d  |  _ d  S)N)tb_tb_next)selfr    r   ./usr/lib/python3/dist-packages/jinja2/debug.py__init__'   s    	zTracebackFrameProxy.__init__c             C   s   |  j  S)N)r   )r   r   r   r   tb_next+   s    zTracebackFrameProxy.tb_nextc             C   sQ   t  d  k	 rD y# t  |  j | r' | j p* d   Wn t k
 rC Yn X| |  _ d  S)N)tb_set_nextr   	Exceptionr   )r   nextr   r   r   set_next/   s    #zTracebackFrameProxy.set_nextc             C   s   d |  j  j j k S)N__jinja_template__)r   tb_frame	f_globals)r   r   r   r   is_jinja_frame:   s    z"TracebackFrameProxy.is_jinja_framec             C   s   t  |  j |  S)N)getattrr   )r   namer   r   r   __getattr__>   s    zTracebackFrameProxy.__getattr__N)
__name__
__module____qualname____doc__r   propertyr   r   r   r   r   r   r   r   r   $   s   r   c                s;   t  |     t d  k r   S  f d d   } t t |  S)Nc                sV   |  d k r t    | d  S|  d k r<   j | |   n t    |   | |   Sd  S)N__getattribute__r   r   __setattr__)z__getattribute__z__getattr__)r   r$   )Z	operationargskwargs)proxyr   r   operation_handlerF   s
    z+make_frame_proxy.<locals>.operation_handler)r   r
   r   )framer(   r   )r'   r   make_frame_proxyB   s
    r*   c               @   sv   e  Z d  Z d Z d d   Z d d d  Z d d d	  Z e d
 d    Z e d d    Z	 e d d    Z
 d S)ProcessedTracebackz?Holds a Jinja preprocessed traceback for printing or reraising.c             C   sw   | s t  d   | |  _ | |  _ | |  _ d  } x0 |  j D]% } | d  k	 r\ | j |  | } q= W| j d   d  S)Nzno frames for this traceback?)AssertionErrorexc_type	exc_valueframesr   )r   r-   r.   r/   Zprev_tbr   r   r   r   r   S   s    			
zProcessedTraceback.__init__Nc             C   s;   t  j |  j |  j |  j d d | } d j |  j   S)z#Return a string with the traceback.r   limit )	tracebackformat_exceptionr-   r.   r/   joinrstrip)r   r0   linesr   r   r   render_as_texta   s    z!ProcessedTraceback.render_as_textFc             C   s<   d d l  m } d | |  d | |  j   j d d  f S)z<Return a unicode string with the traceback as rendered HTML.r   )render_tracebackz%s

<!--
%s
-->fullzutf-8replace)Zjinja2.debugrendererr8   r7   decode)r   r9   r8   r   r   r   render_as_htmlg   s    z!ProcessedTraceback.render_as_htmlc             C   s   t  |  j t  S)z*`True` if this is a template syntax error.)
isinstancer.   r   )r   r   r   r   is_template_syntax_erroro   s    z+ProcessedTraceback.is_template_syntax_errorc             C   s   |  j  |  j |  j d f S)z;Exception info tuple with a proxy around the frame objects.r   )r-   r.   r/   )r   r   r   r   exc_infot   s    zProcessedTraceback.exc_infoc             C   s;   |  j  d } t |  t k	 r( | j } |  j |  j | f S)z'Standard python exc_info for re-raisingr   )r/   typer   r   r-   r.   )r   r   r   r   r   standard_exc_infoy   s    	z$ProcessedTraceback.standard_exc_info)r   r   r    r!   r   r7   r<   r"   r>   r?   rA   r   r   r   r   r+   P   s   r+   c             C   sI   |  \ } } } t  | t  r6 t | |  }  d } n d } t |  |  S)z7Creates a processed traceback object from the exc_info.r      )r=   r   translate_syntax_errortranslate_exception)r?   Zsource_hintr-   r.   r   initial_skipr   r   r   make_traceback   s    	rF   c             C   sR   | |  _  d |  _ |  j |  d f } |  j } | d k r? d } t | | |  j  S)z4Rewrites a syntax error to please traceback systems.TNz	<unknown>)sourceZ
translated	__class__filenamefake_exc_infolineno)errorrG   r?   rI   r   r   r   rC      s    			rC   c       	      C   s,  |  d } g  } x) t  |  D] } | d k	 r | j } q W| } x | d k	 r | j j t k ro | j } qE | j } | j j j d  } | d k	 r | j | j  } t	 |  d d  | f | j
 |  d } | j t |   | } qE W| st |  d |  d |  d  t |  d |  d |  S)zIf passed an exc_info it will automatically rewrite the exceptions
    all the way down to the correct line numbers and frames.
       Nr   r   rB   )ranger   r   f_coder   r   getZget_corresponding_lineno	tb_linenorJ   rI   appendr*   r   r+   )	r?   rE   r   r/   xZ
initial_tbr   templaterK   r   r   r   rD      s*    
		
rD   c             C   s  |  \ } } } | d k	 r | j  j j   } | j d  } | rQ | j   } n i  } xI t |  D]; \ }	 }
 |	 j d  rd |
 t k	 rd |
 | |	 d d  <qd W| j d d  n i  } d | d | d |  d d  d d i } t	 d	 | d
 t
 | d  } y| d k rd } nP | j  j j } | d k r>d } n, | j d  rdd | d d  } n d } t rt d | j | j | j | j | j | j | j | | | j | j f  f   } nT t d | j | j | j | j | j | j | j | j | | | j | j f  f   } Wn% t k
 r=} z WYd d } ~ Xn Xy t | | |  Wn! t j   }  |  d j } Yn X|  d d  | f S)z!Helper for `translate_exception`.NcontextZl_rM   Z__jinja_exception__r   __file__r   
rB   execrT   rootztop-level template codeZblock_z
block "%s"   r   )r   f_localscopyrP   Zget_allr   
startswithr   popcompileraise_helperrO   co_namer	   r   
co_nlocalsco_stacksizeco_flagsco_code	co_constsco_namesco_varnamesco_firstlineno	co_lnotabco_kwonlyargcountr   rX   sysr?   r   )r?   rI   rK   r-   r.   r   Zreal_localsZctxlocalsr   valueglobalscodelocationZfunctioneZnew_tbr   r   r   rJ      s\    				rJ   c                 sy  d d l   d d l m   t rL t  j d  r@  j }  qU  j }  n	  j }  Gd d   d  j	  } d |  f d  j
 |  f g | _ t t d	  rGd
 d   d  j	  } d  j
 |  f d  j
 |  f d |  f d  j
 |  f g | _ Gd d   d |   d  j
   f d  j
 |  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)r   ZPy_InitModule4_64c               @   s   e  Z d  Z d S)z"_init_ugly_crap.<locals>._PyObjectN)r   r   r    r   r   r   r   	_PyObject(  s   rs   	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   rs   1  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   rv   r   r   tb_lastirQ   c                s   t  |     o' | d k p' t  |    s6 t d    j t |    } |  j d k	 r  j t |  j   } | j d 8_ | d k r  j     | _ n6  j t |   } | j d 7_  j |  | _ d S)z0Set the tb_next attribute of a traceback object.Nz/tb_set_next arguments must be traceback objectsrB   )r=   	TypeErrorZfrom_addressidr   rt   POINTERZpointer)r   r   objold)r   rv   ctypesr   r   r   C  s    z$_init_ugly_crap.<locals>.tb_set_next)r}   typesr   r	   hasattrZ	pythonapiZc_int64Zc_intZ	c_ssize_tZ	Structurerz   Z_fields_rl   )Z_Py_ssize_trs   r   r   )r   rv   r}   r   _init_ugly_crap  s.    			r   ) r!   rl   r2   r~   r   r   Zjinja2.utilsr   r   Zjinja2.exceptionsr   Zjinja2._compatr   r   r	   Z__pypy__r
   ImportErrorrX   SyntaxErrorr`   rx   objectr   r*   r+   rF   rC   rD   rJ   r   r   r   r   r   r   <module>   s>   
4,ND