
    J/Ph=5                         d dl Zd dl Z d dlZd dlmZmZ d dlmZmZ d dl	m
Z
 d dlmZmZ  G d de          Z G d d	e          Zed
k    r ej                     dS dS )    N)njitjit)TypingErrorUnsupportedError)ir)TestCaseIRPreservingTestPipelinec                   V    e 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 )TestClosurec                     dfd} t          di ||          }|                      |d          d           d|                      |d          d           d S )N
   c                     | z   S N xYs    X/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/numba/tests/test_closure.pyadd_Yz3TestClosure.run_jit_closure_variable.<locals>.add_Y       q5L    i4(i4)         r   r   assertEqual)selfjitargsr   c_add_Yr   s       @r   run_jit_closure_variablez$TestClosure.run_jit_closure_variable   s    	 	 	 	 	 +#**'**511R((( R(((((r   c                 2    |                      d           d S NT)forceobjr"   r   s    r   test_jit_closure_variablez%TestClosure.test_jit_closure_variable       %%t%44444r   c                 2    |                      d           d S NTnopythonr&   r'   s    r   test_jit_closure_variable_npmz)TestClosure.test_jit_closure_variable_npm   r)   r   c                 j   dfd} t          di ||          }|                      |d          d           d t          di ||          }|                      |d          d           d|                      |d          d           |                      |d          d           d S )	Nr   c                     | z   S r   r   r   s    r   r   z0TestClosure.run_rejitting_closure.<locals>.add_Y%   r   r   r   r   r   r      r   r   )r   r    r   r!   	c_add_Y_2r   s        @r   run_rejitting_closurez!TestClosure.run_rejitting_closure"   s    	 	 	 	 	 +#**'**511R((( ,C,,G,,U33	1r***1r***R(((((r   c                 2    |                      d           d S r$   r3   r'   s    r   test_rejitting_closurez"TestClosure.test_rejitting_closure4       ""D"11111r   c                 2    |                      d           d S r+   r5   r'   s    r   test_rejitting_closure_npmz&TestClosure.test_rejitting_closure_npm7   r7   r   c                     ddfd} t          di ||          }|                      |d          d           d S )Nr      c                     | z   z  S r   r   )r   r   Zs    r   add_Y_mult_ZzDTestClosure.run_jit_multiple_closure_variables.<locals>.add_Y_mult_Z>   s    EQ;r   r   r      r   r   )r   r    r>   c_add_Y_mult_Zr   r=   s       @@r   "run_jit_multiple_closure_variablesz.TestClosure.run_jit_multiple_closure_variables:   sq    	 	 	 	 	 	 21111,??**B/////r   c                 2    |                      d           d S r$   rA   r'   s    r   #test_jit_multiple_closure_variablesz/TestClosure.test_jit_multiple_closure_variablesD       ///>>>>>r   c                 2    |                      d           d S r+   rC   r'   s    r   'test_jit_multiple_closure_variables_npmz3TestClosure.test_jit_multiple_closure_variables_npmG   rE   r   c                 X   d } t          di ||                                           fd} t          di ||          }|                                 |                     |          5  |                      |d          d           d d d            d S # 1 swxY w Y   d S )Nc                     | dz  S )Nr   r   )as    r   mult_10z3TestClosure.run_jit_inner_function.<locals>.mult_10K   s    r6Mr   
