
    xKg8                         d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
 d dlmZ  G d de j                        Zedk(  r e j                           yy)	    N)contextmanager)ir)typestypingcallconvcpucgutils)
cpu_targetc                   2    e Zd ZdZed        Zd Zd Zd Zy)TestCompileCachez
    Tests that the caching in BaseContext.compile_internal() works correctly by
    checking the state of the cache when it is used by the CPUContext.
    c              #     K   t         j                  }t         j                  }|j                         j	                  d      }|j                  |      5  t        j                  d      }t        j                  t        j                  t        j                        }|j                  j                  |j                  |j                        }t!        j"                  ||d      }|j                  j%                  |      }|j&                  sJ |j)                  d      }	t        j*                  |	      }
||
||f d d d        y # 1 sw Y   y xY ww)Ntestingtest_moduletest_fnentry)r
   typing_contexttarget_contextcodegencreate_librarypush_code_libraryr   Moduler   	signaturer   int32	call_convget_function_typereturn_typeargsr	   get_or_insert_functionget_argumentsis_declarationappend_basic_block	IRBuilder)selfr   contextlibmodulesig	llvm_fntyfunctionr   entry_blockbuilders              b/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/numba/tests/test_compile_cache.py_context_builder_sig_argsz*TestCompileCache._context_builder_sig_args   s    #22++oo..y9&&s+YY}-F""5;;<C));;COO<?HHFI55fi6?AH$$228<D****"55g>Kll;/G7C-- ,++s   AEC&E9	EEEc                 b   d }d }| j                         5 \  }}}}t        |j                        }| j                  |dz   t        |j                               |j	                  ||||       | j                  |dz   t        |j                               |j	                  ||||       | j                  |dz   t        |j                               |j	                  ||||       | j                  |dz   t        |j                               t        j                  t        j                  t        j                        }|j                  j                  |j                  |j                        }	t        j                  |j                  |	d      }
|j                  j!                  |
      }|
j"                  sJ |
j%                  d      }t'        j(                  |      }|j	                  ||||       | j                  |dz   t        |j                               d d d        y # 1 sw Y   y xY w)	Nc                     d| z  S )N    is    r,   times2z+TestCompileCache.test_cache.<locals>.times2%       Q3J    c                     | dz  S )N   r1   r2   s    r,   times3z+TestCompileCache.test_cache.<locals>.times3(   r5   r6   r      r0   	test_fn_2r   r8   )r-   lencached_internal_funcassertEqualcompile_internalr   r   r   float64r   r   r   r   r	   r   r&   r   r    r!   r   r"   )r#   r4   r9   r$   r+   r'   r   initial_cache_sizesig2
llvm_fnty2	function2args2entry_block2builder2s                 r,   
test_cachezTestCompileCache.test_cache$   s   		 ++- 2
Wc4!$W%A%A!B/!3 !=!=>@ $$Wfc4@/!3 !=!=>@
 $$Wfc4@/!3 !=!=>@
 $$Wfc4@/!3 !=!=>@ ##EMM5==AD **<<T=M=M<@IIGJ66w~~7A;PI%%33I>E++++$77@L||L1H $$XvtUC/!3 !=!=>@M .--s   HH%%H.c                 &   d }| j                         5 \  }}}} |dd      } |dd      } |dd      }t        |j                        }	|j                  ||||      }
| j	                  |	dz   t        |j                               |j                  ||||      }| j	                  |	dz   t        |j                               |j                  ||||      }| j	                  |	dz   t        |j                               ddd       y# 1 sw Y   yxY w)zP
        Caching must not mix up closures reusing the same code object.
        c                     fd}|S )Nc                     | z   S Nr1   )zys    r,   fz?TestCompileCache.test_closures.<locals>.make_closure.<locals>.fY   s    1ur6   r1   )xrN   rO   s    ` r,   make_closurez4TestCompileCache.test_closures.<locals>.make_closureX   s    Hr6   r:   r0   N)r-   r<   r=   r?   r>   )r#   rQ   r$   r+   r'   r   clo11clo12clo22rA   res1res2res3s                r,   test_closureszTestCompileCache.test_closuresT   s   	
 ++- 2
Wc4 !A&E A&E A&E!$W%A%A!B++GUCFD/!3 !=!=>@++GUCFD/!3 !=!=>@ ++GUCFD/!3 !=!=>@! .--s   C*DDc                 4   d t        j                  t        j                  t        j                        fd}| j	                         5 \  }}}t        j                  d|      }t        j                  d|      }|j                  |      }|j                  |      }|j                  |      }	t        |j                        }
| j                  |
dz   t        |j                                ||       | j                  |
dz   t        |j                                ||       | j                  |
dz   t        |j                                ||	       | j                  |
dz   t        |j                               d	d	d	       y	# 1 sw Y   y	xY w)
zA
        Caching must not mix up different error models.
        c                     d| z  S )Ng      ?r1   )rP   s    r,   invz.TestCompileCache.test_error_model.<locals>.invt   s    7Nr6   c                 *    | j                        S rL   )compile_subroutine)r$   r+   r[   inv_sigs    r,   compile_invz6TestCompileCache.test_error_model.<locals>.compile_invy   s    --gsGDDr6   pythonnumpy)error_modelr   r:   r0   N)r   r   r   r@   r-   r   create_error_model	subtargetr<   r=   r>   )r#   r_   r$   r'   r   py_error_modelnp_error_modelpy_context1py_context2
np_contextrA   r+   r[   r^   s              @@@r,   test_error_modelz!TestCompileCache.test_error_modelp   sr   	 ""5==%--@	E ++- 2
Wc4%887KN%88'JN!+++GK!+++GK **~*FJ!$W%A%A!B /!3 !=!=>@ $/!3 !=!=>@$/!3 !=!=>@ 
#/!3 !=!=>@1 .--s   D5FFN)	__name__
__module____qualname____doc__r   r-   rH   rX   rj   r1   r6   r,   r   r   
   s.    
 . .&.@`@8%@r6   r   __main__)unittest
contextlibr   llvmliter   
numba.corer   r   r   r   r	   numba.core.registryr
   TestCaser   rk   mainr1   r6   r,   <module>rw      sH     %  < < *K@x(( K@\ zHMMO r6   