U
    nufm                     @   sd  d dl Z d dlZd dlZd dlmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZ ddlmZmZmZmZmZmZ ddlmZmZ d dlmZ ee	e dd	d
Zee	e dddZeedddZ edee!ej" dddZ#e j$e j%e j&e j'fZ(e(e j)e j*e j+e j,f Z-e j.e j/e j0e j1e j2e j3e j4e j5e j6e j7e j8e j9e j:dZ;G dd de<Z=dS )    N)CodeType	FrameType)
AnyCallableIteratorOptionalSequenceSetTupleTypeUnioncast   )EnhancedASTNotOneValueFoundSourceonlyfunction_node_typesassert_)
KnownIssueVerifierFailure)	lru_cache)nodereturnc                 c   s    t | dr| j} | V  q qq d S )Nparent)hasattrr   r    r   C/tmp/pip-unpacked-wheel-rq0hqjki/executing/_position_node_finder.pyparents   s    
r   c                 c   s   | V  t | E d H  d S N)r   r   r   r   r   node_and_parents   s    r!   c                 C   s:  t | tjr| j}nt | tjr(| j}nt | tjrL| jpH| j	dd }nnt | tj
tjtjfrj| j}nPt | tjr| jst| j}n2tjdkrt | tjr| j}ntdtt|  |dr6|ds6| j|  }}t |tjr||jkst|dsq6|j| }}q|jd}|dkr6d| | S |S )	z

    Parameters:
        node: the node which should be mangled
        name: the name of the node

    Returns:
        The mangled name of `node`
    .r         zno node to mangle for type __r   _ )
isinstanceast	AttributeattrNameidaliasZasnamenamesplitFunctionDefClassDefAsyncFunctionDefExceptHandlerAssertionErrorsysversion_infoTypeVar	TypeErrorreprtype
startswithendswithr   basesr   lstrip)r   r0   r   child
class_namer   r   r   mangled_name   s0    


rC      )coder   c                 C   s   t tj| ddS )NT)Zshow_caches)listdisget_instructions)rE   r   r   r   rH   I   s    rH   )z***@z///%+-z<<z>>&^|c                   @   s   e Zd ZdZeee eje	e
dddZee	ddddZeejdd	d
dZeejeedddZeejdd	ddZe	ejdddZe	edddZdZejdkrejfZdejejejejfefe	ee e e!df edddZ"dS )PositionNodeFindera%  
    Mapping bytecode to ast-node based on the source positions, which where introduced in pyhon 3.11.
    In general every ast-node can be exactly referenced by its begin/end line/col_offset, which is stored in the bytecode.
    There are only some exceptions for methods and attributes.
    )framestmtstreelastisourcec                 C   s   t |j| _|| _d | _| |dkr0|d8 }qz| || _W nX tk
r   | |dkrht	j
f}n| |dkrt	jf}n | j|d|d| _Y nX | | j| | | | j| | jd kr| | j| | nt| j| jjk d S )NCACHE   )LOAD_METHOD	LOAD_ATTR
STORE_ATTRDELETE_ATTRCALL)end_col_offset
end_lineno)match_positionstyp)rH   f_codebc_listrW   	decoratoropname	find_noderesultr   r*   r+   Callknown_issuesinstructiontest_for_decoratorverifyr   decorator_list)selfrS   rT   rU   rV   rW   rb   r   r   r   __init__t   s.    




zPositionNodeFinder.__init__N)r   indexr   c                 C   s   t |jtjtfr||jjkr|j}| |d dks@tjdkr| |dksPq|d7 }| |dkrp|d7 }qX| |	dr| 
||kr|| _|| _d S tjdk r$|d7 }q$d S )N   ZPRECALLr#   r^   rY   )rX   EXTENDED_ARGSTORE_)r)   r   r*   r3   r   rn   rf   r7   r8   r=   rg   rh   re   )ro   r   rq   Z	node_funcr   r   r   rl      s0    