intp(intp)c                       | dz             S N   r   )r   	c_mult_10s    r   do_mathz3TestClosure.run_jit_inner_function.<locals>.do_mathQ   s    9QU###r   r   2   )rL   )r   disable_compileassertRefCountr   )r   r    rK   rQ   	c_do_mathrP   s        @r   run_jit_inner_functionz"TestClosure.run_jit_inner_functionJ   s%   	 	 	 1C000099	!!###	$ 	$ 	$ 	$ 	$ 1C000099	!!###  I66 	/ 	/YYq\\2...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s   2 BB#&B#c                 2    |                      d           d S r$   rV   r'   s    r   test_jit_inner_functionz#TestClosure.test_jit_inner_functionZ       ##T#22222r   c                 2    |                      d           d S r+   rX   r'   s    r   test_jit_inner_function_npmz'TestClosure.test_jit_inner_function_npm]   rZ   r   N)__name__
__module____qualname__r"   r(   r.   r3   r6   r9   rA   rD   rG   rV   rY   r\   r   r   r   r   r      s        ) ) )5 5 55 5 5) ) )$2 2 22 2 20 0 0? ? ?? ? ?/ / / 3 3 33 3 3 3 3r   r   c                   b    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zej        d
             ZdS )TestInlinedClosurez
    Tests for (partial) closure support in njit. The support is partial
    because it only works for closures that can be successfully inlined
    at compile time.
    c                 z    d }t          |          }|                      |d           |d                     d S )Nc                 6    d } ||            ||           z   S )Nc                     | | z  S r   r   )r   s    r   innerzDTestInlinedClosure.test_inner_function.<locals>.outer.<locals>.innerl       1ur   r   r   re   s     r   outerz5TestInlinedClosure.test_inner_function.<locals>.outerj   s.       588eeAhh&&r   r   r   r   r   rh   cfuncs      r   test_inner_functionz&TestInlinedClosure.test_inner_functionh   sJ    	' 	' 	' UrEE"II.....r   c                 z    d }t          |          }|                      |d           |d                     d S )Nc                 F    | dz   fd} ||            ||           z   S )Nr   c                     | | z  z   S r   r   r   ys    r   re   zQTestInlinedClosure.test_inner_function_with_closure.<locals>.outer.<locals>.innery   s    1uqy r   r   r   re   rq   s     @r   rh   zBTestInlinedClosure.test_inner_function_with_closure.<locals>.outerv   sB    AA! ! ! ! ! 588eeAhh&&r   r   ri   rj   s      r    test_inner_function_with_closurez3TestInlinedClosure.test_inner_function_with_closuret   sJ    	' 	' 	' UrEE"II.....r   c                 z    d }t          |          }|                      |d           |d                     d S )Nc                 J    | dz   fd} ||            ||           z   S )Nr   c                     | z  S r   r   rp   s    r   re   zSTestInlinedClosure.test_inner_function_with_closure_2.<locals>.outer.<locals>.inner       1ur   r   rr   s     @r   rh   zDTestInlinedClosure.test_inner_function_with_closure_2.<locals>.outer   sF    AA     aAuuQxx<r   r   ri   rj   s      r   "test_inner_function_with_closure_2z5TestInlinedClosure.test_inner_function_with_closure_2   sJ    	  	  	  UrEE"II.....r   c                     d}i }t          |                                |           t          |d                   }|                      |d           |d         d                     d S )Na  
            def outer(x):
                y = x + 1
                z = 0

                def inner(x):
                    nonlocal z
                    z += x * x
                    return z + y

                return inner(x) + inner(x) + z
        rh   r   )execstripr   r   )r   codensrk   s       r   "test_inner_function_with_closure_3z5TestInlinedClosure.test_inner_function_with_closure_3   si     TZZ\\2R[!!rKBwKOO44444r   c                 z    d }t          |          }|                      |d           |d                     d S )Nc                 *      fd} |  z            S )Nc                 Z      fd}d}t                     D ]}| ||          z  }|S )Nc                     z   | z   S r   r   zr   rq   s    r   	innermostz^TestInlinedClosure.test_inner_function_nested.<locals>.outer.<locals>.inner.<locals>.innermost   s    q519$r   r   range)rq   r   sir   s   `   r   re   zKTestInlinedClosure.test_inner_function_nested.<locals>.outer.<locals>.inner   sW    % % % % % % q & &A1%AAr   r   rg   s   ` r   rh   z<TestInlinedClosure.test_inner_function_nested.<locals>.outer   s0         5Q<<r   r   ri   rj   s      r   test_inner_function_nestedz-TestInlinedClosure.test_inner_function_nested   sJ    	  	  	  UrEE"II.....r   c                 l   t           fd            fd}fd}d }d }d }d }dfd	}dfd
}d }	d }
d }d }d"d}d"d}d"d}d }d }d }d }d }d }d }|||||||	|
|||||||g}|D ];}t          |          }d}|                      ||           ||                     <|                     t                    5 } t	          d          |          } ||           ddd           n# 1 swxY w Y   d}|                     |t          |j                             |                     t                    5 } t	          d          |          } ||           ddd           n# 1 swxY w Y   d}|                     |t          |j                             |                     t                    5 } t	          d          |          } ||           ddd           n# 1 swxY w Y   d}|                     |t          |j                             |                     t                    5 } t	          d          |          } ||           ddd           n# 1 swxY w Y   d }|                     |t          |j                             |                     t                    5 } t	          d          |          } ||           ddd           n# 1 swxY w Y   d }|                     |t          |j                             |                     t                    5 } t	          d          |          } ||           ddd           n# 1 swxY w Y   d }|                     |t          |j                             |                     t                    5 } t	          d          |          } |             ddd           n# 1 swxY w Y   d!}|                     |t          |j                             dS )#z3 Tests the large number of use cases defined below c                 N    | dk     r| S  | dz
             | dz
            z   S )Nr;   r   r   )nfib3s    r   r   z4TestInlinedClosure.test_bulk_use_cases.<locals>.fib3   s4    1uu4A;;a!e,,r   c                 $    fd} ||           S )z, Test calling recursive function from inner c                      |           S r   r   )r   r   s    r   re   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer1.<locals>.inner   s    tAwwr   r   )r   re   r   s     r   outer1z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer1   s)        588Or   c                 2    | dz   fd} ||           S )z. Test calling recursive function from closure r   c                      |            z   S r   r   )r   r   r   s    r   re   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer2.<locals>.inner   s    4477{"r   r   )r   re   r   r   s     @r   outer2z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer2   s8    AA# # # # # #588Or   c                 $    fd |           S )z Test recursive inner c                 4    | dk     rdS  | dz
             d S Nr;   r   r   r   rg   s    r   re   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer3.<locals>.inner   s&    q552E!a%LLLLLr   r   rg   s    @r   outer3z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer3   s+    ! ! ! ! !
 588Or   c                 2    | dz   fd |           S )z Test recursive closure r   c                 :    | z   dk     rdS  | dz
             d S r   r   rr   s    r   re   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer4.<locals>.inner   s*    q51992E!a%LLLLLr   r   rr   s    @@r   outer4z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer4   s:    AA! ! ! ! ! !
 588Or   c                 .    | dz   fd} ||           S )z Test nested closure r   c                 <    | z   dz   fd} ||           z   S )Nr;   c                     | z   S r   r   r   r   s    r   inner2zVTestInlinedClosure.test_bulk_use_cases.<locals>.outer5.<locals>.inner1.<locals>.inner2   s    q5Lr   r   )r   r   r   rq   s     @r   inner1zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer5.<locals>.inner1   s>    EAI! ! ! ! ! vayy1}$r   r   r   r   rq   s     @r   outer5z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer5   s5    AA% % % % % 6!99r   c                 .    | dz   fd} ||           S )z. Test closure with list comprehension in body r   c                 F    | z   dz   }d t          |          D             S )Nr;   c                     g | ]}|S r   r   ).0ts     r   
