
    G|fm                        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
Zded	e	e   fdZded	efdZ  ed      ded	e!ejD                     fd       Z#e jH                  e jJ                  e jL                  e jN                  fZ(e(e jR                  e jT                  e jV                  e jX                  fz   Z-e j\                  e j^                  e j`                  e jb                  e jd                  e jf                  e jh                  e jj                  e jl                  e jn                  e jp                  e jr                  e jt                  dZ; G d de<      Z=y)    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              #   J   K   	 t        | d      r| j                  } |  ny w)Nparent)hasattrr   r   s    w/var/dept/share/cheung/public_html/OutSchool/python/env/lib/python3.12/site-packages/executing/_position_node_finder.pyparentsr       s)     
4";;DJ s   !#c              #   >   K   |  t        |       E d {    y 7 wN)r    r   s    r   node_and_parentsr#      s     
Jt}s   c                 l   t        | t        j                        r| j                  }nDt        | t        j                        r| j
                  }nt        | t        j                        r-| j                  xs | j                  j                  d      d   }nt        | t        j                  t        j                  t        j                  f      r| j                  }nt        | t        j                        r| j                  sJ | j                  }nZt        j                  dk\  r't        | t        j                         r| j                  }n t#        dt%        t'        |             z         |j)                  d      r|j+                  d      s| j,                  | }}t        |t        j                        r||j.                  vsGt1        |d      s	 |S |j,                  |}}t        |t        j                        s8||j.                  vsG|j                  j3                  d      }|dk7  rd|z   |z   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   r4   r   child
class_names        r   mangled_namerF      s    $&yy	D#((	#ww	D399	&{{5diiooc215	D3??CLL#:N:NO	Pyy	D#++	,yyyyy			V	#
4(DYY5d4:6FFGGtT]]4%8[[ufS\\2uFLL7P6(+ K  v5F	 fS\\2uFLL7P {{))#.J2~Z'$.. K       codec                 B    t        t        j                  | d            S )NT)show_caches)listdisget_instructions)rI   s    r   rN   rN   I   s    $$Tt<==rG   )z***@z///%+-z<<z>>&^|c            
          e Zd ZdZdedee   dej                  de	de
f
dZded	e	d
dfdZdedej                  d
dfdZedej                  ded
efd       Zdedej                  d
dfdZd	e	d
ej                  fdZd	e	d
efdZdZej2                  dk\  rej4                  fZdej6                  ej8                  ej:                  ej<                  gefd	e	dee   de e!df   d
efdZ"y)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                    t        |j                        | _        || _        d | _        | j                  |      dk(  r|dz  }| j                  |      dk(  r	 | j                  |      | _        | j                  | j                  | j                  |             | j                  | j                  |       | j                  ,| j                  | j                  | j                  |             y t!        | j                  | j                  j"                  v        y # t        $ ri | j                  |      dv rt        j                  f}n'| j                  |      dk(  rt        j                  f}n | j                  |d|      | _        Y w xY w)NCACHE   )LOAD_METHOD	LOAD_ATTR
STORE_ATTRDELETE_ATTRCALL)end_col_offset
end_lineno)match_positionstyp)rN   f_codebc_listr^   	decoratoropname	find_noderesultr   r-   r.   Callknown_issuesinstructiontest_for_decoratorverifyr   decorator_list)selfrZ   r[   r\   r]   r^   rj   s          r   __init__zPositionNodeFinder.__init__t   sT   '504 kk% G+QJE kk% G+	../DK> 	$++t'7'7'>?U3 >>!KKT%5%5e%<=DNNdkk&@&@@AM   	 {{5! &  }}&U#v-
 xxk.. @ ) DK1	s   D A.F
Fr   indexr   Nc                 <   t        |j                  t        j                  t        f      r||j                  j
                  v r|j                  }	 | j                  |dz
        dk(  st        j                  dk\  r| j                  |      dk(  sy |dz  }| j                  |      dv r|dz  }| j                  |      dv r| j                  |      j                  d      r#| j                  |      |k(  r|| _        || _        y t        j                  dk  r|dz  }y y )N   PRECALLr&   rf   ra   )r`   EXTENDED_ARGSTORE_)r,   r   r-   r7   r   rv   rn   r:   r;   r@   ro   rp   rm   )rw   r   ry   	node_funcs       r   rt   z%PositionNodeFinder.test_for_decorator   s   t{{S\\3F$GH222I& [[+y8C<L<LPW<WE*f4
