
    ܙd<                     2   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlZd dlm	Z	m
Z
 d dlmZmZ d dlmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZmZ  e            Zd
e_          e            Z!d
e!_"         e            Z# G d de$          Z% G d de%          Z& G d de$          Z'd Z(d Z)d Z*d Z+d Z,d Z- G d de.          Z/d Z0d Z1d Z2d Z3d Z4d Z5 G d d e          Z6 G d! d"ee          Z7e8d#k    r ej9                     dS dS )$    N)	takewhile)njitjit)CFGraphLoop)compile_extracompile_isolatedFlagsCompilerBaseDefaultPassBuilder)
PreserveIR)IRLegalization)typesir)TestCaseoverride_configSerialMixinTc                        e Zd Zd Zd Zd ZdS )_Dummyc                 L    || _         || _        |                    |            d S N)recordername
_add_dummy)selfr   r   s      =lib/python3.11/site-packages/numba/tests/test_obj_lifetime.py__init__z_Dummy.__init__   s*     	D!!!!!    c                 x    t          |t                    sJ t          | j        | j        d|j                  S )Nz + )
isinstancer   r   r   )r   others     r   __add__z_Dummy.__add__"   s9    %(((((dm$)))UZZ%HIIIr   c                 <    t          | j        d| j        z            S )Nziter(%s))_DummyIteratorr   r   r   s    r   __iter__z_Dummy.__iter__&   s    dmZ$)-CDDDr   N)__name__
__module____qualname__r   r"   r&    r   r   r   r      sI        " " "
J J JE E E E Er   r   c                       e Zd ZdZd ZeZdS )r$   r   c                     | j         dk    rt          | xj         dz  c_         t          | j        | j        d| j                   S )N      #)countStopIterationr   r   r   r%   s    r   __next__z_DummyIterator.__next__.   sC    :??

a

dm			4::%FGGGr   N)r'   r(   r)   r0   r2   nextr*   r   r   r$   r$   *   s,        EH H H DDDr   r$   c                   `    e Zd ZdZd Zd Zd ZeZd Zd Z	e
d             Ze
d             Zd	S )
RefRecorderz
    An object which records events when instances created through it
    are deleted.  Custom events can also be recorded to aid in
    diagnosis.
    c                 ^    t          j        t                    | _        g | _        i | _        d S r   )collectionsdefaultdictint_counts_events_wrsr%   s    r   r   zRefRecorder.__init__>   s&    ".s33			r   c                 "    t          | |          S )zK
        Make an object whose deletion will be recorded as *name*.
        )r   )r   r   s     r   
make_dummyzRefRecorder.make_dummyC   s     dD!!!r   c                 X    t          j        || j                  }|j        | j        |<   d S r   )weakrefref_on_disposalr   r<   )r   dummywrs      r   r   zRefRecorder._add_dummyI   s'    [ 122
	"r   c                     | j         |         dz   }|| j         |<   | j                            |                    |                     dS )zr
        Manually append *event* to the recorded events.
        *event* can be formatted using format().
        r.   )r0   N)r:   r;   appendformat)r   eventr0   s      r   markzRefRecorder.markO   sK    
 U#a'#UELLuL5566666r   c                 n    | j                             |          }| j                            |           d S r   )r<   popr;   rF   )r   rD   r   s      r   rB   zRefRecorder._on_disposalX   s1    y}}R  D!!!!!r   c                 $    d | j         D             S )zC
        A list of objects which haven't been deleted yet.
        c                 "    g | ]} |            S r*   r*   ).0rD   s     r   
<listcomp>z%RefRecorder.alive.<locals>.<listcomp>a   s    ))))))r   )r<   r%   s    r   alivezRefRecorder.alive\   s    
 *)ty))))r   c                     | j         S )z,
        A list of recorded events.
        )r;   r%   s    r   recordedzRefRecorder.recordedc   s    
 |r   N)r'   r(   r)   __doc__r   r>   r   __call__rI   rB   propertyrP   rR   r*   r   r   r5   r5   7   s           
