o
    kZh                     @   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   V/var/www/html/lang_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| S r    )listdisget_instructions)rE   r   r   r   rH   I   s   rH   )z***@z///%+-z<<z>>&^|c                
   @   sJ  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e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ej fddZdejdeej fddZd
e	defddZdZejd kre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"  dd t |jD | _|| _d | _| |dkr#|d8 }| |dksz| || _W n+ tyV   | |dv r>t	j
f}n| |dv rJt	jf}n | j|d|d| _Y nw | |}|d usbJ | | j|| _| | j| | | j| | jd u r| | j| d S t| j| jjv  d S )	Nc                 S   s   i | ]}|j |qS r   )offset).0bcr   r   r   
<dictcomp>u       z/PositionNodeFinder.__init__.<locals>.<dictcomp>CACHE   )LOAD_METHOD	LOAD_ATTR
STORE_ATTRDELETE_ATTR)CALLCALL_KW)end_col_offset
end_lineno)match_positionstyp)rH   f_codebc_dictrW   	decoratoropname	find_noderesultr   r*   r+   Callinstruction
fix_resultknown_issuestest_for_decoratorverifyr   decorator_list)selfrS   rT   rU   rV   rW   rh   rp   r   r   r   __init__t   s8   




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   ZPRECALLr#   rc   r^   )r]   EXTENDED_ARGSTORE_)r)   r   r*   r4   r   ru   rl   r7   r8   r=   rm   rn   rk   )rv   r   rx   Z	node_funcr   r   r   rs      s.   
z%PositionNodeFinder.test_for_decoratorrp   c                 C   s   t jdkr|jdv rt|jtjr||jju r|jS t jdkrD|jdv rDt|jjtjtj	tj
tjfrDt|jtjrD||jju rD|jjS t jdkrs|jdkrs| |}|d urs|jdkrs|j|jkrst|jtjrs||jju rs|jjS t jdkr|jdkrt|jtjr||jju r|jjS |S )N)r$   r%      GET_ITERFOR_ITER)r$   r%      rc   
LOAD_CONSTBEFORE_WITH)r7   r8   rl   r)   r   r*   ForiterListCompSetCompDictCompGeneratorExpcomprehensioninstruction_before	positionswithitemcontext_expr)rv   r   rp   beforer   r   r   rq      sB   







