
    sh                        S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
JrJr  S SKJr  S SKJr  S SKJrJr  S SKJrJrJrJr  S SKJrJrJrJr  S S	KJr  \R>                  " 5       r  " S
 S\!5      r"\"" SS S 5      r#\ " S S\!5      5       r$\ " S S\!5      5       r% " S S\!5      r& " S S\!5      r' " S S\%\'5      r( " S S\(5      r) " S S\)5      r* " S S\(5      r+ " S S\)5      r, " S S \)5      r- " S! S"\)5      r. " S# S$\)5      r/ " S% S&\)5      r0 " S' S(\)5      r1 " S) S*\)5      r2 " S+ S,\*5      r3 " S- S.\*5      r4 " S/ S0\*5      r5 " S1 S2\)5      r6 " S3 S4\)5      r7 " S5 S6\)5      r8 " S7 S8\*5      r9 " S9 S:\*5      r: " S; S<\*5      r; " S= S>\)5      r< " S? S@\)5      r= " SA SB\(5      r> " SC SD\)5      r? " SE SF\)5      r@ " SG SH\%\'5      rA " SI SJ\%\'5      rB " SK SL\%\'5      rC " SM SN\%\'5      rD " SO SP\%\'5      rE " SQ SR\%5      rF " SS ST\%5      rG " SU SV\$5      rH " SW SX\$5      rI " SY SZ\!5      rJ " S[ S\\%5      rK\K" 5       rLg)]    )defaultdictN)FunctionTypeBuiltinFunctionType)total_ordering)StringIO)errorsconfig)BINOPS_TO_OPERATORSINPLACE_BINOPS_TO_OPERATORSUNARY_BUITINS_TO_OPERATORSOPERATORS_TO_BUILTINS)NotDefinedErrorRedefinedErrorVerificationErrorConstantInferenceError)constsc                       \ rS rSrSr\R                  " S5      rSS jrS r	S r
\S 5       rS	 rS
 rS rS rS rS rSS jrSS jrS rSrg)Loc   zSource location

    zdef\s+(\w+)Nc                 B    Xl         X l        X0l        SU l        X@l        g)zArguments:
filename - name of the file
line - line in file
col - column
maybe_decorator - Set to True if location is likely a jit decorator
N)filenamelinecollinesmaybe_decorator)selfr   r   r   r   s        a/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/numba/core/ir.py__init__Loc.__init__   s      !	
.    c                     [        U 5      [        U5      La  gU R                  UR                  :w  a  gU R                  UR                  :w  a  gU R                  UR                  :w  a  ggNFT)typer   r   r   r   others     r   __eq__
Loc.__eq__,   sM    :T%[(==ENN*599

"588uyy r    c                 .    U R                  U5      (       + $ Nr&   r$   s     r   __ne__
Loc.__ne__4       ;;u%%%r    c                 :    U " UR                   UR                  SS9$ )NT)r   )r   firstlineno)clsfunc_ids     r   from_function_idLoc.from_function_id7   s    7##W%8%8$OOr    c                 \    SU R                   < SU R                  < SU R                  < S3$ )NzLoc(filename=z, line=z, col=))r   r   r   r   s    r   __repr__Loc.__repr__;   s"    6:mm6:iiK 	Kr    c                     U R                   b,  U R                  < SU R                  < SU R                   < S3$ U R                  < SU R                  < S3$ )Nz (:r5   )r   r   r   r6   s    r   __str__Loc.__str__?   s8    88#'==$))TXXFF $tyy99r    c                     S nU R                  5       n[        US U R                  S-
   5       H,  nUR                  5       R	                  S5      (       d  M)  Un  U$    U$ )N   def )	get_linesreversedr   strip
startswith)r   fn_namer   xs       r   _find_definitionLoc._find_definitionE   s^     %Q/0A wwy##F++ 1 r    c                     U R                  5       nU(       aC  U R                  R                  UR                  5       5      nU(       a  UR	                  5       S   $ g Nr   )rF   _defmatchermatchrB   groups)r   defnms      r   _raw_function_nameLoc._raw_function_nameR   sE    $$&  &&tzz|4Axxz!}$r    c                     U R                   c4  U R                  5       nUS:X  a  / O[        R                  " U5      nX l         U R                   $ )Nz<string>)r   	_get_path	linecachegetlines)r   pathlnss      r   r@   Loc.get_lines[   sB    ::>>#D 
*"	0B0B40HCJzzr    c                     S n [         R                  R                  U R                  5      nU$ ! [         a-    [         R                  R                  U R                  5      n U$ f = fr)   )osrU   relpathr   
ValueErrorabspath)r   rU   s     r   rR   Loc._get_pathe   sY    	2 77??4==1D   	2 77??4==1D	2s   )/ 3A&%A&c                    U R                  5       nU R                  nU R                  (       aU  S/U-   nU(       aH  U(       aA  SXC   ;  a9  [        SU5      nUS-   nXEU nSn[	        U5       H  u  pSU
;   d  M  U	n  O   X8-   n/ nU(       Ga  US:  Ga  S nU[        SX1-
  5      U nSnU H  n
SU
;   d  M  SnM     U(       d^  S n[        US US-
   5       H  n
SU
;   d  M  U
n  O   U(       a3  UR                  U5        U" W
5      nUR                  S	S
U-   -  S-   5        U(       ap  UR                  US S 5        UR                  [        R                  US   5      5        U" US   5      nUR                  S	U-  [        R                  S5      -   5        U(       d  U(       d  SnOUS::  a  Sn[        R                  S5      S-   nUU R                  5       U[        R                  SR                  U5      5      4-  nU$ )N r?   r   
   c                 ~    Sn[         R                  " [        R                  [        U 5      5       H  nUS-  nM
     U$ )Nr   r>   )	itertools	takewhilestrisspace)stringspacesrE   s      r   count_spaces#Loc.strformat.<locals>.count_spaces   s5    ",,S[[#f+FAaKF Gr    FTr>       z<source elided>
^z#<source missing, REPL/exec in use?>z<source line number missing>z
File "%s", line %d:z
%s)r@   r   r   max	enumeraterA   appendextend
_termcolor	highlightindicater   rR   codejoin)r   	nlines_upr   use_linetmplinesmin_linemax_lineselectedindexidxrE   retrh   	def_foundrD   rg   errtmps                     r   	strformatLoc.strformats   s    99 te|HfH4F&F q(+#b=#x8'1FC{ # 2 $+ X\ SH$89(CH IQ; $I 
 !%A"67A{"# 8 JJw')!_FJJsAJ/2EEF

8CR=)

://=> &hrl3

3<**=*=c*BBC ;Q4 !!"9:6AT^^%x1NOO
r    c                 :    [        U 5      " U R                  X5      $ )z)
Return a new Loc with this line number.
)r#   r   )r   r   r   s      r   with_linenoLoc.with_lineno   s     Dz$--33r    c                 z    [         R                  R                  U R                  5      nU< SU R                  < 3$ )z
Returns a short string
r:   )rY   rU   basenamer   r   )r   shortfilenames     r   short	Loc.short   s+     ((7'33r    )r   r   r   r   r   NF)   r)   )__name__
__module____qualname____firstlineno____doc__recompilerJ   r   r&   r+   classmethodr2   r7   r;   rF   rO   r@   rR   r   r   r   __static_attributes__ r    r   r   r      sl     **^,K/& P PK:Qf44r    r   zunknown locationc                   4    \ rS rSr\" 5       rS rS rS rSr	g)SlotEqualityCheckMixin   c                     [        U 5      [        U5      L a.  U R                   H  n[        X5      [        X5      :w  d  M    g   ggr"   )r#   	__slots__getattr)r   r%   names      r   r&   SlotEqualityCheckMixin.__eq__   s=    :e$4&'%*>>  ' r    c                 0    [        U 5      [        U5      :*  $ r)   rd   r$   s     r   __le__SlotEqualityCheckMixin.__le__   s    4yCJ&&r    c                     [        U 5      $ r)   idr6   s    r   __hash__SlotEqualityCheckMixin.__hash__       $xr    r   N)
r   r   r   r   tupler   r&   r   r   r   r   r    r   r   r      s     I'r    r   c                   *    \ rS rSrSrS rS rS rSrg)EqualityCheckMixin   z"Mixin for basic equality checking c                     [        U 5      [        U5      L a-  S nU" U R                  5      nU" UR                  5      nX4:X  a  gg)Nc                 V    Sn[        U 5      nU H  nUR                  US 5        M     U$ )N)locscope)dictpop)adictbaddrE   s       r   fixup(EqualityCheckMixin.__eq__.<locals>.fixup   s,    &KAEE!TN r    TF)r#   __dict__)r   r%   r   d1d2s        r   r&   EqualityCheckMixin.__eq__   s@    :e$ t}}%Bu~~&Bxr    c                 0    [        U 5      [        U5      :  $ r)   r   r$   s     r   r   EqualityCheckMixin.__le__   s    4y3u:%%r    c                     [        U 5      $ r)   r   r6   s    r   r   EqualityCheckMixin.__hash__  r   r    r   N)	r   r   r   r   r   r&   r   r   r   r   r    r   r   r      s    -&r    r   c                   P    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rSrg)VarMapi  c                     0 U l         g r)   _conr6   s    r   r   VarMap.__init__  s	    	r    c                 T    XR                   ;   a  [        U5      eX R                   U'   g r)   )r   r   )r   r   vars      r   defineVarMap.define  s"    99 &&!IIdOr    c                 T     U R                   U   $ ! [         a    [        U5      ef = fr)   )r   KeyErrorr   r   r   s     r   get
VarMap.get  s/    	(99T?" 	(!$''	(s    'c                     XR                   ;   $ r)   r   r   s     r   __contains__VarMap.__contains__  s    yy  r    c                 ,    [        U R                  5      $ r)   )lenr   r6   s    r   __len__VarMap.__len__  s    499~r    c                 B    [         R                  " U R                  5      $ r)   )pprintpformatr   r6   s    r   r7   VarMap.__repr__  s    ~~dii((r    c                 ,    [        U R                  5      $ r)   )hashr   r6   s    r   r   VarMap.__hash__   s    DIIr    c                 6    U R                   R                  5       $ r)   )r   iterkeysr6   s    r   __iter__VarMap.__iter__#  s    yy!!##r    c                     [        U 5      [        U5      L a5  U R                  R                  5       UR                  R                  5       :H  $ gr   )r#   r   keysr$   s     r   r&   VarMap.__eq__&  s6    :e$99>>#uzz'888r    c                 .    U R                  U5      (       + $ r)   r*   r$   s     r   r+   VarMap.__ne__,  r-   r    r   N)r   r   r   r   r   r   r   r   r   r7   r   r   r&   r+   r   r   r    r   r   r     s4    "(!)$&r    r   c                       \ rS rSrSrSrg)AbstractRHSi0  zsAbstract base class for anything that can be the RHS of an assignment.
This class **does not** define any methods.
r   N)r   r   r   r   r   r   r   r    r   r   r   0  s    r    r   c                   $    \ rS rSrSrS rS rSrg)Insti6  z%
Base class for all IR instructions.
c                     [         e)z?
List the variables used (read or written) by the instruction.
)NotImplementedErrorr6   s    r   	list_varsInst.list_vars;  s
     "!r    c                    [        U[        5      (       a  U/$ [        U[        5      (       a  UR                  5       $ [        U[        [
        45      (       a-  / nU H#  nUR                  U R                  U5      5        M%     U$ [        U[        5      (       a;  / nUR                  5        H#  nUR                  U R                  U5      5        M%     U$ / $ )zA
A recursive helper used to implement list_vars() in subclasses.
)

