a
    ¥bº,  ã                ,   @   s"  d Z ddlZddlZddlZddlmZmZ dd„ Zdd„ ZG dd	„ d	e	ƒZ
d-dd„Zd.dd„Zdd„ Zejdejdejdejdejdejdejdejdejdejdejdejdejdejdejdejd ejd!ejd"ej d#ej!d$ej"d%ej#d&iZ$ej%d'ej&d(ej'd)ej(d*iZ)G d+d,„ d,ej*ƒZ+dS )/z‚
Find intermediate evalutation results in assert statements through builtin AST.
This should replace _assertionold.py eventually.
é    N)Ú_format_explanationÚBuiltinAssertionErrorc                 C   s   t | tjƒS ©N)Ú
isinstanceÚastÚexpr©Únode© r
   ú5lib/python3.9/site-packages/py/_code/_assertionnew.pyÚ_is_ast_expr   s    r   c                 C   s   t | tjƒS r   )r   r   Ústmtr   r
   r
   r   Ú_is_ast_stmt   s    r   c                   @   s   e Zd ZdZddd„ZdS )ÚFailurez#Error found while interpreting AST.Ú c                 C   s   t  ¡ | _|| _d S r   )ÚsysÚexc_infoÚcauseÚexplanation)Úselfr   r
   r
   r   Ú__init__   s    
zFailure.__init__N)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r
   r
   r
   r   r      s   r   Fc                 C   sT   t  | ¡}t|ƒ}z| |¡ W n& tyF   t ¡ d }t|ƒ Y S 0 |rPdS d S )Né   zª(assertion failed, but when it was re-run for printing intermediate values, it did not fail.  Suggestions: compute assert expression before the assert or use --no-assert))r   ÚparseÚDebugInterpreterÚvisitr   r   r   Ú
getfailure)ÚsourceÚframeZshould_failÚmodZvisitorÚfailurer
   r
   r   Ú	interpret   s    
r$   c                 C   s$   |d u rt j t d¡¡}t| |ƒS )Nr   )ÚpyÚcodeZFramer   Ú	_getframer$   )Zoffending_liner!   r
   r
   r   Úrun(   s    r(   c                 C   s€   t | jƒ}| jd }t|ƒrR| ¡ }|s2| d¡ |d  d|f 7  < d |¡}d| jd j|f }| d¡r||dd … }|S )	Nr   r   r   z << %sÚ
z%s: %szAssertionError: assert é   )	r   r   r   ÚstrÚ
splitlinesÚappendÚjoinr   Ú
startswith)r#   r   ÚvalueÚlinesÚtextr
   r
   r   r   -   s    