zPositionNodeFinder.fix_resultc                 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 tjd!kr`|j d"v r-td#|j  d$|j dkr=|jd%kr=td&|j d'krbt|tj!rdt|j"tjrft|j#tj$rh|j"| _d S d S 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rY   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   rc   c                 s       | ]	}t |tjV  qd S r    r)   r*   Assertr   r   r   r   	<genexpr>W      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   c  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   )rY   pr   r   r   r     r   )r$   r   r^   z&exception generation maps to conditionr$      )ZSTORE_FAST_STORE_FASTZSTORE_FAST_LOAD_FASTZLOAD_FAST_LOAD_FASTzcan not map z to two ast nodesr   z^loading of __class__ is accociated with a random node at the end of a class if you use super()r   )%rl   r)   types_cmp_issuetypes_cmp_issue_fixr*   walktestr   r   r   r   rn   r   r7   r8   r   anyr!   r   ro   funcr-   r.   r   r   r5   r3   r   posonlyargsargargvalis_except_cleanupr   UnaryOpoperandopNot)rv   r   rp   Zcomparisonsr   Z	first_argr   r   r   r   rr   3  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_GLOBALFr{   Z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     s
    
z7PositionNodeFinder.is_except_cleanup.<locals>.<genexpr>)rl   r)   r*   r-   ctxStorer=   rC   r   Delr   r   )r   r   r   r   r   r     s*   





z$PositionNodeFinder.is_except_cleanupc                    s\	   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jdVkr|dWridS |dXrv|t	j2rvdS |dYr|t	jt	jfrdS |dOdJdrdS |dOd?drdS |dOr|t	j't	jt	j>t	j:t	jBt	j(frdS |dOr|t	j>rňj<j? jkrdS |dRdZdrdS |dOrtj5t	j:rdS td}td|Cd[rt	j3}t	j4}n|Cd\rt	j}t. j/ fd]d}nn|Cd^r%t	j7}tDt	j8t	jEt	jFt	jGd_| fd`d}nP|dav r7t	j1}t	j4} fdbd}n>|dcv rIt	j}t	j4} fddd}n,|dv rVt	j}ded }n|Cdfrct	j)}t	j3}n|Cdgrut	j)}t	j1} fdhd}tHdid}	|tduptIdi pt|	|}
t|r|
r|rdS djtjJ j f }tK| )kzE
        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)rY   krp   r   r   r[     s    zAPositionNodeFinder.verify.<locals>.inst_match.<locals>.<dictcomp>)r)   strrl   )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   )rY   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_matchr]   rc   )rc   r   r#   )ZLOAD_FAST_AND_CLEARr   )rc   CALL_FUNCTION_EXr   	LOAD_NAME__annotations__)r   r_   joinr`   )rc   BUILD_STRING)leftr   STORE_SUBSCR)r   r   )r.   r   r   )r   )r   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   )rY   r/   r   r   r   r   u  s   " z,PositionNodeFinder.verify.<locals>.<genexpr>)r   r   r   r   )r   F)r   r   )r1   r   z==Z	BINARY_OP=rb   )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   r   r}   Z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_APPENDrc   FORMAT_VALUEr   NOPZTO_BOOLrd   Z__static_attributes__)BINARY_SUBSCRzSLICE+ZBINARY_c                       t ttj| j S r    )r)   r   r*   BinOpr   r   op_typer   r   r   t  r\   ZUNARY_)UNARY_POSITIVEUNARY_NEGATIVE	UNARY_NOTUNARY_INVERTc                    r   r    )r)   r   r*   r   r   r   r   r   r   r   }  r\   )r`   r_   ZLOOKUP_METHODZ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    )ZSTORE_SLICEr   ra   c                    r   r    r   r   r   r   r   r     r   r   zast.%s is not created from %s)Lrl   r<   r   r   r   r   boolr   r
   r*   With	AsyncWithr   r   r   r   r7   r8   r4   ro   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   r   r   UAddYieldr9   ZTypeVarTupler1   	ParamSpec	TypeAliasr.   Ztype_paramsFormattedValueLambdar=   dictUSubr   Invertr   r   __name__r   )rv   r   rp   Zop_nameZextra_filterr   r   r   rh   Znode_ctxZ	ctx_matchtitler   )rp   r   r   r   rt     sX  &*








		














zPositionNodeFinder.verifyc                 C   s   | j |d S r    )rj   get)rv   rx   r   r   r   rp     s   zPositionNodeFinder.instructionc                 C   s   | j |jd d S )Nr^   )rj   r  rX   )rv   rp   r   r   r   r     s   z%PositionNodeFinder.instruction_beforec                 C   s   |  |}|d u rdS |jS )Nr]   )rp   rl   )rv   rx   ir   r   r   rl     s   
zPositionNodeFinder.opnamer   r#   )linenorf   
col_offsetre   rg   rh   .c                    sV   |  |}|d usJ |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   )rY   r,   )r   positionr   r   r     s
    
z9PositionNodeFinder.find_node.<locals>.<genexpr>.<genexpr>N)r)   r*   Exprr  r   r   r   )rY   rg   r  rh   r   r   r     s    


z/PositionNodeFinder.find_node.<locals>.<genexpr>)rp   r   r  r   rW   Z_nodes_by_line)rv   rx   rg   rh   rp   r   r  r   rm     s   
zPositionNodeFinder.find_node)&r  
__module____qualname__r   r   r	   r   r*   Moduleintr   rw   rs   rG   Instructionrq   rr   staticmethodr   r   rt   r   rp   r   r   rl   Zextra_node_typesr7   r8   Z
type_paramexprstmtexcepthandlerr   r   tupler   rm   r   r   r   r   rR   m   s\    $:/
V 7   8


	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   IfExpIfr   Whiler   r   r   r   r   r   PowMultMatMultFloorDivDivr   AddSubLShiftRShiftBitAndBitXorBitOrr  objectrR   r   r   r   r   <module>   sN    0 	-