isinstanceVarr   r   listr   rq   _rec_list_varsr   values)r   vallstvs       r   r   Inst._rec_list_varsA  s     c35LT""==?"dE]++C

4..q12 JT""CZZ\

4..q12 "JIr    r   N)r   r   r   r   r   r   r   r   r   r    r   r   r   6  s    "r    r   c                   &    \ rS rSrSrSrSrS rSrg)StmtiW  zW
Base class for IR statements (instructions which can appear on their
own in a Block).
Fc                 8    U R                  U R                  5      $ r)   )r   r   r6   s    r   r   Stmt.list_varsb  s    ""4==11r    r   N)	r   r   r   r   r   is_terminatoris_exitr   r   r   r    r   r   r   W  s     MG2r    r   c                   "    \ rS rSrSrSrS rSrg)
Terminatorif  z
IR statements that are terminators: the last statement in a block.
A terminator must either:
- exit the function
- jump to a block

All subclass of Terminator must override `.get_targets()` to return a list
of jump targets.
Tc                 *    [        [        U 5      5      er)   )r   r#   r6   s    r   get_targetsTerminator.get_targetsr  s    !$t*--r    r   N)r   r   r   r   r   r   r  r   r   r    r   r  r  f  s     M.r    r  c                      \ rS rSrSrS rS rS r\S 5       r	\S 5       r
\S 5       r\S"S
 j5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rS r S r!S  r"S!r#g	)#Expriv  zQ