" " "# # # H7 7 7" " " * * X*   X  r   r5   c                      | d          } | d          } | d          }||z   }|                      d           ||z   }|                      d           |S )Nabc--1----2--rI   )recrW   rX   rY   ds        r   simple_usecase1r_   k   sd    CACACA	AAHHW	AAHHWHr   c                 h     | d          } | d          }|                      d           |}|}d }|S )NrW   rX   rZ   r\   )r]   rW   rX   xys        r   simple_usecase2rc   u   sB    CACAHHW	A	AAHr   c                      | d          } | d          } | d          }|}|D ]}||z   }|                      d           |                      d           ||z   }|S )NrW   rX   rY   --loop bottom----loop exit--r\   )r]   rW   rX   rY   ra   rb   s         r   looping_usecase1rg   ~   s|    CACACA	A $ $E"####HH_	AAHr   c                     | d          } | d          } | d          }|D ]}|                      d           ||z   }||z   }|                      d           |D ]1}|                      d           ||z   }|                      d           2|                      d           |r||z   }n n+|                      d	           |                      d
           |                      d           |S )NrW   rX   cum--outer loop top--z--inner loop entry #{count}--z--inner loop top #{count}--z--inner loop bottom #{count}--z--inner loop exit #{count}--z--outer loop bottom #{count}----outer loop else----outer loop exit--r\   )r]   rW   rX   ri   ra   zrb   s          r   looping_usecase2rn      s   CACA
#e**C ( (%&&&AgE0111 	7 	7AHH2333'CHH56666/000 	a%CC E12222&'''HH"###Jr   c              #   F   K    | d          } | d          }|V  |V  d S NrW   rX   r*   r]   rW   rX   s      r   generator_usecase1rr      s6      CACA
GGG
GGGGGr   c              #   P   K    | d          } | d          }|D ]}|V  |V  d S rp   r*   )r]   rW   rX   ra   s       r   generator_usecase2rt      sG      CACA  
GGGGGr   c                       e Zd ZdS )MyErrorN)r'   r(   r)   r*   r   r   rv   rv      s        Dr   rv   c                      t          |           r   rv   )ra   s    r   do_raisery      s    
!**r   c                      | d          } | d          } | d          }|rt          d            | d          }||z    ||z    d S )NrW   rX   r^   foorY   ry   )r]   rW   rX   r^   rY   s        r   raising_usecase1r}      s_    CACACA CHH	AEEEEr   c                 t     | d          } | d          }|r | d          }t          |           ||z    d S )NrW   rX   rY   r|   )r]   rW   rX   rY   s       r   raising_usecase2r      sI    CACA CHHEEEEr   c                 T     | d          } | d          }|rt          |          d S rp   rx   rq   s      r   raising_usecase3r      s:    CACA ajj r   c                    d}t          |          D ]}|                     t          |                     d}t          |          D ]}  dS |dk     rB|dk    r,t          |          D ]}|c c S |                     d           |                     d           |                     d           |                     d           dS )zN
    This test reveal a bug that there is a del on uninitialized variable
       r      FAILEDOK)rangerI   str)r]   nijs       r   del_before_definitionr      s     	
