a
    lcM                     @   s\  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 j/e j0e j1e j2e j3e j4e j5e j6e j7e j8e j9d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   [/var/www/html/django/DPS/env/lib/python3.9/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   s   t | tjr| j}nvt | tjr(| j}nbt | tjrL| jpH| j	dd }n>t | tj
tjtjfrj| j}n t | tjr| jp~d}ntd|dr|ds| j|  }}t |tjr||jvst|dsq|j| }}q|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   exczno node to mangle__r   _ )
isinstanceast	AttributeattrNameidaliasasnamenamesplitFunctionDefClassDefAsyncFunctionDefExceptHandler	TypeError
startswithendswithr   basesr   lstrip)r   r/   r   child
class_namer   r   r   mangled_name   s*    

r<      )coder   c                 C   s   t tj| ddS )NT)Zshow_caches)listdisget_instructions)r>   r   r   r   rA   C   s    rA   )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ejejejejf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 nV ty   | |dv rft	j
f}n| |dkr~t	jf}n | j|d|d| _Y n0 | | j| | | | j| | jd u r| | j| | d S )NCACHE   )LOAD_METHOD	LOAD_ATTR
STORE_ATTRDELETE_ATTRCALL)end_col_offset
end_lineno)match_positionstyp)rA   f_codebc_listrP   	decoratoropname	find_noderesultr   r(   r)   Callknown_issuesinstructiontest_for_decoratorverify)selfrL   rM   rN   rO   rP   r[   r   r   r   __init__n   s,    




zPositionNodeFinder.__init__N)r   indexr   c                 C   s   t |jtjtfr||jjv r|j}| |d dks| |dkrFq|d7 }| |dv rf|d7 }qN| |dr| ||kr|| _	|| _
d S |d7 }q$d S )N   ZPRECALLrW   rR   )rQ   EXTENDED_ARGZSTORE_)r'   r   r(   r2   r   decorator_listr_   r6   r`   ra   r^   )rg   r   ri   Z	node_funcr   r   r   re      s$    
 