An IR expression (an instruction which can only be part of a larger
statement).
c                     [        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        g r)   )r   rd   r   opr   _kws)r   r  r   kwss       r   r   Expr.__init__|  s7    "c""""#s####	r    c                 v    UR                  S5      (       a  [        R                  X5      $ U R                  U   $ )N_)rC   r   __getattr__r	  r   s     r   r  Expr.__getattr__  s0    ??3##D//yyr    c                 J    US;   a  X R                   U'   g X R                  U'   g )N)r  r   r	  )r   r	  )r   r   values      r   __setattr__Expr.__setattr__  s"    (("'MM$#IIdOr    c           
          [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eSnU " XTXU[        [        S9$ )Nbinop)r  r   fnlhsrhs
static_lhs
static_rhsr   r   r   r   	UNDEFINED)r0   r  r  r  r   r  s         r   r  
Expr.binop  sl    "12222#s#####s#####s####bbs'I? 	?r    c                    [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eSnU " XeXX4[        [        S9$ )Ninplace_binop)r  r   r  immutable_fnr  r  r  r  r  )r0   r  r   r  r  r   r  s          r   r  Expr.inplace_binop  s    "12222,(;<<<<#s#####s#####s####bb'I? 	?r    c                     [        U[        [        [        45      (       d   e[        U[        5      (       d   eSn[
        R                  " X5      nU " XCXS9$ )Nunary)r  r   r  r  )r   rd   r   r   r   r   r   )r0   r  r  r   r  s        r   r#  
Expr.unary  sQ    %#sL!9::::#s####'++B3bb66r    Nc                 v    [        U[        5      (       d   e[        U[        5      (       d   eSnU " XXUXVUS9$ )Ncall)r  r   funcargsr
  varargvarkwargtargetr   r   r   )	r0   r'  r(  r
  r   r)  r*  r+  r  s	            r   r&  	Expr.call  sG    $$$$$#s####bS FD 	Dr    c                 B    [        U[        5      (       d   eSnU " X2US9$ )Nbuild_tupler  r   itemsr   r   r0   r1  r   r  s       r   r/  Expr.build_tuple  s'    #s####b//r    c                 B    [        U[        5      (       d   eSnU " X2US9$ )N
build_listr0  r2  r3  s       r   r6  Expr.build_list  s'    #s####b//r    c                 B    [        U[        5      (       d   eSnU " X2US9$ )N	build_setr0  r2  r3  s       r   r9  Expr.build_set  s'    #s####b//r    c           	      D    [        U[        5      (       d   eSnU " XeXX4S9$ )N	build_map)r  r   r1  sizeliteral_valuevalue_indexesr2  )r0   r1  r=  r>  r?  r   r  s          r   r<  Expr.build_map  s0    #s####b!.M 	Mr    c                 B    [        U[        5      (       d   eSnU " X2US9$ )N
pair_firstr  r   r  r   r   r0   r  r   r  s       r   rB  Expr.pair_first  s'    %%%%%b//r    c                 p    [        U[        5      (       d   e[        U[        5      (       d   eSnU " X2US9$ )Npair_secondrC  r,  rE  s       r   rH  Expr.pair_second  s:    %%%%%#s####b//r    c                 p    [        U[        5      (       d   e[        U[        5      (       d   eSnU " X2US9$ )NgetiterrC  r,  rE  s       r   rK  Expr.getiter  s:    %%%%%#s####b//r    c                 p    [        U[        5      (       d   e[        U[        5      (       d   eSnU " X2US9$ )NiternextrC  r,  rE  s       r   rN  Expr.iternext  s:    %%%%%#s####b//r    c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eSnU " XCXS9$ )Nexhaust_iter)r  r   r  count)r   r   intr   )r0   r  rR  r   r  s        r   rQ  Expr.exhaust_iter  sM    %%%%%%%%%%#s####b<<r    c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eSnU " XCXS9$ )Nr   )r  r   r  attr)r   r   rd   r   )r0   r  rV  r   r  s        r   r   Expr.getattr  sM    %%%%%$$$$$#s####b::r    c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eSn[        R                  nU " XCXUS9$ )Ngetitem)r  r   r  r}   r  r   r   r   operatorrY  )r0   r  r}   r   r  r  s         r   rY  Expr.getitem  sZ    %%%%%%%%%%#s####bCCr    c                 r    [        U[        5      (       d   e[        U[        5      (       d   eSnU " XTXUS9$ )Ntyped_getitem)r  r   r  dtyper}   r,  )r0   r  r_  r}   r   r  s         r   r^  Expr.typed_getitem  sA    %%%%%#s####b  	 r    c           	          [        U[        5      (       d   eUb  [        U[        5      (       d   e[        U[        5      (       d   eSn[        R                  nU " XTXX6S9$ )Nstatic_getitem)r  r   r  r}   	index_varr  rZ  )r0   r  r}   rc  r   r  r  s          r   rb  Expr.static_getitem	  sd    %%%%% Jy#$>$>>>#s####b&/ 	/r    c                 p    [        U[        5      (       d   e[        U[        5      (       d   eSnU " X1US9$ )z5
A node for implicit casting at the return statement
cast)r  r  r   r,  rE  s       r   rf  	Expr.cast  s<    
 %%%%%#s####b3//r    c                 B    [        U[        5      (       d   eU " S/ / US9$ )zPhi node
        phi)r  incoming_valuesincoming_blocksr   r2  )r0   r   s     r   ri  Expr.phi  s(     #s####eRMMr    c           	      D    [        U[        5      (       d   eSnU " XaX#XES9$ )z&
A node for making a function object.
make_function)r  r   ru   closuredefaultsr   r2  )r0   r   ru   ro  rp  r   r  s          r   rn  Expr.make_function$  s+    
 #s####b$(\\r    c                 @    [        U[        5      (       d   eSnU " X!S9$ )zm
A node for null value.

This node is not handled by type inference. It is only added by
post-typing passes.
nullr  r   r2  r0   r   r  s      r   rs  	Expr.null-  s'     #s####b""r    c                 @    [        U[        5      (       d   eSnU " X!S9$ )zJ
A node for undefined value specifically from LOAD_FAST_AND_CLEAR opcode.
undefrt  r2  ru  s      r   rx  
Expr.undef9  s'    
 #s####b""r    c                 l    [        U[        5      (       d   e[        U[        5      (       d   eU " XUS9$ )a  
A node for a dummy value.

This node is a place holder for carrying information through to a point
where it is rewritten into something valid. This node is not handled
by type inference or lowering. It's presence outside of the interpreter
renders IR as illegal.
)r  infor   )r   r   rd   )r0   r  r{  r   s       r   dummy
Expr.dummyB  s7     #s####"c""""b--r    c                    U R                   S:X  a  SR                  S U R                   5       5      n[        R                  S:X  a  U R
                  R                  5       O"[        U R
                  R                  5       5      nSR                  S U 5       5      nU R                  b  SU R                  < 3OSnSR                  [        S XU/5      5      nSU R                  < S	U< S
3$ U R                   S:X  ao  U R                  U R                  pvU R                  [        R                  :X  a  Xvpv[         R"                  " U R                  U R                  5      nU< SU< SU< 3$ [        R                  S:X  a  U R
                  R                  5       O"[        U R
                  R                  5       5      nS U 5       nU R                   < S	SR                  U5      < S
3$ )Nr&  , c              3   8   #    U  H  n[        U5      v   M     g 7fr)   r   ).0as     r   	<genexpr> Expr.__repr__.<locals>.<genexpr>R  s     7YSVVY   r   c              3   8   #    U  H  u  pU< S U< 3v   M     g7f=Nr   r  kr   s      r   r  r  T  s     Dq!,r  *r_   zcall (r5   r  rj   c              3   8   #    U  H  u  pU< S U< 3v   M     g7fr  r   r  s      r   r  r  `  s     <q!$r  )r  rv   r(  r	   DIFF_IRr	  r1  sortedr)  filterr'  r  r  r  r[  containsr   r   )	r   r(  
pres_orderr
  r)  arglistr  r  r  s	            r   r7   Expr.__repr__P  sN   77f997TYY77D.4nn.A*vdiiooN_G`J))DDDC/3{{/Fdkk+BFiitdC-@ ABG$(IIw77WWxxww(+++S&**477DGG<B!$b#...4nn.A*vdiiooN_G`J<<D#ww		$88r    c                 8    U R                  U R                  5      $ r)   )r   r	  r6   s    r   r   Expr.list_varsc  s    ""499--r    c                 0    [        SU -  U R                  S9eNz%sr   r   r   r6   s    r   infer_constantExpr.infer_constantf      $TD[dhh??r    )r	  r   r  )NNN)$r   r   r   r   r   r   r  r  r   r  r  r#  r&  r/  r6  r9  r<  rB  rH  rK  rN  rQ  r   rY  r^  rb  rf  ri  rn  rs  rx  r|  r7   r   r  r   r   r    r   r  r  v  s   

$ ? ? 	? 	? 7 7 D D 0 0
 0 0
 0 0
 M M 0 0
 0 0 0 0 0 0 = = ; ; D D     / / 0 0 N N ] ] 	# 	# # # . .9&.@r    r  c                   $    \ rS rSrSrS rS rSrg)SetItemij  z
target[index] = value
c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        X@l        g r)   )r   r   r   r+  r}   r  r   )r   r+  r}   r  r   s        r   r   SetItem.__init__o  sb    &#&&&&%%%%%%%%%%#s####

