3 C\ /@sDdZddlZddlZddlmZmZddlmZmZddl m Z ddl m Z m Z mZyddlmZWnek r|dZYnXy edWn.ek rd ZYnek rd ZYnXGd d d eZd dZGdddeZdddZdddZdddZddZddZddZdZ edkr@y eZ Wn YnX[dS) 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) 2017 by the Jinja Team. :license: BSD, see LICENSE for more details. N) TracebackTypeCodeType)missing internal_code)TemplateSyntaxError) iteritemsreraisePY2)tproxyzraise TypeError, 'foo'zraise __jinja_exception__[1]z4raise __jinja_exception__[0], __jinja_exception__[1]c@s@eZdZdZddZeddZddZedd Zd d Z d S) TracebackFrameProxyzProxies a traceback frame.cCs||_d|_dS)N)tb_tb_next)selfr rd/private/var/folders/pf/wv4htv3x0qs2c2mp0dnn0kchsvlck3/T/pip-install-emcbgzcf/jinja2/jinja2/debug.py__init__'szTracebackFrameProxy.__init__cCs|jS)N)r )rrrrtb_next+szTracebackFrameProxy.tb_nextc CsBtdk r8yt|j|r|jpdWntk r6YnX||_dS)N) tb_set_nextr Exceptionr )rnextrrrset_next/s zTracebackFrameProxy.set_nextcCsd|jjjkS)N__jinja_template__)r tb_frame f_globals)rrrris_jinja_frame:sz"TracebackFrameProxy.is_jinja_framecCs t|j|S)N)getattrr )rnamerrr __getattr__>szTracebackFrameProxy.__getattr__N) __name__ __module__ __qualname____doc__rpropertyrrrrrrrrr $s   r cs*t|tdkrSfdd}tt|S)Ncs@|dkrt|dS|dkr,j||nt|||SdS)N__getattribute__rr __setattr__)r#r)rr$)Z operationargskwargs)proxyrroperation_handlerFs z+make_frame_proxy..operation_handler)r r r)framer(r)r'rmake_frame_proxyBs  r*c@sPeZdZdZddZdddZddd Zed d Zed d Z eddZ dS)ProcessedTracebackz?Holds a Jinja preprocessed traceback for printing or reraising.cCsV|s td||_||_||_d}x$|jD]}|dk r@|j||}q*W|jddS)Nzno frames for this traceback?)AssertionErrorexc_type exc_valueframesr)rr-r.r/Zprev_tbr rrrrSs   zProcessedTraceback.__init__NcCs*tj|j|j|jd|d}dj|jS)z#Return a string with the traceback.r)limit) tracebackformat_exceptionr-r.r/joinrstrip)rr0linesrrrrender_as_textas z!ProcessedTraceback.render_as_textFcCs,ddlm}d|||d|jjddfS)z)fullzutf-8replace)Zjinja2.debugrendererr8r7decode)rr9r8rrrrender_as_htmlgs  z!ProcessedTraceback.render_as_htmlcCs t|jtS)z*`True` if this is a template syntax error.) isinstancer.r)rrrris_template_syntax_errorosz+ProcessedTraceback.is_template_syntax_errorcCs|j|j|jdfS)z;Exception info tuple with a proxy around the frame objects.r)r-r.r/)rrrrexc_infotszProcessedTraceback.exc_infocCs*|jd}t|tk r|j}|j|j|fS)z'Standard python exc_info for re-raisingr)r/typerr r-r.)rr rrrstandard_exc_infoys  z$ProcessedTraceback.standard_exc_info)N)F) rrr r!rr7r<r"r>r?rArrrrr+Ps    r+cCs2|\}}}t|tr$t||}d}nd}t||S)z7Creates a processed traceback object from the exc_info.r)r=rtranslate_syntax_errortranslate_exception)r?Z source_hintr-r.r initial_skiprrrmake_tracebacks    rFcCs8||_d|_|j|df}|j}|dkr*d}t|||jS)z4Rewrites a syntax error to please traceback systems.TNz )sourceZ translated __class__filename fake_exc_infolineno)errorrGr?rIrrrrCs rCc Cs|d}g}xt|D]}|dk r|j}qW|}xz|dk r|jjtkrN|j}q2|j}|jjjd}|dk r|j|j}t |dd|f|j |d}|j t ||}q2W|st |d|d|dt|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. NrrrB)rangerrf_coderrgetZget_corresponding_lineno tb_linenorJrIappendr*rr+) r?rEr r/xZ initial_tbrtemplaterKrrrrDs*     rDc Cs|jd}|r|jj}ni}i}xt|D]x\}}|jd s.|tkrLq.y|jdd\}}}t|}Wntk rw.YnX|j|dd}||kr.||f||<q.Wx6t|D]*\}\}}|tkr|j |dq|||<qW|S) NcontextZl__rMrBr)rW) rPget_allcopyr startswithrsplitint ValueErrorpop) Z real_localsctxlocalsZlocal_overridesrvaluerVdepthZ cur_depthrrrget_jinja_localss*   rcc Cs|\}}}|dk r,t|jj}|jddni}|||dddd}td|dt|d}y|dkrnd} n8|jjj} | d krd } n | jd rd | d d} nd} t rt d|j |j |j |j|j|j|j|| |j|jff}n8t d|j|j |j |j |j|j|j|j|| |j|jff}Wn$tk r>} zWYdd} ~ XnXyt|||Wntj}|dj} YnX|dd| fS)z!Helper for `translate_exception`.N__jinja_exception__rM)r__file__rdr rBexecrTrootztop-level template codeZblock_z block "%s"r)rcrf_localsr^compile raise_helperrOco_namerZr r co_nlocals co_stacksizeco_flagsco_code co_constsco_names co_varnamesco_firstlineno co_lnotabco_kwonlyargcountrrgsysr?r) r?rIrKr-r.r r`globalscodelocationfunctioneZnew_tbrrrrJsN          rJcsddlddlmtr4tjdr,j}q:j}nj}Gdddj }d|fdj |fg|_ tt d rGd ddj }d j |fd j |fd|fdj |fg|_ Gd dd|dj fdj |fdjfdjfg_ fdd}|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 rN)rZPy_InitModule4_64c@s eZdZdS)z"_init_ugly_crap.._PyObjectN)rrr rrrr _PyObject>sr~ ob_refcntob_typeZ getobjectsc@s eZdZdS)z"_init_ugly_crap.._PyObjectN)rrr rrrrr~GsZ_ob_nextZ_ob_prevc@s eZdZdS)z#_init_ugly_crap.._TracebackN)rrr rrrr _TracebackPsrrrtb_lastirQcst|o|dkpt|s$tdjt|}|jdk rZjt|j}|jd8_|dkrrj|_n(jt|}|jd7_j||_dS)z0Set the tb_next attribute of a traceback object.Nz/tb_set_next arguments must be traceback objectsrB)r= TypeError from_addressidrrPOINTERpointer)r robjold)rrctypesrrrYs  z$_init_ugly_crap..tb_set_next) rtypesrr hasattr pythonapic_int64c_int c_ssize_t Structurer_fields_rx)Z _Py_ssize_tr~rr)rrrr_init_ugly_crap*s.       r)N)N)r)!r!rxr2rrrZ jinja2.utilsrrZjinja2.exceptionsrZjinja2._compatrrr Z__pypy__r ImportErrorrg SyntaxErrorrlrobjectr r*r+rFrCrDrcrJrrrrrr s@    4 ,FD