<listcomp>zZTestInlinedClosure.test_bulk_use_cases.<locals>.outer6.<locals>.inner1.<locals>.<listcomp>   s    ,,,a,,,r   r   )r   r   rq   s     r   r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer6.<locals>.inner1   s*    EAI,,588,,,,r   r   r   s     @r   outer6z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer6   s5    AA- - - - - 6!99r   	   c                     | dz   }| |z   z   S )z) Test use of outer scope var, no closure r   r   )r   r   _OUTER_SCOPE_VARs     r   outer7z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer7   s    AAq5+++r   c                 2    | dz   fd} ||           S )z+ Test use of outer scope var, with closure r   c                     | z   z   S r   r   )r   r   r   s    r   re   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer8.<locals>.inner  s    1u///r   r   )r   re   r   r   s     @r   outer8z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer8  s8    AA0 0 0 0 0 0588Or   c                 2    | dz   fd}|} ||           S )z Test closure assignmentr   c                     | z   S r   r   r   s    r   re   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer9.<locals>.inner  rw   r   r   )r   re   fr   s      @r   outer9z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer9
  s7    AA    A1Q44Kr   c                 :    | dz   fdfd} ||           S )z! Test two inner, one calls other r   c                     | z   S r   r   r   s    r   re   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer10.<locals>.inner  rw   r   c                      |           S r   r   rg   s    r   r   zGTestInlinedClosure.test_bulk_use_cases.<locals>.outer10.<locals>.inner2  s    uQxxr   r   )r   r   re   r   s     @@r   outer10z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer10  sO    AA              6!99r   c                     | dz   fd}|S )z return the closure r   c                     | z   S r   r   r   s    r   re   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer11.<locals>.inner#  rw   r   r   r   re   r   s     @r   outer11z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer11  s*    AA    Lr   c                 0    | dz   dfd	} ||           S )z closure with kwargr      c                     | z   |z   S r   r   r   kwr   s     r   re   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer12.<locals>.inner+      1urz!r   r   r   r   s     @r   outer12z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer12'  s7    AA" " " " " "588Or   r   c                     | dz   |z   }|S )z outer with kwarg no closurer   r   r   s      r   outer13z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer13/  s    A