kk%(,EEQJE kk%(,EE KK&11(;u-:"+DK%)DN##g-QJEM 	 3 IrG   rs   c                 T   |j                   dv rt        |t              rt        |t              rt	        j
                  |j                        D cg c]6  }t        |t        j                        rt        |j                        dkD  r|8 }}t        |d       t        |      dk(  rt        t        |d         x}| _        nt        d|z        t        d|z        t        j                   d d dk(  rOt        |t        j                        r5|j                   d	k(  r&t#        d
 t%        |      D              rt        d      t        |t        j&                        rt        d      t#        d t%        |      D              rt        d      t        j                   dk\  rWt        |t        j(                        r<t        |j*                  t        j,                        r|j*                  j.                  dk(  r|j0                  }t3        |d      rmt        |t        j4                  t        j6                  f      sC|j0                  }t3        |d      r+t        |t        j4                  t        j6                  f      sCd }t3        |d      r?g |j8                  j:                  |j8                  j8                  }|r|d   j<                  }|j                   |j>                  fdd|fd|ffv rt        d      | jA                  ||      rt        d      |j                   dk(  r|j>                  dk(  rt        d      |j                   d	k(  rVt        |t        j(                        s;t#        d tC        |      D              rt        j                   dk\  rt        d      y y y y c c}w )N
COMPARE_OPIS_OPCONTAINS_OPr   z expected at least one comparisonr   z4multiple chain comparison inside %s can not be fixedz+chain comparison inside %s can not be fixedr'   )r'      r   rf   c              3   P   K   | ]  }t        |t        j                           y wr"   r,   r-   Assert.0ns     r   	<genexpr>z2PositionNodeFinder.known_issues.<locals>.<genexpr>   s     N!Jq#**-N   $&zBknown bug in 3.11.1 https://github.com/python/cpython/issues/95921assertc              3   P   K   | ]  }t        |t        j                           y wr"   )r,   r-   patternr   s     r   r   z2PositionNodeFinder.known_issues.<locals>.<genexpr>  s     Jaz!S[[)Jr   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              3   P   K   | ]  }t        |t        j                           y wr"   r   )r   ps     r   r   z2PositionNodeFinder.known_issues.<locals>.<genexpr>B  s     E!Jq#**-Er   )r'   r   ra   z&exception generation maps to condition)"rn   r,   types_cmp_issuetypes_cmp_issue_fixr-   walktestComparelenopsr   r   r   rp   r   r:   r;   anyr#   r   rq   funcr0   r1   r   r   r8   r6   r   posonlyargsargargvalis_except_cleanupr    )rw   r   rs   r   comparisonsr   	first_argr   s           r   rr   zPositionNodeFinder.known_issues   s/   !GGJ/M
 $ 34 !XXdii0!!S[[1c!%%j1n   %GH{#q()-k;q>)JJD4;$NRVW  !!NRV!WXX Ra J.4-""f,N7G7MNNT  dCJJ' X&&J3CD3IJJHII '4*499chh/		'
 ;;D$)*s++S__=3 {{	 $)*s++S__=3 ItV$@..@@ $QI""K$6$67+i(y)< 
 !!566!!+t4bcc-+2D2D2W 233 &(tCHH-Ewt}EE  J.EFF / F . )ws   ;N%instc                 $     j                   dvryt        |t        j                        rXt        |j                  t        j
                        r4 j                   j                  d      rt        |       j                  k(  ryt        |t        j                        rXt        |j                  t        j                        r4 j                   j                  d      rt        |       j                  k(  ryt         fdt        |      D              S )N)r   
STORE_FASTSTORE_DEREFSTORE_GLOBALDELETE_NAMEDELETE_FASTDELETE_DEREFDELETE_GLOBALFr~   DELETE_c              3      K   | ]F  }t        |t        j                        xr& |j                  xr t	        |      j
                  k(   H y wr"   )r,   r-   r9   r4   rF   r   )r   r   r   s     r   r   z7PositionNodeFinder.is_except_cleanup.<locals>.<genexpr>z  sD      
 q#++,ZZLOt{{<ZZ
s   AA)rn   r,   r-   r0   ctxStorer@   rF   r   Delr   r    )r   r   s   ` r   r   z$PositionNodeFinder.is_except_cleanupG  s    ;; 	
 	
 , tSXX&488CII.&&x0T"dkk1  tSXX&488CGG,&&y1T"dkk1  
T]
 
 	
rG   c           	      N   j                   }d }t        d      }dt        t        t        t           f   dt
        dt        ffd}dt        t        t        t        df   f   dt
        dt        ffd	}|d
k(  ry |d      r' |t        j                  t        j                  f      ry |d      rE |t        j                  t        j                  t        j                  t        j                  f      ryt         j"                  dk\  r> |d      r6 |t        j                  t        j                  t        j                  f      ry |d      r' |t        j$                  t        j&                  f      ry |d      r |t        j(                        ry |dd      r |t        j*                        ry |dd      s |dd      s |d      r |t        j,                  t        j.                  t        j0                        rUt3        t5        t        j.                  t5        t        j,                        j6                        j8                  t              ry |d      r |t        j*                        ry |d      r2 |t        j:                  j<                  t        j>                        ry |d      r= |t        j@                        s& |t        j,                  t        j0                        ry |d      r |t        j                        ry |dd       r |t        j.                        ry |d!      r/ |t        jB                        rj<                  tE              k(  ry |d"      r] |t        jF                  t        jH                  f      r7tK        fd#t5        t        jF                        jL                  D              ry |d$      rt |t        jN                  t        j$                  t        jP                  f      s& |t        j:                  t        jR                  %      rj<                  tE              k(  ry	  |d&      r9 |t        jZ                  t\        j^                  ja                  d'               ry |t        jb                  t        j>                  %      r |d(tE                    ry |d)      r |t        jd                        ry |d*      r' |t        jf                  t        j>                  %      ry |t        j:                  t        jh                  %      sJ |t        j:                  t        jR                  %      r8t3        jj                  t        jZ                        r |d+tE                    ry |t        j:                  t        j>                  %      r |d,tE                    ry |t        j.                        r- |d-t5        t        j.                        j8                        ry |t        j                  t        j                  t        j                  t        j                  t        jl                  f      r	 |d.      ryt         j"                  dk\  r |t        jn                  t        jp                        r |d/d01      ry |t        jf                        r	 |d2      ry |t        jH                        r |d/d31      ry |t        jr                        s$t3        jj                  t        j                        r |d/d41      ry |t        j:                        r |d5d6      ry |t        jt                        r2 |d/d71      s' |d8d91      s |d8d:1      s |d;tE              1      ry |t        jv                        r |d/d<1      s |d;jx                  1      ry |t        jz                        r |d/d=1      s |d;jx                  1      ry |t        j|                        r1 |d/d>1      s& |d?jx                  j~                  1      s |d      ry |t        j$                        r8j                  r, |d@dA1      ry |dBdC1      ry |d/dD1      ry |d5d6      ry |t        jN                  t        jP                  f      r6j                  r* |d      ry |d8dE1      ry |dFdG      ry |dFdH      ry |dIdJ      ry |t        j@                        r |dd      s |dK      ry |t        j                        r	 |dL      ryt        d      }t        d      |j                  dM      r"t        jf                  }t        jh                  }n|j                  dN      r*t        j,                  }t\        j^                     fdO}nE|j                  dP      r`t        jn                  }t        t        jp                  t        j                  t        j                  t        j                  Q      |   fdR}n|dSv r&t        jb                  }t        jh                  }fdT}n|dUv r&t        j:                  }t        jh                  }fdV}n|dv rt        j(                  }dW }nh|j                  dX      r!t        jR                  }t        jf                  }n6|j                  dY      r%t        jR                  }t        jb                  }fdZ}t        d[d      }	|t        d      uxs t        d[       xs t3        |	|      }
t3        |      r|
r	 |      ryd\t              j                  d]j                   }t        |      )^zE
        checks if this node could gererate this instruction
        c                      y)NT es    r   <lambda>z+PositionNodeFinder.verify.<locals>.<lambda>  s    rG   Nopnameskwargsr   c           	          t        | t              r| g} j                  | v xr ||D ci c]  }|t        |       c}k(  S c c}w )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

            )r,   strrn   getattr)r   r   krs   s      r   