r   ú|ú^ú&z<<z>>ú+ú-Ú*ú/z//ú%z==z!=ú<z<=ú>z>=z**Úiszis notÚinznot inznot %sz~%sz-%sz+%sc                   @   sŠ   e Zd ZdZdd„ Zdd„ Zd"dd„Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!S )#r   z;Interpret AST nodes to gleam useful debugging information. c                 C   s
   || _ d S r   )r!   )r   r!   r
   r
   r   r   `   s    zDebugInterpreter.__init__c                 C   sº   t |ƒrZt |¡}|  |¡}z| j |¡}W n tyD   tƒ ‚Y n0 | j |¡}||fS t	|ƒr¨t 
|g¡}|  |d¡}z| j |¡ W n ty¢   tƒ ‚Y n0 dS td|f ƒ‚d S )NÚexec)NNzcan't handle %s)r   r   Z
ExpressionÚ_compiler!   ÚevalÚ	Exceptionr   Úreprr   ÚModuleÚexec_ÚAssertionError)r   r	   r"   ÚcoÚresultr   r
   r
   r   Úgeneric_visitc   s$    

zDebugInterpreter.generic_visitrA   c                 C   s   t |d|ƒS )Nz<assertion interpretation>)Úcompile)r   r    Úmoder
   r
   r   r@   y   s    zDebugInterpreter._compilec                 C   s   |   |j¡S r   )r   r0   )r   r   r
   r
   r   Ú
visit_Expr|   s    zDebugInterpreter.visit_Exprc                 C   s   |j D ]}|  |¡ qd S r   )Úbodyr   )r   r"   r   r
   r
   r   Úvisit_Module   s    
zDebugInterpreter.visit_Modulec                 C   sb   |   |¡\}}d|jf }|  |¡}z| j |¡}W n tyJ   d}Y n0 |sZ|j|fS ||fS )Nz%r in locals() is not globals()F)rI   Úidr@   r!   rA   rB   )r   Únamer   rH   r    rG   Úlocalr
   r
   r   Ú
visit_Nameƒ   s    


zDebugInterpreter.visit_Namec              	   C   sþ   |j }|  |¡\}}t|j|jƒD ]²\}}|  |¡\}}t|j }	d||	|f }
d|	f }|  |¡}z| jj	|||d}W n t
y”   t|
ƒ‚Y n0 z|s¢W  qÖW n$ ty¸   ‚ Y n   Y  qÖY n0 || }}q"tjj}|rö||	||ƒ}|rö|}
|
|fS )Nz%s %s %sú#__exprinfo_left %s __exprinfo_right©Z__exprinfo_leftZ__exprinfo_right)Úleftr   ÚzipÚopsÚcomparatorsÚoperator_mapÚ	__class__r@   r!   rA   rB   r   ÚKeyboardInterruptr%   r&   Z_reprcompare)r   ÚcomprU   Úleft_explanationÚleft_resultÚopZnext_opZnext_explanationZnext_resultZ	op_symbolr   r    rG   rH   ZrcompÚresr
   r
   r   Úvisit_Compare‘   s<    
ÿ


ÿ

zDebugInterpreter.visit_Comparec                 C   sh   t |jtjƒ}g }|jD ](}|  |¡\}}| |¡ ||kr qBq|rJdpLd}d| |¡ d }||fS )Nz or z and ú(ú))r   r_   r   ZOrÚvaluesr   r-   r.   )r   ZboolopZis_orZexplanationsÚoperandr   rH   rP   r
   r
   r   Úvisit_BoolOp°   s    

zDebugInterpreter.visit_BoolOpc                 C   sl   t |jj }|  |j¡\}}||f }|  |d ¡}z| jj||d}W n tyb   t	|ƒ‚Y n0 ||fS )N©Ú__exprinfo_expr)
Ú	unary_mapr_   rZ   r   re   r@   r!   rA   rB   r   )r   ZunaryÚpatternZoperand_explanationZoperand_resultr   rG   rH   r
   r
   r   Úvisit_UnaryOp¼   s    
zDebugInterpreter.visit_UnaryOpc                 C   sˆ   |   |j¡\}}|   |j¡\}}t|jj }d|||f }d|f }|  |¡}	z| jj|	||d}
W n t	y~   t
|ƒ‚Y n0 ||
fS )Nz
(%s %s %s)rS   rT   )r   rU   ÚrightrY   r_   rZ   r@   r!   rA   rB   r   )r   Zbinopr]   r^   Zright_explanationZright_resultÚsymbolr   r    rG   rH   r
   r
   r   Úvisit_BinOpÇ   s    ÿ


ÿ
zDebugInterpreter.visit_BinOpc                 C   sØ  |   |j¡\}}g }d|i}g }|jD ]<}|   |¡\}}	dt|ƒf }
|	||
< | |
¡ | |¡ q&|jD ]T}|   |j¡\}}	dt|ƒf }
|	||
< d|j }| ||
f ¡ | ||f ¡ qj|jr|   |j¡\}}	d}
|	||
< | d|
f ¡ | d|f ¡ |j	rH|   |j	¡\}}	d}
|	||
< | d|
f ¡ | d|f ¡ d 
|¡}d	||f }d 
|¡}d
|f }|  |¡}z| jj|fi |¤Ž}W n ty°   t|ƒ‚Y n0 d}| j |¡}||||f }||fS )NZ__exprinfo_funcz__exprinfo_%sz%s=%%sZ__exprinfo_starz*%sZ__exprinfo_kwdsz**%sz, z%s(%s)z__exprinfo_func(%s)ú%s
{%s = %s
})r   ÚfuncÚargsÚlenr-   Úkeywordsr0   ÚargZstarargsÚkwargsr.   r@   r!   rA   rB   r   rC   )r   ÚcallZfunc_explanationrp   Zarg_explanationsÚnsZ	argumentsrt   Zarg_explanationZ
arg_resultZarg_nameÚkeywordZkeyword_sourceZargs_explainedr   rq   r    rG   rH   rj   Úrepr
   r
   r   Ú
visit_CallÖ   sT    







zDebugInterpreter.visit_Callc                 C   sF   d}||j |j f }|  |¡}z| j |¡W S  ty@   Y dS 0 d S )Nz*%r not in globals() and %r not in locals()F)rO   r@   r!   rA   rB   )r   rP   rj   r    rG   r
   r
   r   Ú_is_builtin_name  s    
z!DebugInterpreter._is_builtin_namec                 C   s  t |jtjƒs|  |¡S |  |j¡\}}d||jf }d|jf }|  |¡}z| j	j
||d}W n tyz   t|ƒ‚Y n0 d| j	 |¡| j	 |¡||jf }d}||jf }|  |¡}z| j	j
||d}W n tyâ   d}Y n0 |r| j	 |¡}	d}
|
|	|	|f }||fS )Nz%s.%sz__exprinfo_expr.%srg   z%s
{%s = %s.%s
}z.%r in getattr(__exprinfo_expr, '__dict__', {})Tro   )r   Úctxr   ÚLoadrI   r   r0   Úattrr@   r!   rA   rB   r   rC   )r   r~   Zsource_explanationZsource_resultr   r    rG   rH   Zfrom_instancery   rj   r
   r
   r   Úvisit_Attribute  s4    


þ

z DebugInterpreter.visit_Attributec                 C   sj   |   |j¡\}}| d¡r0| d¡r0|dd… }d|f }|sbzt‚W n ty`   t|ƒ‚Y n0 ||fS )NzFalse
{False =r)   é   éþÿÿÿz	assert %s)r   Útestr/   Úendswithr   rB   r   )r   ZassrtZtest_explanationZtest_resultr   r
   r
   r   Úvisit_Assert'  s    
