o
    PFfm                     @   sl  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 ded	e	e fd
dZded	e	e fddZded	efddZ edded	e!ej" f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  nd S q)NTparent)hasattrr   r    r   ^/var/www/secure340b-portal/env/lib/python3.10/site-packages/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   sF  t | tjr
| j}nSt | tjr| j}nIt | tjr&| jp$| j	dd }n7t | tj
tjtjfr5| j}n(t | tjrD| js@J | j}ntjdkrSt | tjrS| j}n
tdtt|  |dr|ds| j| }}t |tjrx||jvst|ds	 |S |j|}}t |tjrx||jvrx|jd}|dkrd| | 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aliasasnamenamesplitFunctionDefClassDefAsyncFunctionDefExceptHandlersysversion_infoTypeVar	TypeErrorreprtype
startswithendswithr   basesr   lstrip)r   r1   r   child
class_namer   r   r   mangled_name   s4   



rC      codec                 C   s   t tj| ddS )NT)show_caches)listdisget_instructions)rE   r   r   r   rI   I   s   rI   )z***@z///%+-z<<z>>&^|c                
   @   s  e Zd ZdZdedee dejde	de
f
ddZd	ed
e	ddfddZd	edejddfddZedejd	edefddZd	edejddfddZd
e	dejfddZd
e	defddZdZejdkrgejfZdejejejejgeR fd
e	dee de e!d f def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r|d8 }| |dksz| || _W n+ tyQ   | |dv r9t	j
f}n| |dkrEt	jf}n | j|d|d| _Y nw | | j| | | | j| | jd u rt| | j| | d S t| j| jjv  d S )NCACHE   )LOAD_METHOD	LOAD_ATTR
STORE_ATTRDELETE_ATTRCALL)end_col_offset
end_lineno)match_positionstyp)rI   f_codebc_listrX   	decoratoropname	find_noderesultr   r*   r+   Callknown_issuesinstructiontest_for_decoratorverifyr   decorator_list)selfrT   rU   rV   rW   rX   rc   r   r   r   __init__t   s2   