inst_matchz-PositionNodeFinder.verify.<locals>.inst_match  s\     '3'")%%0 V4:@/07;**@ 6  @s   A	node_type.c                 d    t        |       xr" t        fd|j                         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      K   | ]<  \  }}t        |t              rt        t        |      |      nt        |      |k(   > y wr"   )r,   r?   r   )r   r   vr   s      r   r   z@PositionNodeFinder.verify.<locals>.node_match.<locals>.<genexpr>  sM      7 Aq a& 74+Q/T1%*+7s   AA)r,   allitems)r   r   r   s     r   
node_matchz-PositionNodeFinder.verify.<locals>.node_match  s5     dI. 3 7 #LLN	7 4 rG   r`   rf   )rf   r   r&   )LOAD_FAST_AND_CLEARr   )rf   CALL_FUNCTION_EXr   	LOAD_NAME__annotations__)r   rb   joinrc   )rf   BUILD_STRING)leftopSTORE_SUBSCR)r   r   )r1   r   r   )r   )BEFORE_WITHWITH_EXCEPT_START)r   r   __doc__)r   r   r   r   )r   r   r   r   c              3   j   K   | ]*  }t        t        t        |            j                  k(   , y wr"   )rF   r   r   r   )r   r2   rs   s     r   r   z,PositionNodeFinder.verify.<locals>.<genexpr>  s)     {UZLk5!9:k>P>PP{s   03)r   r   r   r   )r   	BINARY_OP=re   )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_APPENDrf   FORMAT_VALUE)BINARY_SUBSCRzSLICE+BINARY_c                 `    t        t        t        j                  |       j                        S r"   )r,   r   r-   BinOpr   r   op_types    r   r   z+PositionNodeFinder.verify.<locals>.<lambda>  s    ZSYY0B0E0Ew%O rG   UNARY_)UNARY_POSITIVEUNARY_NEGATIVE	UNARY_NOTUNARY_INVERTc                 `    t        t        t        j                  |       j                        S r"   )r,   r   r-   UnaryOpr   r   s    r   r   z+PositionNodeFinder.verify.<locals>.<lambda>  s    ZS[[!0D0G0G%Q rG   )rc   rb   LOOKUP_METHODLOAD_SUPER_ATTRc                 4    t        |       j                  k(  S r"   rF   r   r   rs   s    r   r   z+PositionNodeFinder.verify.<locals>.<lambda>      \!_8J8J%J rG   )r   r   r   r   LOAD_CLASSDEREFc                 f    t        t        j                  |       j                  j                  k(  S r"   )r   r-   r0   r1   r   r	  s    r   r   z+PositionNodeFinder.verify.<locals>.<lambda>  s#    T#((A%6%9%9[=O=O%O rG   c                 b    t        t        t        j                  |       j                        dk(  S )Nr   )r   r   r-   r   r   r   s    r   r   z+PositionNodeFinder.verify.<locals>.<lambda>  s!    Sckk1)=)A)A%Ba%G rG   )STORE_SLICEr   rd   c                 4    t        |       j                  k(  S r"   r  r	  s    r   r   z+PositionNodeFinder.verify.<locals>.<lambda>  r
  rG   r   zast.z is not created from )Krn   r?   r   r   r	   r   boolr   r   r-   With	AsyncWithListCompGeneratorExpSetCompDictCompr:   r;   r7   rq   r   	AnnAssignr   ConstantModr,   r   r   valuer0   r   r   	JoinedStrr9   rF   Import