AHr   c                 2    | dz   fd} ||           S )z! outer with kwarg used in closurer   c                     | z   z   S r   r   r   s    r   re   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer14.<locals>.inner8  r   r   r   r   r   re   r   s    ` @r   outer14z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer144  s8    AA" " " " " "588Or   c                 0    | dz   fd} || |          S )z# outer with kwarg as arg to closurer   c                     | z   |z   S r   r   r   s     r   re   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer15.<locals>.inner@  r   r   r   r   s      @r   outer15z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer15<  s5    AA" " " " "5B<<r   c                 H    | dz   fd}t           ||                     S )z( closure is generator, consumed locally r   c              3      K   | z   V  d S r   r   r   s    r   re   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer16.<locals>.innerH        !er   )listr   s     @r   outer16z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer16D  s;    AA     a>>!r   c                 .    | dz   fd} ||           S )z  closure is generator, returned r   c              3      K   | z   V  d S r   r   r   s    r   re   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer17.<locals>.innerQ  r   r   r   r   s     @r   outer17z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer17M  s4    AA     588Or   c                 <    | dz   fd} ||           D ]}|}|S )z( closure is generator, consumed in loop r   c              3      K   | z   V  d S r   r   r   s    r   re   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer18.<locals>.innerZ  r   r   r   )r   re   r   r   r   s       @r   outer18z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer18V  sJ    AA     U1XX  Hr   c                 F    | dz   | dz   fd}fd} |||           S )z# closure as arg to another closure r   r;   c                     | z   S r   r   )r   z1s    r   re   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer19.<locals>.innerg  s    2vr   c                       | |          z   S r   r   )r   r   z2s     r   r   zGTestInlinedClosure.test_bulk_use_cases.<locals>.outer19.<locals>.inner2j  s    qttby r   r   )r   re   r   r   r   s      @@r   outer19z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer19b  s\    QBQB    ! ! ! ! ! 6%###r   c                 .    | dz   fd} ||           S )z Test calling numpy in closure r   c                 2    | t          j                  z   S r   )numpycosr   s    r   re   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer20.<locals>.inners  s    59Q<<''r   r   r   s     @r   outer20z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer20o  s2    AA( ( ( ( (588Or   c                 .    | dz   fd} ||           S )z) Test calling numpy import as in closure r   c                 2    | t          j                  z   S r   )npr   r   s    r   re   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer21.<locals>.inner{  s    26!99}$r   r   r   s     @r   outer21z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer21w  s2    AA% % % % %588Or   c                      d } d} | |  dS )z6Test to ensure that unsupported *args raises correctlyc                     d S r   r   )rJ   bs     r   barzDTestInlinedClosure.test_bulk_use_cases.<locals>.outer22.<locals>.bar  s    r   )r   r;   Nr   )r   r   s     r   outer22z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer22  s%      ACGGGGr   r   Tr,   Nz,Unsupported use of cell variable encounteredz%Cannot capture the non-constant valuez-The use of yield in a closure is unsupported.z,Calling a closure with *args is unsupported.r   )
r   r   assertRaisesNotImplementedErrorr   assertInstr	exceptionr   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   refrk   varraisesmsgr   r   s                                @@r   test_bulk_use_casesz&TestInlinedClosure.test_bulk_use_cases   s    
	- 	- 	- 	- 
	-
	 	 	 	 		 	 	 	 		 	 			 		 			 	 		 	 	 	, 	, 	, 	, 	,
 	 	 	 	 		 	 	
	 
	 
		 	 		 	 		 	 	 	
	 	 	 		  	  	  	 	" 	" 	"	 	 	
	 
	 
		$ 	$ 	$	 	 		 	 		 	 	 VVVVVWgwgw1  	3 	3CIIECUU3ZZS2222 233 	v&C&&&v..EE#JJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 =c3v/00111233 	v&C&&&v..EE#JJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 =c3v/00111{++ 	v&C&&&w//EE#JJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 6c3v/00111/00 	F&C&&&w//EE#JJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 >c3v/00111/00 	F&C&&&w//EE#JJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 >c3v/00111/00 	F&C&&&w//EE#JJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 >c3v/00111/00 	F&C&&&w//EEGGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 =c3v/0011111s~   %D  DD%F  FF%H  HH%J  JJ%L  LL%N  NN$O??PPc                 l   t          t                    d             }|                      |dd          d           |j        |j        d                  j        d         }g }|j                                        D ]j}|j        D ]`}t          |t          j                  rDt          |j        t          j                  r%|j        j        dk    r|                    |           ak|                     t          |          d	           |D ]&}|j        j        }d
}|                     ||           'd S )N)pipeline_classc                 4    d } ||            ||          fS )Nc                     d}d}||z   | z   S )N   r   r   r   s      r   r   zITestInlinedClosure.test_closure_renaming_scheme.<locals>.foo.<locals>.bar  s    1uqy r   r   )rJ   r   r   s      r   fooz<TestInlinedClosure.test_closure_renaming_scheme.<locals>.foo  s-    ! ! ! 3q6633q66>!r   r      )   #   r   preserved_irr   r;   zclosure__locals__bar_v[0-9]+.x)r   r	   r   	overloads
signaturesmetadatablocksvaluesbody
isinstancer   AssignvalueConstappendlentargetnameassertRegex)	r   r   func_irstoreblkstmtr   r  regexs	            r   test_closure_renaming_schemez/TestInlinedClosure.test_closure_renaming_scheme  sL    
5	6	6	6	" 	" 
7	6	" 	Rh/// -q 12;NK>((** 	/ 	/C / /dBI.. /!$*bh77 /:+q00!LL...	/ 	UQ''' 	* 	*A8=D5ET5))))	* 	*r   c                     t           d             t           fd            }t          j                             |            d           d S )Nc                      dd} | S )N皙?c                     | |z   S r   r   rp   s     r   r   z;TestInlinedClosure.test_issue9222.<locals>.foo.<locals>.bar  rf   r   )r  r   )r   s    r   r   z.TestInlinedClosure.test_issue9222.<locals>.foo  s       Jr   c                  *                   d          S rN   r   )r   s   r   consumez2TestInlinedClosure.test_issue9222.<locals>.consume  s    335588Or   gffffff@)r   r   testingassert_allclose)r   r  r   s     @r   test_issue9222z!TestInlinedClosure.test_issue9222  si     
	 	 
	
 
	 	 	 	 
	
 	
""7799g66666r   c                 :    t           d             } |             d S )Nc                      d} t          d          D ]0}t          j        d t          | d          D                        d} 1d S )Nr   r   c                     g | ]}d S )r   r   )r   _s     r   r   zFTestInlinedClosure.test_issue_9577.<locals>._inner.<locals>.<listcomp>  s    ;;;!;;;r   r   )r   r   array)range_startr#  s     r   _innerz2TestInlinedClosure.test_issue_9577.<locals>._inner  sV    K1XX    ;;U;%:%:;;;<<<   r   )r   )r   r&  s     r   test_issue_9577z"TestInlinedClosure.test_issue_9577  s,    		  	  
	  	r   N)r]   r^   r_   __doc__rl   rs   rx   r~   r   r   r  r  r   run_test_in_subprocessr'  r   r   r   ra   ra   a   s         
/ 
/ 
// / // / /5 5 5(/ / /&B2 B2 B2H *  *  *D7 7 7$ $  %$  r   ra   __main__)r   r   unittestnumbar   r   numba.core.errorsr   r   
numba.corer   numba.tests.supportr   r	   r   ra   r]   mainr   r   r   <module>r1     s	                 ; ; ; ; ; ; ; ;       B B B B B B B BR3 R3 R3 R3 R3( R3 R3 R3jV V V V V V V Vr zHMOOOOO r   