z%PositionNodeFinder.test_for_decorator)r   rd   r   c                 C   s   |j dv rzt|trzt|trndd t|jD }t|d t|dkr`t	t
|d  }| _qztd| ntd| t|tjrtd	td
d t|D rtd|j dkr|jdkrtd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 fixedassertc                 s   s   | ]}t |tjV  qd S r    )r'   r(   patternrt   r   r   r   	<genexpr>       z2PositionNodeFinder.known_issues.<locals>.<genexpr>z)pattern matching ranges seems to be wrong
STORE_NAME__classcell__zstore __classcell__)r_   r'   types_cmp_issuetypes_cmp_issue_fixr(   walktestr   rr   r   r   ra   r   Assertanyr!   argval)rg   r   rd   Zcomparisonsr   r   r   rc      s(    
	

zPositionNodeFinder.known_issues)instr   r   c                    s(    j dvrdS t fddt|D S )N)r|   
STORE_FASTSTORE_DEREFSTORE_GLOBALDELETE_NAMEDELETE_FASTDELETE_GLOBALFc                 3   s(   | ] }t |tjot| jkV  qd S r    )r'   r(   r4   r<   r   rt   r   r   r   rz   &  s   z7PositionNodeFinder.is_except_cleanup.<locals>.<genexpr>)r_   r   r   )r   r   r   r   r   is_except_cleanup  s
    
	z$PositionNodeFinder.is_except_cleanupc                    s2   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 |dr|t	jt	jfrdS |dr|t	jrdS |dddr|t	jrdS |ddds|drH|t	jt	jt	jdrHttt	jtt	jjjtrHdS |drb|t	jrbdS |  rtd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rdS |dr&|t	j r& jt!kr&dS |d rh|t	j"t	j#frht$ fd!d"tt	j"j%D rhd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rdS |t	j-t	jd$r |d't!dr dS |d(r|t	j.rdS |d)r:|t	j/t	jd$r:dS |t	jt	j0d$rb|d*t!drbdS |t	jt	jd$r|d+t!drdS td}td|1d,rt	j/}t	j0}n|1d-rt	j}t* j+ fd.d}n|1d/rt	j2}t3t	j4t	j5t	j6t	j7d0| fd1d}n|d2v r@t	j-}t	j0} fd3d}n||d4v rdt	j}t	j0} fd5d}nX|dv r~t	j}d6d }n>|1d7rt	j(}t	j/}n$|1d8rt	j(}t	j-} fd9d}t8d:d}	|tdupt9d: pt|	|}
t|r|
r|rdS d;tj: j f }t;| dS )<zE
        checks if this node could gererate this instruction
        c                 S   s   dS )NTr   er   r   r   <lambda>1  r{   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)ru   krd   r   r   
<dictcomp>C  s   zAPositionNodeFinder.verify.<locals>.inst_match.<locals>.<dictcomp>)r'   strr_   )r   r   r   r   r   
inst_match4  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'   typer   )ru   r   vr   r   r   rz   P  s   z@PositionNodeFinder.verify.<locals>.node_match.<locals>.<genexpr>)r'   allitems)r   r   r   r   r   
node_matchG  s    	z-PositionNodeFinder.verify.<locals>.node_matchrQ   rW   )rW   	LOAD_FAST)rW   CALL_FUNCTION_EXrm   	LOAD_NAME__annotations__)r   rS   join)rW   BUILD_STRING)leftopSTORE_SUBSCR)r   r   )r,   ctxr   )r   )Z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    )r<   r   r   r   )ru   r-   r   r   r   rz     r{   z,PositionNodeFinder.verify.<locals>.<genexpr>)r   r   r|   r   )r   Z	BINARY_OP=rV   )JUMP_IF_TRUE_OR_POPJUMP_IF_FALSE_OR_POPDELETE_SUBSCR)r   r   LOAD_GLOBAL)r   r   )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{   )rT   rS   ZLOOKUP_METHODc                    s   t |  jkS r    r<   r   r   r   r   r   r     r{   )r   r   r   
LOAD_DEREF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   )rr   r   r(   rq   rs   r   r   r   r   r     r{   )ZSTORE_SLICEr   rU   c                    s   t |  jkS r    r   r   r   r   r   r     r{   r   zast.%s is not created from %s)<r_   r   r   r   r   r   boolr   r
   r(   With	AsyncWithListCompGeneratorExpSetCompDictCompr2   rb   rq   	AnnAssignr   ConstantModr'   r   r   valuer   r+   r   Del	JoinedStrr4   r<   Import
ImportFromr   namesr1   r3   Store	AugAssignop_type_mapargreprremovesuffixr)   BoolOp	SubscriptLoadr6   r   dictUAddUSubNotInvertr   r   __name__r   )rg   r   rd   Zop_nameZextra_filterr   r   r   r[   Znode_ctxZ	ctx_matchtitler   )rd   r   r   r   rf   +  s2   "&




	
	






zPositionNodeFinder.verify)ri   r   c                 C   s   | j |d  S )NrR   )r]   rg   ri   r   r   r   rd   #  s    zPositionNodeFinder.instructionc                 C   s   |  |jS r    )rd   r_   r   r   r   r   r_   &  s    zPositionNodeFinder.opname)linenorY   
col_offsetrX   .)ri   rZ   r[   r   c                    sF   |  |jd urjd us"J 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   )ru   r*   )r   positionr   r   rz   9  s   z9PositionNodeFinder.find_node.<locals>.<genexpr>.<genexpr>N)r'   r(   ExprZ
MatchValuer   r   r   )ru   rZ   r   r[   r   r   rz   2  s   
z/PositionNodeFinder.find_node.<locals>.<genexpr>)rd   Z	positionsr   r   rP   Z_nodes_by_line)rg   ri   rZ   r[   r   r   r   r`   )  s
    zPositionNodeFinder.find_node)r   
__module____qualname__r   r   r	   r   r(   Moduleintr   rh   re   r@   Instructionrc   staticmethodr   r   rf   rd   r   r_   exprstmtexcepthandlerry   r   tupler   r`   r   r   r   r   rK   g   s$   2+;$ y
rK   )=r(   r@   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   r<   r?   r   rA   IfExpIfr   Whiler   r   r   r   r   r~   PowMultMatMultFloorDivDivr   AddSubLShiftRShiftBitAndBitXorBitOrr   objectrK   r   r   r   r   <module>   sJ   0 )