ImportFromr   namesr6   r8   r   MatchAsMatchSequence
MatchValue	AugAssignop_type_mapr   removesuffixr.   BoolOp	SubscriptLoadr   Forr  UAddYieldr<   TypeVarTupler4   	ParamSpec	TypeAliasr1   type_paramsFormattedValuer@   dictUSubNotInvertr   r   __name__r   )rw   r   rs   op_nameextra_filterr   r   r   rj   node_ctx	ctx_matchtitler   s    ``         @r   ru   zPositionNodeFinder.verify  s#	   
 $$6DJ	c8C=&8 9 	S 	T 	&	%eD#I.>(>"? 	3 	SW 	  gf*chh-F"G+,\\3++S[[#,,G2
  '@ACLL#++s||DE23
\\388$9
 <=*KKC
 k*;<MMB
  =8k&9673993<<CGGD4d399d.C.H.HIOOQTU n%*S]]*C 45*HH++;
 n%s}}%CII#'')J9:z#((?S4YGJLLM
  RS3,,-""l4&88  RSCJJ78{^bcfcmcmos^t^z^z{{  RSCOOS\\3;O;OPQHH		
 ""l4&88 k"zMMk+*=*=*J*J3*OP(
 cmm1j,t"47
 
 $o&:cmm+Q sxxSXX.3883t{{CMM:  %

 chhCGG,<\RVEW2
 cll#
cllD!9!?!?)
 \\3;;c6F6FP
12w&#++#((3
",F9 #--(Z-G#..)j",C/  399%DKKAQAQ)R/9ST#((#
<(W#++&-7JK&0N &0T ;\RVEWX#**+-7OP;TYYO#--(-7LM;TYYO #--(1;PQ!CTYY\\ "&) #,,'D,<,<L* 9?S&0M l/B3??3+?+?@AdFVFVf%&0T k=k?,/BC
 #--(;v656#,,-*^2L
 JT
9:--C((C	*))C!+"5"56GOL)++C"xx"xx'' ZZ	
 G RLWW--C((CJL 
 
 ((C((COL>>++CGL ?@))C--C-))C--CJL4- tDz! )4'')(C( 	 dC Y<3E
 J

 eT;77rG   c                 &    | j                   |dz     S )Nra   )rl   rw   ry   s     r   rs   zPositionNodeFinder.instruction  s    ||EQJ''rG   c                 8    | j                  |      j                  S r"   )rs   rn   r;  s     r   rn   zPositionNodeFinder.opname	  s    &---rG   r   r&   )linenorh   
col_offsetrg   ri   rj   .c                     | j                  |      j                  j                  J t        fd| j                  j
                  j                     D              S )Nc              3      K   | ]i  t              r[t        t        j                        sAt        t        j                        s't	        fd D              rt        t               k yw)c              3   P   K   | ]  }t        |      t        |      k(    y wr"   )r   )r   r/   r   positions     r   r   z9PositionNodeFinder.find_node.<locals>.<genexpr>.<genexpr>+  s,       $'74+>>s   #&N)r,   r-   Exprr!  r   r   r   )r   r   ri   rB  rj   s    @r   r   z/PositionNodeFinder.find_node.<locals>.<genexpr>$  s[      
$$dCHH-dCNN3 +  d#
s   A/A3)rs   	positionsr=  r   r^   _nodes_by_line)rw   ry   ri   rj   rB  s     ``@r   ro   zPositionNodeFinder.find_node  s]    " ##E*44#(CCC 
228??C
 
 	
rG   )#r4  
__module____qualname__r   r   r
   r   r-   Moduleintr   rx   rt   rM   Instructionrr   staticmethodr  r   ru   rs   r   rn   extra_node_typesr:   r;   
type_paramexprstmtexcepthandlerr   r	   tupler   ro   r   rG   r   rY   rY   m   s   3Bi 3BK0@ 3B

 3B[^ 3Bhn 3Bj-{ -3 -4 -^mG mG3?? mGt mG^ 5
 5
{ 5
t 5
 5
nE8; E8S__ E8 E8N( ( (.C .C . 
6!NN,
*
 HHHHKK	!

 !


 "#
 49
  
!
rG   rY   )>r-   r:   rM   typesr   r   typingr   r   r   r   r	   r
   r   r   r   r   	executingr   r   r   r   r   r   _exceptionsr   r   	functoolsr   r    r#   r   rF   rL   rJ  rN   IfExpIfr   Whiler   r  r  r  r  r   PowMultMatMultFloorDivDivr  AddSubLShiftRShiftBitAndBitXorBitOrr#  objectrY   r   rG   r   <module>rg     s`   
 
 
 % ] ] ] ` ` 4 
+ (;"7 ; 8K+@ 
*{ *s *Z 3>8 >S__(= > >
 IIFFJJII	  &LLKKLL	)  ''		
,,				
**
**			"B
 B
rG   