zPositionNodeFinder.__init__r   indexr   Nc                 C   s   t |jtjtfra||jjv rc|j}	 | |d dks!tjdkr(| |dks*d S |d7 }| |dv r@|d7 }| |dv s5| |	drW| 
||krW|| _|| _d S tjdk r`|d7 }qd S d S )	NT   PRECALLr#   r_   rZ   )rY   EXTENDED_ARGSTORE_)r)   r   r*   r4   r   ro   rg   r7   r8   r=   rh   ri   rf   )rp   r   rr   	node_funcr   r   r   rm      s.   
z%PositionNodeFinder.test_for_decoratorrl   c                 C   s@  |j dv r<t|tr<t|tr6dd t|jD }t|d t|dkr0t	t
|d  }| _ntd| td| tjd d	 d
kr_t|tjr_|j dkr_tdd t|D r_tdt|tjritdtdd t|D rxtdtjdkrt|tjrt|jtjr|jjdkr|j}t|drt|tjtjfs|j}t|drt|tjtjfrd }t|drg |jj|jj}|r|d j}|j |jfdd|fd|ffv 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 d S d S d S )!N
COMPARE_OPIS_OP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       | ]	}t |tjV  qd S r    r)   r*   Assertr   r   r   r   	<genexpr>       z2PositionNodeFinder.known_issues.<locals>.<genexpr>zBknown bug in 3.11.1 https://github.com/python/cpython/issues/95921assertc                 s   r   r    )r)   r*   patternr   r   r   r   r     r   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   r   r    r   )r   pr   r   r   r   B  r   )r$   r   rZ   z&exception generation maps to condition)!rg   r)   types_cmp_issuetypes_cmp_issue_fixr*   walktestr   r}   r   r   ri   r   r7   r8   r|   anyr!   r   rj   funcr-   r.   r   r   r5   r3   r   posonlyargsargargvalis_except_cleanupr   )rp   r   rl   comparisonsr   	first_argr   r   r   r   rk      s   
	









zPositionNodeFinder.known_issuesinstc                    s    j dvrdS t|tjr#t|jtjr# j dr#t| jkr#d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_GLOBALFrv   DELETE_c                 3   s0    | ]}t |tjo|jot| jkV  qd S r    )r)   r*   r6   r1   rC   r   r   r   r   r   r   z  s
    
z7PositionNodeFinder.is_except_cleanup.<locals>.<genexpr>)rg   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}dtttt f dtdtf fdd}d	ttttd
f f dtdtffdd}|dkr9dS |drG|t	j
t	jfrGdS |drY|t	jt	jt	jt	jfrYdS tjdkrn|drn|t	jt	jt	jfrndS |dr||t	jt	jfr|dS |dr|t	jrdS |dddr|t	jrdS |ddds|ddds|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
rdS |d"d#dr|t	jrdS |d$r|t	j!r jt"krdS |d%r=|t	j#t	j$fr=t% fd&d'tt	j#j&D r=dS |d(r`|t	j't	jt	j(fsV|t	jt	j)d)r` jt"kr`dS 	 |d/rv|t	j-t. j/0d0 d rvdS |t	j1t	jd)r|d1t"drdS |d2r|t	j2rdS |d3r|t	j3t	jd)rdS |t	jt	j4d)s|t	jt	j)d)rtj5t	j-r|d4t"drdS |t	jt	jd)r|d5t"drdS |t	jr|d6tt	jjdrdS |t	jt	jt	jt	jt	j6fr
|d7r
dS tjdkr\|t	j7t	j8d r"|d8d9d:r"dS |t	j3r/|d;r/dS |t	j$r>|d8d<d:r>dS |t	j9sLtj5t	jrU|d8d=d:rUdS |t	jrd|d>d?drddS |t	j:r|d8d@d:s|dAdBd:s|dAdCd:s|dDt"d:rdS |t	j;r|d8dEd:s|dDj<d:rdS |t	j=r|d8dFd:s|dDj<d:rdS |t	j>r|d8dGd:s|dHj<j?d:s|drdS |t	jrj@r|dIdJd:rdS |dKdLd:rdS |d8dMd:rdS |d>d?drdS |t	j't	j(fr2j@r2|drdS |dAdNd:r dS |dOdPdr)dS |dOdQdr2dS |dRdSdr;dS |t	j rO|dddsM|dTrOdS |t	jAr\|dUr\dS td}td|BdVrqt	j3}t	j4}n|BdWrt	j}t. j/ fdXd}nn|BdYrt	j7}tCt	j8t	jDt	jEt	jFdZ| fd[d}nP|d\v rt	j1}t	j4} fd]d}n>|d^v rt	j}t	j4} fd_d}n,|dv rt	j}d`d }n|Bdart	j)}t	j3}n|Bdbrt	j)}t	j1} fdcd}tGddd}	|tduptHdd pt|	|}
t|r|
r|rdS detjI j f }tJ| )fzE
        checks if this node could gererate this instruction
        c                 S   s   dS )NTr   er   r   r   <lambda>  s    z+PositionNodeFinder.verify.<locals>.<lambda>Nopnameskwargsr   c                    s0   t | tr| g}  j| v 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rl   r   r   
<dictcomp>  s    zAPositionNodeFinder.verify.<locals>.inst_match.<locals>.<dictcomp>)r)   strrg   )r   r   r   r   r   
inst_match  s
   