r    c                 X    U R                   < SU R                  < SU R                  < 3$ N[z] = r+  r}   r  r6   s    r   r7   SetItem.__repr__y       $TZZDDr    )r}   r   r+  r  Nr   r   r   r   r   r   r7   r   r   r    r   r  r  j  s    Er    r  c                   $    \ rS rSrSrS rS rSrg)StaticSetItemi}  z 
target[constant index] = value
c                 &   [        U[        5      (       d   e[        U[        5      (       a   e[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        X@l        XPl        g r)   )r   r   r   r+  r}   rc  r  r   )r   r+  r}   rc  r  r   s         r   r   StaticSetItem.__init__  sz    &#&&&&eS)))))S))))%%%%%#s####
"
r    c                 X    U R                   < SU R                  < SU R                  < 3$ r  r  r6   s    r   r7   StaticSetItem.__repr__  r  r    )r}   rc  r   r+  r  Nr  r   r    r   r  r  }  s    
Er    r  c                   $    \ rS rSrSrS rS rSrg)DelItemi  z
del target[index]
c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        g r)   )r   r   r   r+  r}   r   )r   r+  r}   r   s       r   r   DelItem.__init__  sJ    &#&&&&%%%%%#s####
r    c                 @    SU R                   < SU R                  < S3$ )Nzdel r  ])r+  r}   r6   s    r   r7   DelItem.__repr__  s    #{{DJJ77r    )r}   r   r+  Nr  r   r    r   r  r    s    8r    r  c                        \ rS rSrS rS rSrg)SetAttri  c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        X@l        g r)   )r   r   rd   r   r+  rV  r  r   )r   r+  rV  r  r   s        r   r   SetAttr.__init__  sb    &#&&&&$$$$$%%%%%#s####	
r    c                 Z    SU R                   < SU R                  < SU R                  < 3$ )Nr  ). = )r+  rV  r  r6   s    r   r7   SetAttr.__repr__  s    !%diiDDr    )rV  r   r+  r  Nr   r   r   r   r   r7   r   r   r    r   r  r    s    Er    r  c                        \ rS rSrS rS rSrg)DelAttri  c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        g r)   )r   r   rd   r   r+  rV  r   )r   r+  rV  r   s       r   r   DelAttr.__init__  sJ    &#&&&&$$$$$#s####	r    c                 >    SU R                   < SU R                  < 3$ )Nzdel (r  )r+  rV  r6   s    r   r7   DelAttr.__repr__  s     $TYY77r    )rV  r   r+  Nr  r   r    r   r  r    s    8r    r  c                        \ rS rSrS rS rSrg)StoreMapi  c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        X@l        g r)   )r   r   r   dctkeyr  r   )r   r  r  r  r   s        r   r   StoreMap.__init__  sb    #s#####s####%%%%%#s####
r    c                 X    U R                   < SU R                  < SU R                  < 3$ r  )r  r  r  r6   s    r   r7   StoreMap.__repr__  s     $$((DJJ??r    )r  r  r   r  Nr  r   r    r   r  r    s    @r    r  c                        \ rS rSrS rS rSrg)Deli  c                 x    [        U[        5      (       d   e[        U[        5      (       d   eXl        X l        g r)   )r   rd   r   r  r   r   r  r   s      r   r   Del.__init__  s2    %%%%%#s####
r    c                      SU R                   -  $ )Nzdel %sr  r6   s    r   r;   Del.__str__  s    $**$$r    r   r  N)r   r   r   r   r   r;   r   r   r    r   r  r    s    %r    r  c                   *    \ rS rSrSrS rS rS rSrg)Raisei  Tc                 ~    Ub  [        U[        5      (       d   e[        U[        5      (       d   eXl        X l        g r)   r   r   r   	exceptionr   r   r  r   s      r   r   Raise.__init__  7     Jy#$>$>>>#s####"r    c                      SU R                   -  $ )Nzraise %sr  r6   s    r   r;   Raise.__str__  s    DNN**r    c                     / $ r)   r   r6   s    r   r  Raise.get_targets      	r    r  r   N)	r   r   r   r   r   r   r;   r  r   r   r    r   r  r    s    G+r    r  c                   .    \ rS rSrSrSrS rS rS rSr	g)	StaticRaisei  z
Raise an exception class and arguments known at compile-time.
Note that if *exc_class* is None, a bare "raise" statement is implied
(i.e. re-raise the current exception).
Tc                     Ub  [        U[        5      (       d   e[        U[        5      (       d   eUb  [        U[        5      (       d   eXl        X l        X0l        g r)   r   r#   r   r   	exc_classexc_argsr   r   r  r  r   s       r   r   StaticRaise.__init__  T     Jy$$?$???#s####:h#>#>>>" r    c           	          U R                   c  gU R                  c  SU R                   < 3$ SU R                   < SSR                  [        [        U R                  5      5      < S3$ )Nz<static> raisez<static> raise r  r  r5   r  r  rv   mapreprr6   s    r   r;   StaticRaise.__str__  sW    >>!#]]"*...:: # /3nn%)YYs4/G%HJ Jr    c                     / $ r)   r   r6   s    r   r  StaticRaise.get_targets  r  r    r  r  r   N
r   r   r   r   r   r   r   r;   r  r   r   r    r   r  r        
 GJr    r  c                   .    \ rS rSrSrSrS rS rS rSr	g)	DynamicRaisei  z
Raise an exception class and some argument *values* unknown at compile-time.
Note that if *exc_class* is None, a bare "raise" statement is implied
(i.e. re-raise the current exception).
Tc                     Ub  [        U[        5      (       d   e[        U[        5      (       d   eUb  [        U[        5      (       d   eXl        X l        X0l        g r)   r  r  s       r   r   DynamicRaise.__init__  r  r    c           	          U R                   c  gU R                  c  SU R                   < 3$ SU R                   < SSR                  [        [        U R                  5      5      < S3$ )Nz<dynamic> raisez<dynamic> raise r  r  r5   r  r6   s    r   r;   DynamicRaise.__str__  sW    >>!$]]"+/>>;; # 04~~%)YYs4/G%HJ Jr    c                     / $ r)   r   r6   s    r   r  DynamicRaise.get_targets  r  r    r  Nr  r   r    r   r  r    r  r    r  c                   $    \ rS rSrSrS rS rSrg)TryRaisei#  zRA raise statement inside a try-block
Similar to ``Raise`` but does not terminate.
c                 ~    Ub  [        U[        5      (       d   e[        U[        5      (       d   eXl        X l        g r)   r  r  s      r   r   TryRaise.__init__'  r  r    c                      SU R                   -  $ )Nztry_raise %sr  r6   s    r   r;   TryRaise.__str__-  s    ..r    r  Nr   r   r   r   r   r   r;   r   r   r    r   r  r  #  s    /r    r  c                   $    \ rS rSrSrS rS rSrg)StaticTryRaisei1  zYA raise statement inside a try-block.
Similar to ``StaticRaise`` but does not terminate.
c                     Ub  [        U[        5      (       d   e[        U[        5      (       d   eUb  [        U[        5      (       d   eXl        X l        X0l        g r)   r  r  s       r   r   StaticTryRaise.__init__5  r  r    c                     U R                   c  gU R                  c  SU R                    3$ SR                  [        [        U R                  5      5      nSU R                    SU S3$ )Nstatic_try_raisezstatic_try_raise r  r  r5   r  r   r(  s     r   r;   StaticTryRaise.__str__=  s^    >>!&]]"&t~~&67799St}}56D&t~~&6avQ??r    r  Nr  r   r    r   r  r  1  s    @r    r  c                   $    \ rS rSrSrS rS rSrg)DynamicTryRaiseiG  zZA raise statement inside a try-block.
Similar to ``DynamicRaise`` but does not terminate.
c                     Ub  [        U[        5      (       d   e[        U[        5      (       d   eUb  [        U[        5      (       d   eXl        X l        X0l        g r)   r  r  s       r   r   DynamicTryRaise.__init__K  r  r    c                     U R                   c  gU R                  c  SU R                    3$ SR                  [        [        U R                  5      5      nSU R                    SU S3$ )Ndynamic_try_raisezdynamic_try_raise r  r  r5   r  r  s     r   r;   DynamicTryRaise.__str__S  s^    >>!']]"''78899St}}56D''7qa@@r    r  Nr  r   r    r   r  r  G  s    Ar    r  c                   .    \ rS rSrSrSrS rS rS rSr	g)	Returni]  z
Return to caller.
Tc                     [        U[        5      (       d   [        U5      5       e[        U[        5      (       d   eXl        X l        g r)   )r   r   r#   r   r  r   r  s      r   r   Return.__init__c  s;    %%%2tE{2%#s####
r    c                      SU R                   -  $ )Nz	return %sr  r6   s    r   r;   Return.__str__i  s    TZZ''r    c                     / $ r)   r   r6   s    r   r  Return.get_targetsl  r  r    r  Nr  r   r    r   r  r  ]  s     G(r    r  c                   *    \ rS rSrSrS rS rS rSrg)Jumpip  z
Unconditional branch.
c                 J    [        U[        5      (       d   eXl        X l        g r)   )r   r   r+  r   )r   r+  r   s      r   r   Jump.__init__u  s    #s####r    c                      SU R                   -  $ )Nzjump %sr+  r6   s    r   r;   Jump.__str__z  s    4;;&&r    c                     U R                   /$ r)   r#  r6   s    r   r  Jump.get_targets}  s    }r    )r   r+  N	r   r   r   r   r   r   r;   r  r   r   r    r   r  r  p  s    
'r    r  c                   *    \ rS rSrSrS rS rS rSrg)Branchi  z
Conditional branch.
c                     [        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        X@l        g r)   )r   r   r   condtruebrfalsebrr   )r   r+  r,  r-  r   s        r   r   Branch.__init__  s<    $$$$$#s####	r    c                 Z    SU R                   < SU R                  < SU R                  < 3$ )Nzbranch r  )r+  r,  r-  r6   s    r   r;   Branch.__str__  s    &*iidllKKr    c                 2    U R                   U R                  /$ r)   )r,  r-  r6   s    r   r  Branch.get_targets  s    T\\**r    )r+  r-  r   r,  Nr'  r   r    r   r)  r)    s    L+r    r)  c                   $    \ rS rSrSrS rS rSrg)Assigni  z
Assign to a variable.
c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        g r)   )r   r   r   r   r  r+  r   )r   r  r+  r   s       r   r   Assign.__init__  sJ    %----&#&&&&#s####
r    c                 <    U R                   < SU R                  < 3$ )Nr  )r+  r  r6   s    r   r;   Assign.__str__  s     KK44r    )r   r+  r  Nr  r   r    r   r4  r4    s    5r    r4  c                   $    \ rS rSrSrS rS rSrg)Printi  z
Print some values.
c                     [        S U 5       5      (       d   eUb  [        U[        5      (       d   e[        U[        5      (       d   e[	        U5      U l        X l        0 U l        X0l        g )Nc              3   B   #    U  H  n[        U[        5      v   M     g 7fr)   rD  )r  rE   s     r   r  !Print.__init__.<locals>.<genexpr>  s     4t!:a%%ts   )	allr   r   r   r   r(  r)  r   r   )r   r(  r)  r   s       r   r   Print.__init__  s_    4t44444~FC!8!888#s####$K	r    c                 L    SSR                  S U R                   5       5      -  $ )Nz	print(%s)r  c              3   8   #    U  H  n[        U5      v   M     g 7fr)   r   r  r   s     r   r   Print.__str__.<locals>.<genexpr>  s     &Ay!s1vvyr  )rv   r(  r6   s    r   r;   Print.__str__  s     TYY&Atyy&AAAAr    )r(  r   r   r)  Nr  r   r    r   r:  r:    s    Br    r:  c                   &    \ rS rSrS rS rS rSrg)Yieldi  c                     [        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        g r)   )r   r   r   r  r   r}   )r   r  r   r}   s       r   r   Yield.__init__  s7    %%%%%#s####

r    c                 "    SU R                   < 3$ )Nzyield r  r6   s    r   r;   Yield.__str__  s    !ZZ))r    c                     U R                   /$ r)   r  r6   s    r   r   Yield.list_vars  s    

|r    )r}   r   r  N)r   r   r   r   r   r;   r   r   r   r    r   rF  rF    s    *r    rF  c                   *    \ rS rSrSrS rS rS rSrg)	EnterWithi  zEnter a "with" context
    c                     [        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        X@l        g)z
Parameters
----------
contextmanager : IR value
begin, end : int
    The beginning and the ending offset of the with-body.
loc : ir.Loc instance
    Source location
N)r   r   r   contextmanagerbeginendr   )r   rP  rQ  rR  r   s        r   r   EnterWith.__init__  s?     .#....#s####,
r    c                 8    SR                  U R                  5      $ )Nzenter_with {})formatrP  r6   s    r   r;   EnterWith.__str__  s    %%d&9&9::r    c                     U R                   /$ r)   )rP  r6   s    r   r   EnterWith.list_vars  s    ##$$r    )rQ  rP  rR  r   N)	r   r   r   r   r   r   r;   r   r   r   r    r   rN  rN    s    ";%r    rN  c                   $    \ rS rSrSrS rS rSrg)PopBlocki  z(Marker statement for a pop block op codec                 >    [        U[        5      (       d   eXl        g r)   )r   r   r   )r   r   s     r   r   PopBlock.__init__  s    #s####r    c                     g)N	pop_blockr   r6   s    r   r;   PopBlock.__str__      r    r  Nr  r   r    r   rZ  rZ    s    2r    rZ  c                   &    \ rS rSrS rS rS rSrg)Argi  c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        g r)   )r   rd   rS  r   r   r}   r   )r   r   r}   r   s       r   r   Arg.__init__  sJ    $$$$$%%%%%#s####	
r    c                 8    SU R                   U R                  4-  $ )Nzarg(%d, name=%s))r}   r   r6   s    r   r7   Arg.__repr__  s    !TZZ$;;;r    c                 0    [        SU -  U R                  S9er  r  r6   s    r   r  Arg.infer_constant  r  r    )r}   r   r   N)r   r   r   r   r   r7   r  r   r   r    r   rb  rb    s    <@r    rb  c                   0    \ rS rSrSS jrS rS rS rSrg)	Consti  c                 V    [        U[        5      (       d   eXl        X l        X0l        g r)   )r   r   r  r   use_literal_type)r   r  r   rl  s       r   r   Const.__init__  s%    #s####
 0r    c                 f    S[        U R                  5      R                  < SU R                  < S3$ )Nzconst(r  r5   )r#   r  r   r6   s    r   r7   Const.__repr__  s     "&tzz"2";";TZZHHr    c                     U R                   $ r)   r  r6   s    r   r  Const.infer_constant      zzr    c                 T    [        U R                  U R                  U R                  S9$ )N)r  r   rl  )rj  r  r   rl  r   memos     r   __deepcopy__Const.__deepcopy__	  s%    **$((!22
 	
r    )r   rl  r  NT)	r   r   r   r   r   r7   r  rv  r   r   r    r   rj  rj    s    1I
r    rj  c                   ,    \ rS rSrS rS rS rS rSrg)Globali  c                 V    [        U[        5      (       d   eXl        X l        X0l        g r)   )r   r   r   r  r   )r   r   r  r   s       r   r   Global.__init__  s$    #s####	
r    c                 @    SU R                   < SU R                  < S3$ )Nzglobal(: r5   r   r  r6   s    r   r;   Global.__str__  s    #'99djj99r    c                     U R                   $ r)   r  r6   s    r   r  Global.infer_constant  rr  r    c                     [        U R                  U R                  [        R                  " U R
                  5      5      $ r)   )rz  r   r  copydeepcopyr   rt  s     r   rv  Global.__deepcopy__  s(     diiT]]488-DEEr    )r   r   r  N)	r   r   r   r   r   r;   r  rv  r   r   r    r   rz  rz    s    :Fr    rz  c                   0    \ rS rSrSrS rS rS rS rSr	g)	FreeVari$  za
A freevar, as loaded by LOAD_DECREF.
(i.e. a variable defined in an enclosing non-global scope)
c                     [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        X@l        g r)   )r   rS  rd   r   r}   r   r  r   )r   r}   r   r  r   s        r   r   FreeVar.__init__*  sO    %%%%%$$$$$#s####
	
r    c                 @    SU R                   < SU R                  < S3$ )Nzfreevar(r~  r5   r  r6   s    r   r;   FreeVar.__str__6  s    $(IItzz::r    c                     U R                   $ r)   r  r6   s    r   r  FreeVar.infer_constant9  rr  r    c                 j    [        U R                  U R                  U R                  U R                  S9$ )N)r}   r   r  r   )r  r}   r   r  r   rt  s     r   rv  FreeVar.__deepcopy__<  s(    TZZdiitzz88% 	%r    )r}   r   r   r  N)
r   r   r   r   r   r   r;   r  rv  r   r   r    r   r  r  $  s    

;%r    r  c                   p    \ rS rSrSrS rS rS r\S 5       r	\S 5       r
\S 5       r\S	 5       rS
 rSrg)r   iC  zX
Attributes
-----------
- scope: Scope

- name: str

- loc: Loc
    Definition location
c                     Ub  [        U[        5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   eXl        X l        X0l        g r)   )r   Scoperd   r   r   r   r   )r   r   r   r   s       r   r   Var.__init__O  sN    }
5% 8 888$$$$$#s####
	r    c                 \    SU R                   < SU R                  R                  5       < S3$ )NzVar(r  r5   )r   r   r   r6   s    r   r7   Var.__repr__X  s     $		488>>+;<<r    c                     U R                   $ r)   )r   r6   s    r   r;   Var.__str__[  s    yyr    c                 8    U R                   R                  S5      $ )N$)r   rC   r6   s    r   is_tempVar.is_temp^  s    yy##C((r    c                     U R                   R                  R                  5        H  u  pU R                  U;   d  M  Us  $    U R                  $ )zIThe unversioned name of this variable, i.e. SSA renaming removed
        )r   var_redefinitionsr1  r   )r   r  	redef_sets      r   unversioned_nameVar.unversioned_nameb  sA     !JJ88>>@LAyyI% A yyr    c                 L    U R                   R                  U R                  5      $ )zKnown versioned names for this variable, i.e. known variable names in
