
    sh                         S r SSKrSSKJrJr  SSKJr  SSKJ	r	  \R                  " S5      r\R                  " S5      r\R                  " SR                  / S	Q5      5      rS
 rS rg)z
NRT specific optimizations
    N)defaultdictdeque)binding)cgutilsz,\s*(?:tail)?\s*call void @NRT_incref\((.*)\)z,\s*(?:tail)?\s*call void @NRT_decref\((.*)\)|)z[0-9]+:z,[\'"]?[-a-zA-Z$._0-9][-a-zA-Z$._0-9]*[\'"]?:z^definez^;\s*<label>c                    ^^^^	^
 S nUU	4S jnS mUU
4S jm	S mU4S jm
S m/ nU" U 5       H  u  pEU(       a  U" U5      nX5-  nM     SR                  U5      $ )	Nc              3   j  #    / n[        U 5      R                  5        H  nUR                  S5      (       a  U(       a   eUR                  U5        M5  UR                  S5      (       a$  U(       d   eUR                  U5        SU4v   / nMo  U(       a  UR                  U5        M  SU/4v   M     g 7f)Ndefine}TF)str
splitlines
startswithappend)modulecurlines      m/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/numba/core/runtime/nrtopt.py_extract_functions7_remove_redundant_nrt_refct.<locals>._extract_functions   s     K**,Dx((w

4 %%
s

4 Ci

4 dVm# -s   B1B3c                 b   > / nT" U 5       H  u  p#U(       a  U(       a  T" U5      nX-  nM!     U$ N )
func_linesoutis_bbbb_lines_extract_basic_blocks_process_basic_blocks       r   _process_function6_remove_redundant_nrt_refct.<locals>._process_function/   s7    4Z@OE/9OC  A 
    c              3   N  #    U S   R                  S5      (       d   eU S   R                  S5      (       d   eSU S   /4v   / nU SS  HF  n[        R                  U5      nUb  SU4v   / nSU/4v   M,  U(       d  M5  UR                  U5        MH     SU4v   SU S   /4v   g 7f)Nr   r
   r   F   T)r   	_regex_bbmatchr   )r   r   lnms       r   r   :_remove_redundant_nrt_refct.<locals>._extract_basic_blocks7   s     !}''1111"~((----jm_$$Qr"B#A}CibTk!

2 # Cijn%%%s   A9B%?&B%c                 (   > T" U 5      n T" U 5      n U $ r   r   )r   (_move_and_group_decref_after_all_increfs_prune_redundant_refct_opss    r   r   9_remove_redundant_nrt_refct.<locals>._process_basic_blockJ   s    ;HE-h7r!   c              3      #    [        U 5       Hk  u  p[        R                  U5      nUb  XR                  S5      S 4v   M4  [        R                  U5      nUb  US UR                  S5      4v   Md  US S 4v   Mm     g 7f)Nr$   )	enumerate_regex_increfr&   group_regex_decref)r   numr'   r(   s       r   _examine_refct_op6_remove_redundant_nrt_refct.<locals>._examine_refct_opO   sz      *GC##B'A}771:t++##B'A}4++dD.  +s   A<A>c                   > [        [        5      n[        [        5      n[        5       nT" U 5       H  u  pEnU(       a	  U(       a   eU(       a.  US:X  a  UR                  U5        M6  X   R	                  U5        MK  U(       d  MT  US:X  a  UR                  U5        Mm  X&   R	                  U5        M     UR                  5        Hw  u  pxX   n	[        [        U	5      [        U5      5      n
[        U
5       HA  nUR                  U	R                  5       5        UR                  UR                  5       5        MC     My     [        U 5       VVs/ s H  u  pLXC;  d  M  UPM     snn$ s  snnf )Nzi8* null)r   r   setaddr   itemsminlenrangepoppopleftr/   )r   
incref_map
decref_map	to_remover3   
incref_var
decref_varvardecopsincopsct_r'   r4   s                r   r,   ?_remove_redundant_nrt_refct.<locals>._prune_redundant_refct_ops]   s)    '
 '
E	+<X+F'CZ"z22+MM#&*11#6+MM#&*11#6 ,G &++-KC_FS[#f+.B2Yfjjl+fnn./  . #,H"5 )"5ws' "5 ) 	) )s   E(E(c                    Sn[        U 5       H"  u  p#[        R                  U5      c  M  US-   nM$     Sn[        U 5       H"  u  p#[        R                  U5      c  M  US-   nM$     [	        X5      n/ n/ nU S U  H=  n[        R                  U5      b  UR                  U5        M,  UR                  U5        M?     Xv-   XS  -   $ )Nr   r$   )r/   r0   r&   r2   maxr   )r   last_incref_posposr'   last_decref_poslast_posdecrefsheads           r   r+   M_remove_redundant_nrt_refct.<locals>._move_and_group_decref_after_all_increfsx   s     *GC""2&2"%' +
  *GC""2&2"%' + 8 9H%B""2&2r"B	 & ~ 333r!   
)join)llvmirr   r   	processedis_funclinesr4   r   r+   r   r,   s         @@@@@r   _remove_redundant_nrt_refctrY      sd    $$&&
!)648 I,V4%e,E		 5 99Yr!   c                      U R                  S5        U R                  n[        [	        U 5      5      n[
        R                  " U5      n[        R                  " U5      Ul        U$ ! [         a    U s $ f = f)a  
Remove redundant reference count operations from the
`llvmlite.binding.ModuleRef`. This parses the ll_module as a string and
line by line to remove the unnecessary nrt refct pairs within each block.
Decref calls are moved after the last incref call in the block to avoid
temporarily decref'ing to zero (which can happen due to hidden decref from
alias).

Note: non-threadsafe due to usage of global LLVMcontext

NRT_incref)	get_function	NameErrornamerY   r   llparse_assemblyr   normalize_ir_text)	ll_moduler^   newllnew_mods       r   remove_redundant_nrt_refctre      sl    |, >>D'I7E&G,,T2GLN  s   A& &A54A5)__doc__recollectionsr   r   llvmliter   r_   
numba.corer   compiler0   r2   rT   r%   rY   re   r   r!   r   <module>rl      sa    
 * " 

JK

JKJJII 	 		C Lr!   