A1XX  Qq 		 		A1111uuaq  AHHHHH"""HHXHHTNNN2r   c              #      K   	 |                      d           dV   | d          }|r|                      d           	 =)z^
    test to reveal bug of invalid liveness when infinite loop has multiple
    backedge.
    TyieldNpbrar\   )r]   r   s     r   inf_loop_multiple_back_edger      sR      
CHH 	HHUOOOr   c                   n    e Zd ZdZd ZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd ZdS )TestObjLifetimezH
    Test lifetime of Python objects inside jit-compiled functions.
    c                 R     t          t          j        fdd          |          }|S )NTF)forceobjlooplift)r   r   pyobject)r   pyfunccfuncs      r   compilezTestObjLifetime.compile   s-     FU^%uEEEfMMr   Nc                     t                      }|                     |          }|9|                     |          5   ||           d d d            n# 1 swxY w Y   n ||           |S r   )r5   r   assertRaises)r   r   raisesr]   r   s        r   compile_and_recordz"TestObjLifetime.compile_and_record   s    mmV$$""6**  c


               E#JJJ
s   AAAc                     g }|j         }t          |          }|D ]0}||v r*|                    |           |                    |           1|                     ||d|           dS )zk
        Check that the *expected* markers occur in that order in *rec*'s
        recorded events.
        z%the full list of recorded events is: N)rR   listrF   removeassertEqual)r   r]   expectedactualrR   	remainingr^   s          r   assertRecordOrderz!TestObjLifetime.assertRecordOrder
  s    
 <NN	 	$ 	$AI~~a     ###FNhP	R 	R 	R 	R 	Rr   c                     |                      t                    }|                     |j                   |                     |g d           |                     |g d           |                     |g d           d S )N)rW   rX   rZ   )rW   rY   rZ   )rZ   zb + cr[   )r   r_   assertFalserP   r   r   r]   s     r   test_simple1zTestObjLifetime.test_simple1  s    %%o66###s$7$7$7888s$7$7$7888s$?$?$?@@@@@r   c                     |                      t                    }|                     |j                   |                     |g d           d S )N)rX   rZ   rW   )r   rc   r   rP   r   r   s     r   test_simple2zTestObjLifetime.test_simple2"  sN    %%o66###s$7$7$788888r   c                     |                      t                    }|                     |j                   |                     |g d           |                     |g d           d S )N)rW   rX   rf   rY   )	iter(a)#1re   	iter(a)#2re   	iter(a)#3re   iter(a)rf   )r   rg   r   rP   r   r   s     r   test_looping1zTestObjLifetime.test_looping1'  s|    %%&677###s$D$D$DEEEs %' %' %' 	( 	( 	( 	( 	(r   c                 ^   |                      t                    }|                     |j                   |                     |ddg           |                     |g d           |                     |g d           |                     |g d           |                     |ddg           d S )NrW   rj   )r   rk   rl   )iter(b)z--inner loop exit #1--r   z--inner loop exit #2--r   z--inner loop exit #3--)r   z--inner loop entry #1--r   z--inner loop entry #2--r   z--inner loop entry #3--ziter(a)#1 + iter(a)#1z--outer loop bottom #1--)r   rn   r   rP   r   r   s     r   test_looping2zTestObjLifetime.test_looping23  s    %%&677###sS*>$?@@@s %< %< %< 	= 	= 	=s %' %' %' 	( 	( 	(
 	s %' %' %' 	( 	( 	(
 	s%<%?%' 	( 	( 	( 	( 	(r   c                    |                      |          }t                      }|                     |          5   ||          }t          |           |                     |j                   t          |           |                     |j                   d d d            n# 1 swxY w Y   t                      }|                     |          5   ||          }~t          j	                     |                     |j                   d d d            n# 1 swxY w Y   t                      }|                     |          5   ||          }t          |           |                     |j                   ~t          j	                     |                     |j                   d d d            d S # 1 swxY w Y   d S r   )
r   r5   assertRefCountr3   
assertTruerP   r   r   gccollect)r   genfuncr   r]   gens        r   exercise_generatorz"TestObjLifetime.exercise_generatorI  sJ   W%%mm  %% 	( 	(%**CIIIOOCI&&&IIISY'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( mm  %% 	( 	(%**CJLLLSY'''		( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( mm  %% 	( 	(%**CIIIOOCI&&&JLLLSY'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s7   AB##B'*B':DDDA#F55F9<F9c                 :    |                      t                     d S r   )r   rr   r%   s    r   test_generator1zTestObjLifetime.test_generator1d       233333r   c                 :    |                      t                     d S r   )r   rt   r%   s    r   test_generator2zTestObjLifetime.test_generator2g  r   r   c                 t    |                      t                    }|                     |j        g d           d S )N)012)r   r   r   rR   r   s     r   test_del_before_definitionz*TestObjLifetime.test_del_before_definitionj  s8    %%&;<<77777r   c                     |                      t                    5  |                     t          t                    }|                     |j                   d d d            d S # 1 swxY w Y   d S N)r   )r   ry   r   r}   rv   r   rP   r   s     r   test_raising1zTestObjLifetime.test_raising1n        ** 	( 	())*:7)KKCSY'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(   <A$$A(+A(c                     |                      t                    5  |                     t          t                    }|                     |j                   d d d            d S # 1 swxY w Y   d S r   )r   ry   r   r   rv   r   rP   r   s     r   test_raising2zTestObjLifetime.test_raising2s  r   r   c                     |                      t                    5  |                     t          t                    }|                     |j                   d d d            d S # 1 swxY w Y   d S r   )r   rv   r   r   r   rP   r   s     r   test_raising3zTestObjLifetime.test_raising3x  s      )) 	( 	())*:7)KKCSY'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(r   c                    |                      t                    }t                      }t           ||                    }t	          |           |                     |j        g            t	          |           |                     |j        g            t	          |           |                     |j        g            |                     |j        g d           d S )N)r   r   r   r   r   r   r   )r   r   r5   iterr3   r   rP   rR   )r   r   r]   iterators       r    test_inf_loop_multiple_back_edgez0TestObjLifetime.test_inf_loop_multiple_back_edge}  s    899mmc

##XB'''XB'''XB'''LLL	N 	N 	N 	N 	Nr   r   )r'   r(   r)   rS   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r*   r   r   r   r      s             R R R"A A A9 9 9

( 
( 
(( ( (,( ( (64 4 44 4 48 8 8( ( (
( ( (
( ( (
N N N N Nr   r   c                       e Zd Zd Zd ZdS )TestExtendingVariableLifetimesc                     d } fd} |d          }g t           j        fdz  t           j        t           j        t           j        t           j        t           j        t           j        t           j        } |||            |d          }g t           j        fdz  t           j        t           j        fdz  t           j        } |||           d S )Nc                     G d dt                     }t          |          d             }t          d|           5   |             |j        |j        d                  }|j        d         }d d d            n# 1 swxY w Y   |S )Nc                       e Zd Zd ZdS )`TestExtendingVariableLifetimes.test_lifetime_basic.<locals>.get_ir.<locals>.IRPreservingCompilerc                     t          j        | j                  }|                    t          t
                     |                                 |gS r   r   define_nopython_pipelinestateadd_pass_afterr   r   finalizer   pms     r   define_pipelineszqTestExtendingVariableLifetimes.test_lifetime_basic.<locals>.get_ir.<locals>.IRPreservingCompiler.define_pipelines  >    +DTZPPB%%j.AAAKKMMM4Kr   Nr'   r(   r)   r   r*   r   r   IRPreservingCompilerr     #                 r   r   )pipeline_classc                  "    d} d}| |z   }||z  }|S N
      r*   rW   rX   rY   r^   s       r   r{   zOTestExtendingVariableLifetimes.test_lifetime_basic.<locals>.get_ir.<locals>.foo  #    EEr   EXTEND_VARIABLE_LIFETIMESr   preserved_ir)r   r   r   	overloads
signaturesmetadata)extend_lifetimesr   r{   cresfunc_irs        r   get_irzBTestExtendingVariableLifetimes.test_lifetime_basic.<locals>.get_ir  s             |       !5666  76 !!<>NOO 8 8}S^A%67-78 8 8 8 8 8 8 8 8 8 8 8 8 8 8
 Ns   0A99A= A=c                                          t          | j                  d           t          t	          | j                                                            }t          ||j                  D ]\  }}                    ||           d S )Nr.   )	r   lenblocksr3   r   valueszipbodyassertIsInstance)r   expectblkexpect_classgot_stmtr   s        r   checkzATestExtendingVariableLifetimes.test_lifetime_basic.<locals>.check  s    S00!444tGN11334455C +.fch*?*? > >&h%%h====> >r   Fr-   T   )r   AssignDelReturn)r   r   r  del_after_use_irr   del_at_block_end_irs   `     r   test_lifetime_basicz2TestExtendingVariableLifetimes.test_lifetime_basic  s    	 	 	4	> 	> 	> 	> 	> "6%==0RYL1$ 0rv 0rv 0ry 0"& 0)0V0%'Y0'''$fTll ORYL1$NryNRVIMNBIN!6*****r   c                    d } |d          } |dd          } |dd          }d }|                       ||                     |                       ||                     |                      ||                     d S )Nc                       G d dt                     }t          dd|i| d             } |             |j        |j        d                  }|j        d         }|S )Nc                       e Zd Zd ZdS )fTestExtendingVariableLifetimes.test_dbg_extend_lifetimes.<locals>.get_ir.<locals>.IRPreservingCompilerc                     t          j        | j                  }|                    t          t
                     |                                 |gS r   r   r   s     r   r   zwTestExtendingVariableLifetimes.test_dbg_extend_lifetimes.<locals>.get_ir.<locals>.IRPreservingCompiler.define_pipelines  r   r   Nr   r*   r   r   r   r    r   r   r   r   c                  "    d} d}| |z   }||z  }|S r   r*   r   s       r   r{   zUTestExtendingVariableLifetimes.test_dbg_extend_lifetimes.<locals>.get_ir.<locals>.foo  r   r   r   r   r*   )r   r   r   r   r   )optionsr   r{   r   r   s        r   r   zHTestExtendingVariableLifetimes.test_dbg_extend_lifetimes.<locals>.get_ir  s             |       AA!5AAA  BA CEEE=!23DmN3GNr   T)debug)r  _dbg_extend_lifetimesFc                 t   | j                                         \  }d |j        D             }t          t	          t
          j        |                    }t          |          }t          t	          t
          j        ||d                              }|t          |          z   }|t          |          dz
  k    S )Nc                 B    g | ]}t          |t          j                  S r*   )r    r   r  )rN   stmts     r   rO   zoTestExtendingVariableLifetimes.test_dbg_extend_lifetimes.<locals>.is_del_grouped_at_the_end.<locals>.<listcomp>  s$    III:dBF33IIIr   r.   )	r   r   r   r   r   operatornot_r   truth)firr  inst_is_delnot_delsbeginall_delsends          r   is_del_grouped_at_the_endz[TestExtendingVariableLifetimes.test_dbg_extend_lifetimes.<locals>.is_del_grouped_at_the_end  s    J%%''ESIIIIIKIhm[AABBHMMEIhnk%&&6IJJKKH#h--'C #k**Q...r   )r   r   )r   r   ir_debugir_debug_extir_debug_no_extr!  s         r   test_dbg_extend_lifetimesz8TestExtendingVariableLifetimes.test_dbg_extend_lifetimes  s    	 	 	2 6%%%vDEEE &t5III	/ 	/ 	/  	11(;;<<<11,??@@@22?CCDDDDDr   N)r'   r(   r)   r  r%  r*   r   r   r   r     s8        
0+ 0+ 0+d3E 3E 3E 3E 3Er   r   __main__):r7   sysr@   r   r  	itertoolsr   unittestnumbar   r   numba.core.controlflowr   r   numba.core.compilerr   r	   r
   r   r   numba.core.untyped_passesr   numba.core.typed_passesr   
numba.corer   r   numba.tests.supportr   r   r   enable_pyobj_flagsenable_pyobjectforceobj_flagsforce_pyobjectno_pyobj_flagsobjectr   r$   r5   r_   rc   rg   rn   rr   rt   RuntimeErrorrv   ry   r}   r   r   r   r   r   r   r'   mainr*   r   r   <module>r9     sd       



  				                 0 0 0 0 0 0 0 0C C C C C C C C C C C C C C 0 0 0 0 0 0 2 2 2 2 2 2                 F F F F F F F F F FUWW %)  " $ E E E E EV E E E
 
 
 
 
V 
 
 
1 1 1 1 1& 1 1 1h    
 
 
  2    	 	 	 	 	l 	 	 	  
 
 

 
 
    .  SN SN SN SN SNh SN SN SNljE jE jE jE jE[( jE jE jEZ zHMOOOOO r   