the scope that have been formed from applying SSA to this variable
)r   get_versions_ofr  r6   s    r   versioned_namesVar.versioned_namesk  s    
 zz))$*?*?@@r    c                 6    U R                   U R                  1-  $ )zDAll known versioned and unversioned names for this variable
        )r  r  r6   s    r   	all_namesVar.all_namesr  s     ##t'<'<&>>>r    c                     [        [        R                  " U R                  U5      U R                  U R
                  5      nX![        U 5      '   U$ r)   )r   r  r  r   r   r   r   )r   ru  outs      r   rv  Var.__deepcopy__x  s7    $--

D1499dhhGRX
r    )r   r   r   N)r   r   r   r   r   r   r7   r;   propertyr  r  r  r  rv  r   r   r    r   r   r   C  sm    	= ) )   A A ? ?
r    r   c                   b    \ rS rSrSrS rS rS rS rS r	SS jr
S	 rS
 r\S 5       rS rSrg)r  i~  z
Attributes
-----------
- parent: Scope
    Parent scope

- localvars: VarMap
    Scope-local variable map

- loc: Loc
    Start of scope location

c                     Ub  [        U[        5      (       d   e[        U[        5      (       d   eXl        [	        5       U l        X l        [        [        5      U l	        [        [        5      U l        g r)   )r   r  r   parentr   	localvarsr   r   rS  	redefinedsetr  )r   r  r   s      r   r   Scope.__init__  sX    ~FE!:!:::#s####$S)!,S!1r    c                 f    [        XUS9nU R                  R                  UR                  U5        U$ )z
Define a variable
r   r   r   )r   r  r   r   )r   r   r   r   s       r   r   Scope.define  s-     d3/affa(r    c                 h    XR                   ;   a  SXR                   U   4-  nU R                  U5      $ )z3
Refer to a variable.  Returns the latest version.
%s.%d)r  	get_exactr   s     r   r   	Scope.get  s3     >>!dNN4$899D~~d##r    c                      U R                   R                  U5      $ ! [         a0    U R                  (       a  U R                  R                  U5      s $ e f = f)zZ
Refer to a variable.  The returned variable has the exact
name (exact variable version).
)r  r   r   
has_parentr  r   s     r   r  Scope.get_exact  sH    
	>>%%d++ 	{{t,,		s    6AAc                     XR                   ;   a  SXR                   U   4-  nXR                  ;  a  U R                  X5      $ U R                  R                  U5      $ )Nr  )r  r  r   r   )r   r   r   s      r   get_or_defineScope.get_or_define  sP    >>!dNN4$899D~~%;;t))>>%%d++r    c                 b   XR                   ;  a  U R                  X5      $ U(       d  U R                   R                  U5      $  U R                  U   nUS-   U R                  U'   SXS-   4-  n U R                  XR5      nU R                  U   R                  U5        U$ ! [         a     Mj  f = f)z)
Redefine if the name is already defined
r>   r  )r  r   r   r  r  addr   )r   r   r   renamectnewnameress          r   redefineScope.redefine  s     ~~%;;t)) >>%%d++^^D)')Avt$!T6N2>++g3C **4044W=
	 & s   /B   