z%PositionNodeFinder.test_for_decorator)r   rk   r   c                 C   s2  |j dkrzt|trzt|trndd t|jD }t|d t|dkr`t	t
|d  }| _qztd| ntd| tjd d	 d
krt|tjr|j dkrtdd t|D rtdt|tjrtdtdd t|D rtdtjdkrt|tjrt|jtjr|jjdkr|j}t|drZt|tjtjfsZ|j}q0d }t|dr|jj|jj}|r|d j}|j |jfdd|fd|ffkrtd| ||rtd|j dkr|jdkrtd|j dkr.t|tjs.tdd t |D r.tjdkr.td d S )!N
COMPARE_OPZIS_OPZCONTAINS_OPc                 S   s*   g | ]"}t |tjrt|jd kr|qS )r   )r)   r*   Comparelenops.0nr   r   r   
<listcomp>   s    z3PositionNodeFinder.known_issues.<locals>.<listcomp>z expected at least one comparisonr   r   z4multiple chain comparison inside %s can not be fixedz+chain comparison inside %s can not be fixedr$   )r$      r   r^   c                 s   s   | ]}t |tjV  qd S r    r)   r*   Assertrz   r   r   r   	<genexpr>   s     z2PositionNodeFinder.known_issues.<locals>.<genexpr>zBknown bug in 3.11.1 https://github.com/python/cpython/issues/95921assertc                 s   s   | ]}t |tjV  qd S r    )r)   r*   patternrz   r   r   r   r     s     z)pattern matching ranges seems to be wrongr#   superr   args)
LOAD_DEREF	__class__	LOAD_FASTr   zsuper optimizationzCexeption cleanup does not belong to the last node in a except block
STORE_NAME__classcell__zstore __classcell__c                 s   s   | ]}t |tjV  qd S r    r   )r{   pr   r   r   r   B  s     )r$   r~   rY   z&exception generation maps to condition)!rf   r)   types_cmp_issuetypes_cmp_issue_fixr*   walktestr   rx   r   r   rh   r   r7   r8   rw   anyr!   r   ri   funcr-   r.   r   r   r4   r2   r   posonlyargsargargvalis_except_cleanupr   )ro   r   rk   Zcomparisonsr   Z	first_argr   r   r   r   rj      s     
	




	 




zPositionNodeFinder.known_issues)instr   r   c                    s    j dkrdS t|tjrFt|jtjrF j drFt| jkrFdS t|tjr~t|jtj	r~ j dr~t| jkr~dS t
 fddt|D S )N)r   
STORE_FASTSTORE_DEREFSTORE_GLOBALDELETE_NAMEDELETE_FASTDELETE_DEREFDELETE_GLOBALFrt   ZDELETE_c                 3   s.   | ]&}t |tjo$|jo$t| jkV  qd S r    )r)   r*   r5   r0   rC   r   rz   r   r   r   r   z  s   z7PositionNodeFinder.is_except_cleanup.<locals>.<genexpr>)rf   r)   r*   r-   ctxStorer=   rC   r   Delr   r   )r   r   r   r   r   r   G  s.    





z$PositionNodeFinder.is_except_cleanupc                    sz   j }dd }td}tttt f ttd fdd}ttttdf f ttdfd	d
}|dkrjdS |dr|t	j
t	jfrdS |dr|t	jt	jt	jt	jfrdS tjdkr|dr|t	jt	jt	jfrdS |dr|t	jt	jfrdS |dr
|t	jr
dS |dddr(|t	jr(dS |dddsN|dddsN|dr|t	jt	jt	jdrttt	jtt	jjjtrdS |dr|t	jrdS |dr|t	j jt	jdrdS |dr|t	j s|t	jt	jdrdS |dr|t	j
rdS |d d!dr*|t	jr*dS |d"rT|t	j!rT jt"krTdS |d#r|t	j#t	j$frt% fd$d%tt	j#j&D rdS |d&r|t	j't	jt	j(fs|t	jt	j)d'r܈ jt"krdS |d(r|t	j*t+ j,-d) drdS |t	j.t	jd'r.|d*t"dr.dS |d+rH|t	j/rHdS |d,rh|t	j0t	jd'rhdS |t	jt	j1d's|t	jt	j)d'rtj2t	j*r|d-t"drdS |t	jt	jd'r|d.t"drdS |t	jr|d/tt	jjdrdS |t	jt	jt	jt	jt	j3fr.|d0r.dS tjdkr|t	j4t	j5dr^|d1d2d3r^dS |t	j0rx|d4rxdS |t	j$r|d1d5d3rdS |t	j6stj2t	jr|d1d6d3rdS |t	jr|d7d8drdS |t	j7r.|d1d9d3s*|d:d;d3s*|d:d<d3s*|d=t"d3r.dS |t	j8r\|d1d>d3sX|d=j9d3r\dS |t	j:r|d1d?d3s|d=j9d3rdS |t	j;r|d1d@d3s|dAj9j<d3s|drdS |t	jr j=r |dBdCd3rdS |dDdEd3rdS |d1dFd3rdS |d7d8dr dS |t	j't	j(fr~j=r~|drHdS |d:dGd3rZdS |dHdIdrldS |dHdJdr~dS |dKdLdrdS |t	j r|ddds|dMrdS |t	j>r|dNrdS td}td|?dOrt	j0}t	j1}n|?dPr(t	j}t+ j, fdQd}n|?dRrdt	j4}t@t	j5t	jAt	jBt	jCdS| fdTd}n|dUkrt	j.}t	j1} fdVd}n||dWkrt	j}t	j1} fdXd}nX|dkrt	j}dYd }n>|?dZrt	j)}t	j0}n$|?d[rt	j)}t	j.} fd\d}tDd]d}	|tdk	p4tEd] p4t|	|}
t|rV|
rV|rVdS d^tjF j f }tG| dS )_zE
        checks if this node could gererate this instruction
        c                 S   s   dS )NTr   er   r   r   <lambda>      z+PositionNodeFinder.verify.<locals>.<lambda>N)opnameskwargsr   c                    s0   t | tr| g}  j| ko.| fdd|D kS )a)  
            match instruction

            Parameters:
                opnames: (str|Seq[str]): inst.opname has to be equal to or in `opname`
                **kwargs: every arg has to match inst.arg

            Returns:
                True if all conditions match the instruction

            c                    s   i | ]}|t  |qS r   getattr)r{   krk   r   r   
<dictcomp>  s     zAPositionNodeFinder.verify.<locals>.inst_match.<locals>.<dictcomp>)r)   strrf   )r   r   r   r   r   
inst_match  s
    
z-PositionNodeFinder.verify.<locals>.inst_match.)	node_typer   r   c                    s$   t  | o"t fdd| D S )a  
            match the ast-node

            Parameters:
                node_type: type of the node
                **kwargs: every `arg` has to be equal `node.arg`
                        or `node.arg` has to be an instance of `arg` if it is a type.
            c                 3   s:   | ]2\}}t |tr$t t ||nt ||kV  qd S r    )r)   r<   r   )r{   r   vr   r   r   r     s   z@PositionNodeFinder.verify.<locals>.node_match.<locals>.<genexpr>)r)   allitems)r   r   r   r   r   
node_match  s    	z-PositionNodeFinder.verify.<locals>.node_matchrX   r^   )r^   r   r#   )ZLOAD_FAST_AND_CLEARr   )r^   CALL_FUNCTION_EXru   	LOAD_NAME__annotations__)r   rZ   joinr[   )r^   BUILD_STRING)leftopSTORE_SUBSCR)r   r   )r.   r   r   )r   )ZBEFORE_WITHZWITH_EXCEPT_START)r   r   __doc__)r   r   r   r   )r   r   r   r   c                 3   s"   | ]}t tt| jkV  qd S r    )rC   r   r   r   )r{   r/   r   r   r   r     s     z,PositionNodeFinder.verify.<locals>.<genexpr>)r   r   r   r   )r   Z	BINARY_OP=r]   )JUMP_IF_TRUE_OR_POPJUMP_IF_FALSE_OR_POPPOP_JUMP_IF_TRUEPOP_JUMP_IF_FALSEDELETE_SUBSCR)r   r   ZLOAD_FAST_CHECKLOAD_GLOBALr   LOAD_FROM_DICT_OR_DEREF)r   r   r   
LOAD_CONST)GET_ITERFOR_ITERZCALL_INTRINSIC_1ZINTRINSIC_UNARY_POSITIVE)argreprZBINARY_SLICEZINTRINSIC_IMPORT_STARZINTRINSIC_ASYNC_GEN_WRAPr   Z__classdict__ZINTRINSIC_TYPEVARZCALL_INTRINSIC_2ZINTRINSIC_TYPEVAR_WITH_BOUNDZ"INTRINSIC_TYPEVAR_WITH_CONSTRAINTS)r   r   ZINTRINSIC_TYPEVARTUPLEZINTRINSIC_PARAMSPECZINTRINSIC_TYPEALIAS)r   r   r   )r   r   r   z.type_params)r   r   z.generic_baseZINTRINSIC_SUBSCRIPT_GENERICZ"INTRINSIC_SET_FUNCTION_TYPE_PARAMSr   z	.defaultsz.kwdefaultsr   Z__classdictcell__)LIST_APPENDr^   FORMAT_VALUE)BINARY_SUBSCRzSLICE+ZBINARY_c                    s   t ttj| j S r    )r)   r   r*   BinOpr   r   op_typer   r   r     r   ZUNARY_)UNARY_POSITIVEUNARY_NEGATIVE	UNARY_NOTUNARY_INVERTc                    s   t ttj| j S r    )r)   r   r*   UnaryOpr   r   r   r   r   r     r   )r[   rZ   ZLOOKUP_METHODZLOAD_SUPER_ATTRc                    s   t |  jkS r    rC   r   r   r   r   r   r     r   )r   r   r   r   LOAD_CLASSDEREFc                    s   t tj| j jkS r    )r   r*   r-   r.   r   r   r   r   r   r     r   c                 S   s   t ttj| jdkS )Nr   )rx   r   r*   rw   ry   r   r   r   r   r     r   )ZSTORE_SLICEr   r\   c                    s   t |  jkS r    r   r   r   r   r   r     r   r   zast.%s is not created from %s)Hrf   r<   r   r   r   r   boolr   r
   r*   ZWithZ	AsyncWithListCompGeneratorExpSetCompDictCompr7   r8   r3   ri   rw   Z	AnnAssignr   ConstantModr)   r   r   valuer-   r   r   Z	JoinedStrr5   rC   ZImportZ
ImportFromr   namesr2   r4   r   Z	AugAssignop_type_mapr   Zremovesuffixr+   ZBoolOpZ	SubscriptLoadr   ZForr   ZUAddZYieldr9   ZTypeVarTupler0   Z	ParamSpecZ	TypeAliasr.   Ztype_paramsZFormattedValuer=   dictZUSubZNotZInvertr   r   __name__r   )ro   r   rk   Zop_nameZextra_filterr   r   r   rb   Znode_ctxZ	ctx_matchtitler   )rk   r   r   r   rm     s8   "&





  
	  	    

  



  
 







zPositionNodeFinder.verify)rq   r   c                 C   s   | j |d  S )NrY   )rd   ro   rq   r   r   r   rk     s    zPositionNodeFinder.instructionc                 C   s   |  |jS r    )rk   rf   r   r   r   r   rf   	  s    zPositionNodeFinder.opnamer   r#   )linenor`   
col_offsetr_   .)rq   ra   rb   r   c                    sF   |  |jd k	rjd k	s"tt fdd| jjj D S )Nc                 3   sR   | ]J t  rt  tjst  tjst fd dD rtt V  qdS )c                 3   s"   | ]}t |t  |kV  qd S r    r   )r{   r,   )r   positionr   r   r   +  s   z9PositionNodeFinder.find_node.<locals>.<genexpr>.<genexpr>N)r)   r*   ZExprZ
MatchValuer   r   r   )r{   ra   r   rb   r   r   r   $  s   
z/PositionNodeFinder.find_node.<locals>.<genexpr>)rk   Z	positionsr   r6   r   rW   Z_nodes_by_line)ro   rq   ra   rb   r   r   r   rg     s
    zPositionNodeFinder.find_node)#r   
__module____qualname__r   r   r	   r   r*   Moduleintr   rp   rl   rG   Instructionrj   staticmethodr   r   rm   rk   r   rf   Zextra_node_typesr7   r8   Z
type_paramexprZstmtZexcepthandlerr   r   tupler   rg   r   r   r   r   rR   m   s:   5/o7   


rR   )>r*   r7   rG   typesr   r   typingr   r   r   r   r   r	   r
   r   r   r   Z	executingr   r   r   r   r   r   _exceptionsr   r   	functoolsr   r   r!   r   rC   rF   r   rH   ZIfExpZIfr   ZWhiler   r   r   r   r   r   ZPowZMultZMatMultZFloorDivZDivr   ZAddZSubZLShiftZRShiftZBitAndZBitXorZBitOrr   objectrR   r   r   r   r   <module>   sL   0 	-