ÿ
zDebugInterpreter.visit_Assertc           	      C   s    |   |j¡\}}d|f }tjdt ¡ |jj|jjd}tj|j||j|jd}t 	|g¡}|  
|d¡}z| jj||d W n ty–   t|ƒ‚Y n0 ||fS )Nz... = %srh   )ÚlinenoÚ
col_offsetr?   rg   )r   r0   r   ÚNamer}   r…   r†   ZAssignÚtargetsrD   r@   r!   rE   rB   r   )	r   ZassignZvalue_explanationZvalue_resultr   rP   Z
new_assignr"   rG   r
   r
   r   Úvisit_Assign4  s     
þÿzDebugInterpreter.visit_AssignN)rA   )r   r   r   r   r   rI   r@   rL   rN   rR   ra   rf   rk   rn   rz   r{   r   r„   r‰   r
   r
   r
   r   r   ]   s    
,	r   )F)N),r   r   r   r%   Zpy._code.assertionr   r   r   r   rB   r   r$   r(   r   ZBitOrZBitXorZBitAndZLShiftZRShiftZAddZSubZMultZDivZFloorDivZModZEqZNotEqZLtZLtEZGtZGtEZPowZIsZIsNotZInZNotInrY   ZNotZInvertZUSubZUAddri   ZNodeVisitorr   r
   r
   r
   r   Ú<module>   sN   

êü