B.-B.c                 @   ^ ^^ [        5       mU UU4S jmT" U5        T$ )z)
Gets all known versions of a given name
c                    > TR                   R                  U S 5      nU(       a#  U H  nTR                  U5        T" U5        M     g g r)   )r  r   r  )thenameredefsr   r   verswalks      r   r  #Scope.get_versions_of.<locals>.walk  s?    ++//>FAHHQKG   r    )r  )r   r   r  r  s   ` @@r   r  Scope.get_versions_of  s     u	 	T
r    c                     [        U R                  5      n[        U SU-  US9nU R                  R                  UR                  U5        U$ )Nz$%dr  )r   r  r   r   r   )r   r   nr   s       r   	make_tempScope.make_temp  s?    d4affa(r    c                     U R                   S L$ r)   )r  r6   s    r   r  Scope.has_parent  s    {{$&&r    c                 `    SU R                   [        U R                  5      U R                  4-  $ )Nz%Scope(has_parent=%r, num_vars=%d, %s))r  r   r  r   r6   s    r   r7   Scope.__repr__  s0    6$//:=dnn:M:>((:D D 	Dr    )r   r  r  r  r  Nrx  )r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r7   r   r   r    r   r  r  ~  sI    2$,. ' 'Dr    r  c                       \ rS rSrSrS rS rSS jrSS jrS r	S	 r
S
 rS rS rSS jr\S 5       r\S 5       rS rS rS rS rSrg)Blocki  zA code block

    c                     [        U[        5      (       d   e[        U[        5      (       d   eXl        / U l        X l        g r)   )r   r  r   r   bodyr   )r   r   r   s      r   r   Block.__init__  s9    %''''#s####
	r    c                 n    [        U R                  U R                  5      nU R                  S S  Ul        U$ r)   )r  r   r   r  r   blocks     r   r  
Block.copy  s*    djj$((+YYq\
r    Nc              #      #    U R                    HV  n[        U[        5      (       d  M  UR                  n[        U[        5      (       d  M=  Ub  UR
                  U:X  d  MR  Uv   MX     g7f)z5
Iterate over exprs of the given *op* in this block.
N)r  r   r4  r  r  r  )r   r  instexprs       r   
find_exprsBlock.find_exprs  sL      IID$''zzdD))zTWW]"
 s   #A*A*A*!	A*c              #   ^   #    U R                    H  n[        X!5      (       d  M  Uv   M     g7f)z6
Iterate over insts of the given class in this block.
N)r  r   )r   r0   r  s      r   
find_instsBlock.find_insts  s%      IID$$$
 s   -	-c                 t    U R                  [        S9 H!  nUR                  R                  U:X  d  M  Us  $    g)zZ
Returns the assignment inst associated with variable "name", None if
it cannot be found.
)r0   N)r  r4  r+  r   )r   r   rE   s      r   find_variable_assignmentBlock.find_variable_assignment  s3    
 V,Axx}}$ - r    c                 j    [        U[        5      (       d   eU R                  R                  SU5        g rI   )r   r   r  insertr   r  s     r   prependBlock.prepend  s)    $%%%%		D!r    c                 h    [        U[        5      (       d   eU R                  R                  U5        g r)   )r   r   r  rp   r  s     r   rp   Block.append#  s'    $%%%%		r    c                 ~    [        U[        5      (       d   eU R                  U R                  R                  U5      	 g r)   )r   r   r  r}   r  s     r   removeBlock.remove'  s.    $%%%%IIdiiood+,r    c                 "    U R                   S S 2	 g r)   r  r6   s    r   clearBlock.clear+  s    IIaLr    c                 
   U=(       d    [         R                  nU R                   HZ  n[        US5      (       a  UR	                  U5        M'  [        S UR                  5        5       5      n[        SU<S SU< 3US9  M\     g )Ndumpc              3   8   #    U  H  n[        U5      v   M     g 7fr)   r   rB  s     r   r  Block.dump.<locals>.<genexpr>5  s     "D3Ca3q663Cr  z    40rj   file)sysstdoutr  hasattrr  r  r   print)r   r  r  	inst_varss       r   r  
Block.dump.  s\    !szzIIDtV$$		$""D4>>3C"DD	i8tD r    c                      U R                   S   $ Nrl   r  r6   s    r   
terminatorBlock.terminator8  s    yy}r    c                 Z    U R                   =(       a    U R                   S   R                  $ r	  )r  r   r6   s    r   is_terminatedBlock.is_terminated<  s    yy8TYYr]888r    c                     U R                   (       d  [        S5      eU R                  S S  H  nUR                  (       d  M  [        S5      e   g )NzMissing block terminatorrl   z&Terminator before the last instruction)r  r   r  r   r  s     r   verifyBlock.verify@  sI    !!#$>??IIcrND!!!' )6 7 7 #r    c                 x    U R                   R                  U5      nU R                   R                  US-   U5        g)z
Insert *stmt* after *other*.
r>   N)r  r}   r  )r   stmtr%   r}   s       r   insert_afterBlock.insert_afterI  s.     		&		D)r    c                     [        U[        5      (       d   eU R                  (       d   eU R                  R	                  SU5        g r	  )r   r   r  r  r  )r   r  s     r   insert_before_terminatorBlock.insert_before_terminatorP  s8    $%%%%!!!!		T"r    c                 $    SU R                   < S3$ )Nz<ir.Block at >r  r6   s    r   r7   Block.__repr__U  s    %)XX//r    )r  r   r   r)   )r   r   r   r   r   r   r  r  r  r  r  rp   r  r  r  r  r
  r  r  r  r  r7   r   r   r    r   r  r    sv    
	#"-E   9 97*#
0r    r  c                   (    \ rS rSrSrSrS rS rSrg)LoopiY  zDescribes a loop-block
    entryexitc                     Xl         X l        g r)   r  r   r  r   s      r   r   Loop.__init__^      
	r    c                 <    U R                   U R                  4nSU-  $ )NzLoop(entry=%s, exit=%s)r  r  s     r   r7   Loop.__repr__b      zz499$(4//r    N	r   r   r   r   r   r   r   r7   r   r   r    r   r  r  Y      I0r    r  c                   (    \ rS rSrSrSrS rS rSrg)Withig  zDescribes a with-block
    r  c                     Xl         X l        g r)   r  r"  s      r   r   With.__init__l  r$  r    c                 <    U R                   U R                  4nSU-  $ )NzWith(entry=%s, exit=%s)r  r  s     r   r7   With.__repr__p  r'  r    Nr(  r   r    r   r+  r+  g  r)  r    r+  c                       \ rS rSrS rS rS rS r  SS jrS r	S	 r
S
 rSS jrSS jrSS jrS rSS jrSS jrSrg)
FunctionIRiu  c                 x    Xl         X l        X0l        X@l        X`l        Xpl        XPl        U R                  5         g r)   )blocksis_generatorr1   r   	arg_count	arg_names_definitions_reset_analysis_variables)r   r3  r4  r1   r   definitionsr5  r6  s           r   r   FunctionIR.__init__w  s3    (""'&&(r    c                 d    [        U 5      [        U5      L a  U R                  UR                  :H  $ g)a  Checks that the IR contained within is equal to the IR in other.
Equality is defined by being equal in fundamental structure (blocks,
labels, IR node type and the order in which they are defined) and the
IR nodes being equal. IR node equality essentially comes down to
ensuring a node's `.__dict__` or `.__slots__` is equal, with the
exception of ignoring 'loc' and 'scope' entries. The upshot is that the
comparison is essentially location and scope invariant, but otherwise
behaves as unsurprisingly as possible.
F)r#   r3  r$   s     r   equal_irFunctionIR.equal_ir  s*     :e$;;%,,..r    c                 z  ^ / nU R                   R                  5        GH  u  p4UR                   R                  US5      nUc  M'  XE:w  d  M.  UR                  SU-  R	                  SS5      5        UR
                   Vs/ s H  n[        U[        5      (       d  M  UPM     nnUR
                   Vs/ s H  n[        U[        5      (       d  M  UPM     nnXx:w  a,  [        U5      [        U5      :X  a  UR                  SU-  5        [        UR
                  5      [        UR
                  5      :  a  UR                  S5        O=[        UR
                  5      [        UR
                  5      :  a  UR                  S5        / m[        [        UR
                  UR
                  5      5       H!  u  pU
u  pX:w  d  M  TR                  U	5        M#     U4S jn[        [        UR
                  5      [        UR
                  5      5      n[        5        nS	U4S
U4/nU H  u  nnUR                  S5        UR                  US9  UR!                  5       R#                  5       n
U" UR
                  U5      nU< SU< 3nUR                  UR	                  SS5      5        UR%                  [        UU
5       VVs/ s H  u  nnSR'                  UU5      PM     snn5        M     SSS5        GM     U/ :X  a  UR                  S5        SR)                  U5      $ s  snf s  snf s  snnf ! , (       d  f       GM  = f)z_
Compute a human readable difference in the IR, returns a formatted
string ready for printing.
NzBlock %s differsP   -z<Block %s contains the same dels but their order is differentz#This block contains more statementsz$Other block contains more statementsc                    > Sn[        U5      S-  n/ n[        U 5      n[        U5       H'  nUT;   a  UnO
Xa:  a  UnOUnUR                  U5        M)     U$ )Nz-> rj   )r   rangerp   )	ablocklpointersppadnstmtiitemr   s	           r   get_pad$FunctionIR.diff_str.<locals>.get_pad  s`    "' \C/  #F!&uA Cx'.!"'.')JJt, ".  #
r    r   r%   r   r   z: block z{0}{1}zIR is considered equivalent.
)r3  r1  r   rp   centerr  r   r  r  r   ro   zipminr   truncater  getvalue
splitlinesrq   rU  rv   )r   r%   msglabelr  	other_blkrE   	block_deloth_delr~   stmtsb_so_srK  min_stmt_lenbufitr   _blockrG  titler  br   s                          @r   diff_strFunctionIR.diff_str  s   
  KK--/LE((5I$%JJ 2U :BB2sKL,1JJ MJq*Q:LJI M*3..O.QJq#<Nq.GO + "),w?JJ )CFK(L M5::Y^^)<<

#HIUZZ3y~~+>>

#IJ C&/EJJ4=NN1D 'E
#(:JJsO	'E# $'s5::INN8K#LL!s%uo/CD,.LD&LLO"KKSK1$'LLN$=$=$?E")&++|"DC7;U%CEJJu||B'<=JJ(+C(9(7 CG!Q1(=(7(9 : -/ $Y 0n "9JJ56yy~g !NO\(9 $s7   >LL1LLB&L*:L$L*$L**
L:	c                 d    [         R                  " U 5      U l        S U l        S U l        0 U l        g r)   )r   ConstantInference_constsgenerator_infovariable_lifetimeblock_entry_varsr6   s    r   r8  $FunctionIR._reset_analysis_variables  s.    //5 #!% "r    Nc                 $   U[        U5         n[        R                  " U 5      nXl        Uc  UR                  OUUl        U(       a  SUl        Ub  X'l        Ub  X7l        UR                  5         UR                  R                  5       Ul        U$ )z
Derive a new function IR from this one, using the given blocks,
and possibly modifying the argument count and generator flag.

Post-processing will have to be run again on the new IR.
F)
rP  r  r3  r   r4  r5  r6  r8  r1   derive)r   r3  r5  r6  force_non_generatorr   
firstblocknew_irs           r   rl  FunctionIR.derive  s}     CK(
4'*{Z^^
"'F ( (((*..0r    c                    [         R                   " U 5      n0 n0 nU R                  R                  5        H;  u  pEUR                  5       nXbU'   XPR                  ;   d  M*  U R                  U   X6'   M=     X!l        X1l        U$ r)   )r  r3  r1  ri  )r   ro  r3  ri  rU  r  	new_blocks          r   r  FunctionIR.copy  sw    4 KK--/LE

I%5M---.2.C.CE.J +	 0
 "2r    c                      U R                   U   $ )zN
Return a set of variable names possibly alive at the beginning of
the block.
)ri  r  s     r   get_block_entry_varsFunctionIR.get_block_entry_vars  s    
 $$U++r    c                 z    [        U[        5      (       a  UR                  nU R                  R	                  U5      $ )z6
Try to infer the constant value of a given variable.
)r   r   r   rf  r  r   s     r   r  FunctionIR.infer_constant	  s/     dC  99D||**400r    c                 >   Un [        U[        5      (       a  UnUR                  nO%[        U[        5      (       a  UnUnOU(       a  U$ U$ U R                  U   n[        U5      S:X  a  [        SU< 35      e[        U5      S:  a  [        SU< 35      eUS   nM  )z
Get the definition site for the given variable name or instance.
A Expr instance is returned by default, but if lhs_only is set
to True, the left-hand-side variable is returned instead.
r   zno definition for r>   zmore than one definition for )r   r   r   rd   r7  r   r   )r   r  lhs_onlyr  r   defss         r   get_definitionFunctionIR.get_definition  s     %%%zzE3''&s1E1$$T*D4yA~"& ) * *4y1}"& ) * *GE! r    c                    Uc  U R                   R                  5       nOM[        U[        5      (       a  U R                   U   /nO'[	        U5       Vs/ s H  o@R                   U   PM     nn[        U[
        5      (       d   eU H?  nUR                  [        5       H#  nUR                  U:X  d  M  UR                  s  s  $    MA     [        SU-  5      es  snf )zu
Finds the assignee for a given RHS value. If in_blocks is given the
search will be limited to the specified blocks.
z!Could not find an assignee for %s)r3  r   r   rS  r   r   r  r4  r  r+  r[   )r   	rhs_value	in_blocksr3  blkassigns         r   get_assigneeFunctionIR.get_assignee*  s    
 [['')F	3''kk),-F26y/B/3kk#&/FB)[1111C..0<<9,!==( 1 
 <yHII Cs   Cc           
         US L nU=(       d
    [        5       n[        U R                  R                  5       5       H#  u  p4[	        SU< S3US9  UR                  US9  M%     U(       ao  UR                  5       n[        R                  (       a>   SS K	nSSK	J
n  SSKJn  SSKJn	  SSKJn
  [	        U" XX" 5       U
" U	" 5       S	95      5        g [	        U5        g g ! [          a    S
n[#        U5      ef = f)Nzlabel r:   r   r   )rs   )NumbaIRLexer)by_colorscheme)Terminal256Formatter)stylez0Please install pygments to see highlighted dumps)r   r  r3  r1  r  r  rR  r	   HIGHLIGHT_DUMPSpygmentsrs   numba.misc.dump_styler  r  pygments.formattersr  ImportErrorr[   )r   r  nofileoffsetr  textr  rs   lexerr  r  rT  s               r   r  FunctionIR.dump@  s    !xz#DKK$5$5$78MF)5JJDJ! 9 ==?D%%2#
 3KDH)D%'3G,.40 1 2 d! 
 # *LC$S/)*s   C C1c                     [        5        nU R                  US9  UR                  5       sS S S 5        $ ! , (       d  f       g = f)Nr   )r   r  rR  )r   sbs     r   dump_to_stringFunctionIR.dump_to_stringZ  s*    Z2II2I;;= ZZs	   4
Ac           	      N   U=(       d    [         R                  nU R                  n[        S[	        UR
                  5      US9  [	        UR                  R                  5       5       H;  u  p4[        SU[	        UR                  5      [	        UR                  5      4-  US9  M=     g )Nzgenerator state variables:r   z>yield point #%d: live variables = %s, weak live variables = %s)
r  r  rg  r  r  
state_varsyield_pointsr1  	live_varsweak_live_vars)r   r  gir}   yps        r   dump_generator_infoFunctionIR.dump_generator_info_  s    !szz  *F2==,AM 5 5 78IERF2<<0&9J9J2KLM 9r    c           	          SSK nUR                  SR                  UU R                  R
                  5      S9nU R                  R                  5        H  u  pV[        5        nUR                  U5        UR                  5       nSSS5        U(       ao  SR                  WR                  5        V	s/ s H  n	SR                  U	5      PM     sn	5      nSR                  U5      U-   nUR                  [        U5      US	S
9  M  SR                  U5      nUR                  [        U5      USS
9  M     U R                  R                  5        HJ  u  pUR                  R!                  5        H'  nUR#                  [        U
5      [        U5      5        M)     ML     U$ ! [         a    [        S5      ef = f! , (       d  f       GN7= fs  sn	f )zRender the CFG of the IR with GraphViz DOT via the
``graphviz`` python binding.

Returns
-------
g : graphviz.Digraph
    Use `g.view()` to open the graph in the default PDF application.
r   NzcThe feature requires `graphviz` but it is not available. Please install with `pip install graphviz`z{}{}.dot)r   r_   z  {}\lz
block {}\lrect)rU  shapez{}\lcircle)graphvizr  DigraphrU  r1   unique_namer3  r1  r   r  rR  rv   rS  noderd   r
  r  edge)r   filename_prefix
include_irgvgr  r  r  rU  rE   srcdsts               r   
render_dotFunctionIR.render_doth  s   	! JJ&&((  
 kk'')FAr  272B2B2DE2DQY%%a(2DE &,,Q/%7s1vU&9q)s1vU(; * ))+HC~~113s3xS* 4 , ;  	= 	 
 Fs   F ""F40G
F14
G	)rf  r7  r5  r6  ri  r3  r1   rg  r4  r   rh  )NNFN)Fr)   )numba_irT)r   r   r   r   r   r<  rb  r8  rl  r  ru  r  r|  r  r  r  r  r  r   r   r    r   r1  r1  u  sR    )?B# 8<.20,12J,4!
)r    r1  c                   $    \ rS rSrSrS rS rSrg)UndefinedTypei  Nc                 ^    U R                   nUb  U$ [        R                  U 5      nXl         U$ r)   )
_singletonobject__new__)r0   objs     r   r  UndefinedType.__new__  s-    nn?J..%C N
r    c                     g)N	Undefinedr   r6   s    r   r7   UndefinedType.__repr__  r`  r    r   )r   r   r   r   r  r  r7   r   r   r    r   r  r    s    Jr    r  )Mcollectionsr   r  rb   rY   rS   r   r   r  r[  typesr   r   	functoolsr   ior   
numba.corer   r	   numba.core.utilsr
   r   r   r   numba.core.errorsr   r   r   r   r   	termcolorrr   r  r   unknown_locr   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)  r4  r:  rF  rN  rZ  rb  rj  rz  r  r   r  r  r  r+  r1  r  r  r   r    r   <module>r     s   #   	   	 
  3 $  %Q QJ J  
x4& x4x $a+ V  *   0&&V &&R& { B24 2. . q@4 q@hEd E&ED E*8d 8"Ed E
8d 
8@t @%$ %J  * :: :/t /@T @,Ad A,Z &: "+Z +(5T 5 BD B$D % %6t @
k @ 
 
,F F&% + %>8
k 8vpD pDfe0 e0P0! 00! 0\ \@	& " O	r    