dbfdg 3 aG\ /@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 r/usr/lib/python3.6/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.cCsJ||_||_||_d}x$|jD]}|dk r4|j||}qW|jddS)N)exc_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)rr/linesrrrrender_as_textas z!ProcessedTraceback.render_as_textFcCs,ddlm}d|||d|jjddfS)z)fullzutf-8replace)Zjinja2.debugrendererr7r6decode)rr8r7rrrrender_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!rr6r;r"r=r>r@rrrrr+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    rEcCs8||_d|_|j|df}|j}|dkr*d}t|||jS)z4Rewrites a syntax error to please traceback systems.TNz )sourceZ translated __class__filename fake_exc_infolineno)errorrFr>rHrrrrBs rBc 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. NrrrA)rangerrf_coderrgetZget_corresponding_lineno tb_linenorIrHappendr*rr+) r>rDr r.xZ initial_tbrtemplaterJrrrrCs*     rCc 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__rLrAr)rV) rOZget_allcopyr startswithrsplitint ValueErrorpop) Z real_localsZctxlocalsZlocal_overridesrvaluerUdepthZ cur_depthrrrget_jinja_localss*   r`c 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__rL)r__file__rar rAexecrSrootztop-level template codeZblock_z block "%s"r)r`rf_localsr\compile raise_helperrNco_namerXr r co_nlocals co_stacksizeco_flagsco_code co_constsco_names co_varnamesco_firstlineno co_lnotabco_kwonlyargcountrrdsysr>r) r>rHrJr,r-r r]globalscodelocationZfunctioneZnew_tbrrrrIsN          rIcsddlddlmtr4tjdr,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>srz ob_refcntob_typeZ getobjectsc@s eZdZdS)z"_init_ugly_crap.._PyObjectN)rrr rrrrrzGsZ_ob_nextZ_ob_prevc@s eZdZdS)z#_init_ugly_crap.._TracebackN)rrr rrrr _TracebackPsr}rrtb_lastirPcst|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 objectsrA)r< TypeErrorZ from_addressidrr{POINTERZpointer)r robjold)rr}ctypesrrrYs  z$_init_ugly_crap..tb_set_next) rtypesrr hasattrZ pythonapiZc_int64Zc_intZ c_ssize_tZ StructurerZ_fields_ru)Z _Py_ssize_trzrr)rr}rr_init_ugly_crap*s.       r)N)N)r)!r!rur1rrrZ jinja2.utilsrrZjinja2.exceptionsrZjinja2._compatrrr Z__pypy__r ImportErrorrd SyntaxErrorrirobjectr r*r+rErBrCr`rIrrrrrr s@    4 ,FD