z-PositionNodeFinder.verify.<locals>.inst_match	node_type.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<    | ]\}}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_matchrY   r_   )r_   r   r#   )LOAD_FAST_AND_CLEARr   )r_   CALL_FUNCTION_EXrx   	LOAD_NAME__annotations__)r   r[   joinr\   )r_   BUILD_STRING)leftopSTORE_SUBSCR)r   r   )r.   r   r   )r   )BEFORE_WITH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   F)r   r   )r1   ry   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   LOAD_FAST_CHECKLOAD_GLOBALr   LOAD_FROM_DICT_OR_DEREF)r   r   r   
LOAD_CONST)GET_ITERFOR_ITERCALL_INTRINSIC_1INTRINSIC_UNARY_POSITIVE)argreprBINARY_SLICEINTRINSIC_IMPORT_STARINTRINSIC_ASYNC_GEN_WRAPr   __classdict__INTRINSIC_TYPEVARCALL_INTRINSIC_2INTRINSIC_TYPEVAR_WITH_BOUND"INTRINSIC_TYPEVAR_WITH_CONSTRAINTS)r   r   INTRINSIC_TYPEVARTUPLEINTRINSIC_PARAMSPECINTRINSIC_TYPEALIAS)r   r   r   )r   r   r   z.type_params)r   r   z.generic_baseINTRINSIC_SUBSCRIPT_GENERIC"INTRINSIC_SET_FUNCTION_TYPE_PARAMSr   z	.defaultsz.kwdefaultsr   __classdictcell__)LIST_APPENDr_   FORMAT_VALUE)BINARY_SUBSCRzSLICE+BINARY_c                       t ttj| j S r    )r)   r   r*   BinOpr   r   op_typer   r   r         UNARY_)UNARY_POSITIVEUNARY_NEGATIVE	UNARY_NOTUNARY_INVERTc                    r   r    )r)   r   r*   UnaryOpr   r   r   r   r   r     r   )r\   r[   LOOKUP_METHODLOAD_SUPER_ATTRc                       t |  jkS r    rC   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   )r}   r   r*   r|   r~   r   r   r   r   r     s    )STORE_SLICEr   r]   c                    r   r    r   r   r   r   r   r     r   r   zast.%s is not created from %s)Krg   r<   r   r   r   r   boolr   r
   r*   With	AsyncWithListCompGeneratorExpSetCompDictCompr7   r8   r4   rj   r|   	AnnAssignr   ConstantModr)   r   r   valuer-   r   r   	JoinedStrr6   rC   Import
ImportFromr   namesr3   r5   r   MatchAsMatchSequence
MatchValue	AugAssignop_type_mapr   removesuffixr+   BoolOp	SubscriptLoadr   Forr   UAddYieldr9   TypeVarTupler1   	ParamSpec	TypeAliasr.   type_paramsFormattedValuer=   dictUSubNotInvertr   r   __name__r   )rp   r   rl   op_nameextra_filterr   r   r   rc   node_ctx	ctx_matchtitler   )rl   r   r   r   rn     s  &*








		













zPositionNodeFinder.verifyc                 C   s   | j |d  S )NrZ   )re   rp   rr   r   r   r   rl     s   zPositionNodeFinder.instructionc                 C   s   |  |jS r    )rl   rg   r'  r   r   r   rg   	  s   zPositionNodeFinder.opnamer   r#   )linenora   
col_offsetr`   rb   rc   .c                    sF   |  |jd urjd usJ t fdd| jjj D S )Nc                 3   sT    | ]% 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*   Exprr  r   r   r   )r   rb   r*  rc   r   r   r   $  s    


z/PositionNodeFinder.find_node.<locals>.<genexpr>)rl   	positionsr(  r   rX   _nodes_by_line)rp   rr   rb   rc   r   r,  r   rh     s
   zPositionNodeFinder.find_node)#r!  
__module____qualname__r   r   r	   r   r*   Moduleintr   rq   rm   rH   Instructionrk   staticmethodr   r   rn   rl   r   rg   extra_node_typesr7   r8   
type_paramexprstmtexcepthandlerr   r   tupler   rh   r   r   r   r   rS   m   sB    $5/o7   


	rS   )>r*   r7   rH   typesr   r   typingr   r   r   r   r   r	   r
   r   r   r   	executingr   r   r   r   r   r   _exceptionsr   r   	functoolsr   r   r!   r   rC   rG   r3  rI   IfExpIfr   Whiler   r   r  r  r  r   PowMultMatMultFloorDivDivr  AddSubLShiftRShiftBitAndBitXorBitOrr  objectrS   r   r   r   r   <module>   sN    0 	-