o
    ¦¸¢ir°  ã                   @   s®  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZ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mZ d dlZd dlm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  d dl!m"Z" d d	l#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d d
l.m/Z/ zd dl0Z0W n e1y›   dZ0Y nw dd„ Z2e2ƒ Z3dZ4e	 5e3e4¡Z6dd„ Z7dd„ Z8dd„ Z9dd„ Z:dd„ Z;dd„ Z<G dd„ de$e%ƒZ=dd„ Z>G dd„ de%ƒZ?G d d!„ d!e?ƒZ@G d"d#„ d#e@ƒZAG d$d%„ d%e@ƒZBG d&d'„ d'e@ƒZCe+G d(d)„ d)e@ƒƒZDG d*d+„ d+e@ƒZEG d,d-„ d-e?ƒZFe*G d.d/„ d/e	j%ƒƒZGd0d1„ ZHG d2d3„ d3e	j%ƒZIG d4d5„ d5e?ƒZJG d6d7„ d7eƒZKG d8d9„ d9e%ƒZLG d:d;„ d;e%ƒZMeNd<krUe	 O¡  dS dS )=é    N)ÚPath)Úfloor)Únjit)Úcodegen)ÚUserWideCacheLocatorÚZipCacheLocatorÚFunctionCacheÚInTreeCacheLocatorÚInTreeCacheLocatorFsAgnostic)ÚNumbaWarning)Úparfor)
ÚSerialMixinÚTestCaseÚcapture_cache_logÚimport_dynamicÚoverride_configÚrun_in_new_process_cachingÚskip_if_typeguardÚskip_parfors_unsupportedÚtemp_directoryÚoverride_env_config)Ú
cpu_targetc               
   C   s  t dƒ} tj | d¡}t |¡ ttj |d¡dƒ}| d¡ W d   ƒ n1 s*w   Y  t |d¡ zEz.ttj |d¡dƒ}| d¡ W d   ƒ n1 sQw   Y  W W t |d	¡ t 	|¡ d
S  t
yz   Y W t |d	¡ t 	|¡ dS w t |d	¡ t 	|¡ w )NÚ
test_cacheÚwritable_testÚwrite_okÚwtÚcheck1é@  Úwrite_forbiddenÚcheck2iý  FT)r   ÚosÚpathÚjoinÚmkdirÚopenÚwriteÚchmodÚshutilÚrmtreeÚPermissionError)ÚtempdirÚtest_dirÚf© r-   úV/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/numba/tests/test_caching.pyÚcheck_access_is_preventable3   s*   
ÿÿ	÷÷r/   z9Cannot create a directory to which writes are preventablec                  C   s   d} t | ƒ| fS )NÚabcd)Úhash)Úcr-   r-   r.   Úconstant_unicode_cacheW   s   r3   c                  C   sB   t } tdd| ƒ}| ƒ \}}|ƒ \}}||ksJ ‚||ksJ ‚d S ©NT©Úcache)r3   r   )ÚpyfuncÚcfuncÚexp_hvÚexp_strÚgot_hvÚgot_strr-   r-   r.   Úcheck_constant_unicode_cache\   s   

r=   c                   C   s
   dddœS )Né   é   )ÚaÚbr-   r-   r-   r-   r.   Ú
dict_cachee   s   
rB   c                  C   s.   t } tdd| ƒ}| ƒ }|ƒ }||ksJ ‚d S r4   )rB   r   ©r7   r8   ÚexpÚgotr-   r-   r.   Úcheck_dict_cachei   s
   rF   c                  c   s    dD ]} | V  qd S )N)r>   r?   é   r-   )Úvr-   r-   r.   Úgenerator_cacheq   s   €ÿrI   c                  C   s6   t } tdd| ƒ}t| ƒ ƒ}t|ƒ ƒ}||ksJ ‚d S r4   )rI   r   ÚlistrC   r-   r-   r.   Úcheck_generator_cachev   s
   

rK   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestCachingc                 C   s"   |ƒ  t |ƒ}|  |d d¡ d S )NÚexitcoder   )r   ÚassertEqual)ÚselfÚfuncÚresr-   r-   r.   Úrun_test   s   zTestCaching.run_testc                 C   ó   |   t¡ d S ©N)rR   r=   ©rO   r-   r-   r.   Útest_constant_unicode_cache„   ó   z'TestCaching.test_constant_unicode_cachec                 C   rS   rT   )rR   rF   rU   r-   r-   r.   Útest_dict_cache‡   rW   zTestCaching.test_dict_cachec                 C   rS   rT   )rR   rK   rU   r-   r-   r.   Útest_generator_cacheŠ   rW   z TestCaching.test_generator_cachec                 C   s¸   t | jjƒ}t ¡ }| ¡ }|jt||dfd}| ¡  | 	¡  | 
¡ \}}|s-|  |¡ |  |dd¡ |jt||dfd}| ¡  | 	¡  | 
¡ \}}|sS|  |¡ |  |dd¡ d S )NF©ÚtargetÚargséè  z-Omitted function returned an incorrect outputT)r   Ú	__class__Ú__name__ÚmultiprocessingÚget_contextÚQueueÚProcessÚomitted_child_test_wrapperÚstartr"   ÚgetÚfailrN   )rO   Ú	cache_dirÚctxÚresult_queueÚprocÚsuccessÚoutputr-   r-   r.   Útest_omitted   s>   þ
ýþ
ýzTestCaching.test_omittedN)r_   Ú
__module__Ú__qualname__rR   rV   rX   rY   rn   r-   r-   r-   r.   rL   ~   s    rL   c                 C   sì   t d|ƒg tddddd„ƒ}zB|ƒ }|r3|j|jd  dks$J d	ƒ‚|j|jd  dks2J d
ƒ‚n|j|jd  dksAJ dƒ‚|j|jd  dksOJ dƒ‚d}W n
   t ¡ }d}Y |  ||f¡ W d   ƒ d S 1 sow   Y  d S )NÚ	CACHE_DIRTr5   r]   c                 S   s   | S rT   r-   )Únumr-   r-   r.   Útestº   s   z(omitted_child_test_wrapper.<locals>.testr   r>   zCache did not hit as expectedzCache has an unexpected misszCache did not miss as expectedzCache has an unexpected hitF)r]   )r   r   Ú_cache_hitsÚ
signaturesÚ_cache_missesÚ	tracebackÚ
format_excÚput)rj   rh   Úsecond_callrs   rm   rl   r-   r-   r.   rd   ¸   s0   ÿÿÿÿ"èrd   c                   @   sL   e Zd ZdZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ ZdS )ÚBaseCacheTestNc                 C   st   t dƒ| _tj d| j¡ tj | j| jd ¡| _tj | jd¡| _	t
 | j| j¡ t | jtjtjB ¡ d | _d S )Nr   r   z.pyÚ__pycache__)r   r*   Úsysr!   Úinsertr    r"   ÚmodnameÚmodfilerh   r'   ÚcopyÚusecases_filer&   ÚstatÚS_IREADÚS_IWRITEÚmaxDiffrU   r-   r-   r.   ÚsetUpÚ   s   

zBaseCacheTest.setUpc                 C   s"   t j | jd ¡ t j | j¡ d S rT   )r}   ÚmodulesÚpopr   r!   Úremover*   rU   r-   r-   r.   ÚtearDownã   s   zBaseCacheTest.tearDownc              	   C   sn   t j | jd ¡}|d ur%|jg}|D ]}zt |¡ W q ty$   Y qw t| jƒ}|  	|j
 d¡| j¡ |S )NÚco)r}   rˆ   r‰   r   Ú
__cached__r    ÚunlinkÚFileNotFoundErrorr   rN   Ú__file__Úrstripr€   )rO   ÚoldÚcachedÚfnÚmodr-   r-   r.   Úimport_moduleç   s   ÿ
zBaseCacheTest.import_modulec                 C   s0   zdd„ t  | j¡D ƒW S  ty   g  Y S w )Nc                 S   s   g | ]	}|  d ¡s|‘qS ))z.pycz.pyo)Úendswith©Ú.0r”   r-   r-   r.   Ú
<listcomp>ú   s    
ÿz0BaseCacheTest.cache_contents.<locals>.<listcomp>)r    Úlistdirrh   r   rU   r-   r-   r.   Úcache_contentsø   s
   ÿzBaseCacheTest.cache_contentsc                    s   t ‡ fdd„tˆ  ¡ ƒD ƒƒS )Nc                 3   s,    | ]}|t j t j ˆ j|¡¡fV  qd S rT   )r    r!   Úgetmtimer"   rh   r˜   rU   r-   r.   Ú	<genexpr>   s   € $ÿz1BaseCacheTest.get_cache_mtimes.<locals>.<genexpr>)ÚdictÚsortedrœ   rU   r-   rU   r.   Úget_cache_mtimesÿ   s   
ÿzBaseCacheTest.get_cache_mtimesc                 C   s   |   ¡ }|  t|ƒ||¡ d S rT   )rœ   rN   Úlen)rO   Únr2   r-   r-   r.   Úcheck_pycache  s   zBaseCacheTest.check_pycachec                 C   ó   d S rT   r-   rU   r-   r-   r.   Ú
dummy_test  ó   zBaseCacheTest.dummy_test)r_   ro   rp   r‚   r   r‡   r‹   r–   rœ   r¡   r¤   r¦   r-   r-   r-   r.   r{   Ô   s    	r{   c                   @   sB   e Zd Zej e¡Zej ed¡Z	dZ
ddœdd„Zd	dd„ZdS )
ÚDispatcherCacheUsecasesTestúcache_usecases.pyÚdispatcher_caching_test_fodderN©Úenvvarsc                C   sˆ   |d u ri }dt | j| jd }tj ¡ }| |¡ tjt	j
d|gtjtj|d}| ¡ \}}|jdkrBtd|j| ¡ | ¡ f ƒ‚d S )Nzœif 1:
            import sys

            sys.path.insert(0, %(tempdir)r)
            mod = __import__(%(modname)r)
            mod.self_test()
            ©r*   r   ú-c)ÚstdoutÚstderrÚenvr   zBprocess failed with code %s: 
stdout follows
%s
stderr follows
%s
)rŸ   r*   r   r    Úenvironr   ÚupdateÚ
subprocessÚPopenr}   Ú
executableÚPIPEÚcommunicateÚ
returncodeÚAssertionErrorÚdecode)rO   r¬   ÚcodeÚsubp_envÚpopenÚoutÚerrr-   r-   r.   Úrun_in_separate_process  s&   ú

þ
ýÿÿz3DispatcherCacheUsecasesTest.run_in_separate_processc                 C   sJ   |j }|  t|j ¡ ƒ||j¡ |d ur#|  t|j ¡ ƒ||j¡ d S d S rT   )ÚstatsrN   ÚsumÚ
cache_hitsÚvaluesÚcache_misses)rO   rP   ÚhitsÚmissesÚstr-   r-   r.   Ú
check_hits,  s   ÿÿz&DispatcherCacheUsecasesTest.check_hitsrT   )r_   ro   rp   r    r!   Údirnamer   Úherer"   r‚   r   rÁ   rÊ   r-   r-   r-   r.   r¨     s    r¨   c                   @   sö   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zee ejd!kd"¡d#d$„ ƒƒZee ejd!kd"¡d%d&„ ƒƒZd'd(„ Ze ed)u prejd* d+k d,¡d-d.„ ƒZd)S )/Ú	TestCachec                 C   s  |   d¡ |  ¡ }|   d¡ |j}|  |ddƒd¡ |   d¡ |  |ddƒd¡ |   d¡ |  |dd¡ |j}|  |ddƒd¡ |   d¡ |  |ddƒd¡ |   d¡ |  |dd¡ |j}||jdƒ}|  t|ƒd	¡ ||j	dƒ}|  t|ƒd	¡ |   d
¡ |  |dd¡ |  
¡  d S )Nr   r?   rG   é   ç      @ç      @é   r>   )r?   g     ÀE@é	   )r¤   r–   Úadd_usecaseÚassertPreciseEqualrÊ   Úadd_objmode_usecaseÚrecord_returnÚaligned_arrÚtupleÚ
packed_arrrÁ   )rO   r•   r,   Úrecr-   r-   r.   Útest_caching6  s.   






zTestCache.test_cachingc                 C   s€   |   d¡ |  ¡ }|   d¡ |j}|  |ddƒd¡ |   d¡ |  |dt d¡ƒdt d¡ d ¡ |   d¡ |  |dd¡ d S )Nr   r?   rG   rÎ   r>   )r¤   r–   rÓ   rÔ   ÚnpÚarangerÊ   ©rO   r•   r,   r-   r-   r.   Útest_caching_nrt_prunedT  s   


&
z!TestCache.test_caching_nrt_prunedc                 C   s´   |   ¡ }|  | dd¡d¡ |  d¡ |j}|  |ddƒd¡ |  d¡ |   ¡ }|j}|  |ddƒd¡ |  d¡ |j}|  |ddƒd¡ |  d¡ |  |ddƒd¡ |  d¡ d S )NrG   r?   rÎ   é   ç      @rÏ   )r–   rÔ   Úinnerr¤   Úouter_uncachedÚouterrÞ   r-   r-   r.   Útest_inner_then_outera  s   



zTestCache.test_inner_then_outerc                 C   sŽ   |   ¡ }|  | dd¡d¡ |  d¡ |  | dd¡d¡ |  d¡ |   ¡ }|j}|  |ddƒd¡ |  d¡ |  |ddƒd¡ |  d¡ d S )NrG   r?   rà   rÎ   rá   rÐ   rÑ   )r–   rÔ   rä   r¤   rã   râ   rÞ   r-   r-   r.   Útest_outer_then_inneru  s   


zTestCache.test_outer_then_innerc                 C   s.   |   ¡ }|j}|  |ddƒd¡ |  d¡ d S )Nr?   rG   rÎ   r   )r–   Úadd_nocache_usecaserÔ   r¤   rÞ   r-   r-   r.   Útest_no_cachingƒ  s   zTestCache.test_no_cachingc                 C   sŠ   |   ¡ }tjdd}t dt¡ |j}|  |dƒd¡ |  d¡ W d   ƒ n1 s+w   Y  |  t	|ƒd¡ |  
dt|d jƒ¡ d S )	NT©ÚrecordÚalwaysrà   rÎ   r   r>   zBCannot cache compiled function "looplifted" as it uses lifted code)r–   ÚwarningsÚcatch_warningsÚsimplefilterr   Ú
loopliftedrÔ   r¤   rN   r¢   ÚassertInÚstrÚmessage©rO   r•   Úwr,   r-   r-   r.   Útest_loopliftedŠ  s   ûÿzTestCache.test_loopliftedc                 C   sŒ   |   ¡ }tjdd}t dt¡ |j}tj |ƒ |j	¡ |  
d¡ W d   ƒ n1 s,w   Y  |  t|ƒd¡ |  dt|d jƒ¡ d S )NTré   rë   r   r>   zICannot cache compiled function "use_big_array" as it uses dynamic globals)r–   rì   rí   rî   r   Úuse_big_arrayrÜ   ÚtestingÚassert_equalÚbiggier¤   rN   r¢   rð   rñ   rò   ró   r-   r-   r.   Útest_big_array™  s   ûÿzTestCache.test_big_arrayc              	   C   s¢   |   ¡ }|j|j|jfD ]B}tjdd}t dt¡ |  |dƒd¡ |  	d¡ W d   ƒ n1 s2w   Y  |  
t|ƒd¡ |  d |j¡t|d jƒ¡ qd S )NTré   rë   g        r   r>   z#Cannot cache compiled function "{}")r–   Ú	use_c_sinÚuse_c_sin_nest1Úuse_c_sin_nest2rì   rí   rî   r   rÔ   r¤   rN   r¢   rð   Úformatr_   rñ   rò   )rO   r•   r,   rô   r-   r-   r.   Útest_ctypes§  s   ü
þøzTestCache.test_ctypesc                 C   s¤   |   ¡ }t ¡ @ t dt¡ |j}|  |dƒd¡ |j}|  |dƒd¡ |j}|  |dƒd¡ |j	}|  |dƒd¡ |  
d¡ W d   ƒ d S 1 sKw   Y  d S )NÚerrorrG   rÎ   é   é
   é   rÑ   )r–   rì   rí   rî   r   Úclosure1rÔ   Úclosure2Úclosure3Úclosure4r¤   rÞ   r-   r-   r.   Útest_closure¹  s   
"õzTestCache.test_closurec                 C   sl   |   ¡ }|j}|  ||jdƒd¡ |  ||jdƒd¡ |  ||jdƒd¡ |  ||jdƒd¡ |  d¡ d S )Nr>   r  éd   r?   é   é   )r–   Úfirst_class_function_usecaserN   Úfirst_class_function_mulÚfirst_class_function_addr¤   rÞ   r-   r-   r.   Útest_first_class_functionÉ  s   z#TestCache.test_first_class_functionc                 C   s  |   ¡ }| dd¡ | dd¡ | dd¡ | dd¡ | dd¡ | |jd¡ | |jd¡ |  ¡ }|  	|jdd¡ |   ¡ }|  
||¡ |j}|ddƒ |  	|dd¡ |ddƒ |  	|dd¡ |j}|ddƒ |  	|dd¡ |  |  ¡ |¡ |  ¡  |  |  ¡ |¡ d S )Nr?   rG   rÏ   rá   r   r>   )r–   rÓ   rÕ   rã   rä   rÖ   rÙ   r×   r¡   rÊ   ÚassertIsNotrN   rÁ   )rO   r•   ÚmtimesÚmod2r,   r-   r-   r.   Útest_cache_reuseÔ  s.   


zTestCache.test_cache_reusec                 C   s’   |   ¡ }|j}|  |ddƒd¡ t| jdƒ}| d¡ W d   ƒ n1 s&w   Y  |   ¡ }|j}|  |ddƒd¡ |j}|  |ddƒd¡ d S )Nr?   rG   rÎ   r@   z
Z = 10
é   )r–   rÓ   rÔ   r$   r€   r%   rÕ   rÞ   r-   r-   r.   Útest_cache_invalidateò  s   ÿzTestCache.test_cache_invalidatec                 C   s„   |   ¡ }|j}|  |ddƒd¡ |   ¡ }|j}d|_|  |ddƒd¡ | ¡  |  |ddƒd¡ |   ¡ }|j}|  |ddƒd¡ d S )Nr?   rG   rÎ   r  r  )r–   rÓ   rÔ   ÚZÚ	recompilerÞ   r-   r-   r.   Útest_recompile  s   zTestCache.test_recompilec                 C   s8   |   ¡ }|j}|  |dƒd¡ |j}|  |dƒd¡ d S )Nr?   rà   r  )r–   Úrenamed_function1rÔ   Úrenamed_function2rÞ   r-   r-   r.   Útest_same_names  s
   zTestCache.test_same_namesc                 C   s€   ddl m} |j}tdddƒ}z*||_t |¡}t ||¡}|  |¡ dt	_
t ||¡}|  |t¡ W ||_t	`
d S ||_t	`
w )Nr>   ©ÚfunctionÚpassztests/dummy_module.pyÚexecT)Údummy_moduler  Ú__code__ÚcompileÚinspectÚgetfiler   Úfrom_functionÚassertIsNoner}   ÚfrozenÚassertIsInstance)rO   r  Úold_codeÚcode_objÚsourceÚlocatorr-   r-   r.   Útest_frozen  s   

ÿzTestCache.test_frozenc                 C   s€   |   ¡ }|j}| jtj|jjdd |  |ddƒd¡ |  |dd¡ |   ¡ }|j}|  |ddƒd¡ |  |dd¡ |  	d¡ dS )	zy
        With a disabled __pycache__, test there is a working fallback
        (e.g. on the user-wide cache dir)
        T)Úignore_errorsr?   rG   rÎ   r   r>   N)
r–   rÓ   Ú
addCleanupr'   r(   rÂ   Ú
cache_pathrÔ   rÊ   r¤   )rO   r•   r,   r  r-   r-   r.   Ú_test_pycache_fallback2  s   z TestCache._test_pycache_fallbackÚntz3cannot easily make a directory read-only on Windowsc                 C   s:   t  | j¡j}t  | jd¡ |  t j| j|¡ |  ¡  d S )Nr   )r    rƒ   r*   Úst_moder&   r/  r1  )rO   Ú	old_permsr-   r-   r.   Útest_non_creatable_pycacheK  s   z$TestCache.test_non_creatable_pycachec                 C   sN   t j | jd¡}t  |¡ t  |¡j}t  |d¡ |  t j||¡ |  	¡  d S )Nr|   r   )
r    r!   r"   r*   r#   rƒ   r3  r&   r/  r1  )rO   Úpycacher4  r-   r-   r.   Útest_non_writable_pycacheV  s   
z#TestCache.test_non_writable_pycachec              
      sä   t jddg‰ ˆ g d¢7 ‰ z
t ˆ dg ¡}W n tjy1 } zˆ d|j ¡ W Y d }~nd }~ww | ¡  ¡ }t	j
 ˆjd¡‰tˆdƒ}| d¡ W d   ƒ n1 sUw   Y  ‡ ‡‡fd	d
„}|ƒ  |ƒ }ˆ d| ¡ ¡ d S )Nú-mÚIPython©z--quietz--quickz--no-bannerz--colors=NoColorú	--versionú%ipython not available: return code %dzipython_cache_usecase.txtrô   á}  
                import os
                import sys

                from numba import jit

                # IPython 5 does not support multiline input if stdin isn't
                # a tty (https://github.com/ipython/ipython/issues/9752)
                f = jit(cache=True)(lambda: 42)

                res = f()
                # IPython writes on stdout, so use stderr instead
                sys.stderr.write(u"cache hits = %d\n" % f.stats.cache_hits[()])

                # IPython hijacks sys.exit(), bypass it
                sys.stdout.flush()
                sys.stderr.flush()
                os._exit(res)
                c                     óv   t ˆdƒ,} tjˆ | tjtjdd}| ¡ \}}|jdkr(ˆ d|j||f ¡ |W  d   ƒ S 1 s4w   Y  d S ©NÚrbT)Ústdinr¯   r°   Úuniversal_newlinesé*   z6unexpected return code %d
-- stdout:
%s
-- stderr:
%s
©r$   r´   rµ   r·   r¸   r¹   rg   ©rA  Úpr¿   rÀ   ©Úbase_cmdÚinputfnrO   r-   r.   Úexecute_with_input„  ó   ý

ý$õz2TestCache.test_ipython.<locals>.execute_with_inputúcache hits = 1)r}   r¶   r´   Úcheck_outputÚCalledProcessErrorÚskipTestr¹   Ústripr»   r    r!   r"   r*   r$   r%   rð   )rO   ÚverÚer,   rJ  rÀ   r-   rG  r.   Útest_ipythonc  s&   ÿ€ÿÿzTestCache.test_ipythonNr   rÎ   zrequires ipykernel >= 6c              
      sè   t jddg‰ ˆ g d¢7 ‰ z
t ˆ dg ¡}W n tjy1 } zˆ d|j ¡ W Y d }~nd }~ww | ¡  ¡ }ddl	m
} | ¡ ‰tˆdƒ}| d	¡ W d   ƒ n1 sWw   Y  ‡ ‡‡fd
d„}|ƒ  |ƒ }ˆ d| ¡ ¡ d S )Nr8  r9  r:  r;  r<  r   )Úcompilerrô   r=  c                     r>  r?  rD  rE  rG  r-   r.   rJ  ½  rK  z4TestCache.test_ipykernel.<locals>.execute_with_inputrL  )r}   r¶   r´   rM  rN  rO  r¹   rP  r»   Ú	ipykernelrT  Úget_tmp_directoryr$   r%   rð   )rO   rQ  rR  rT  r,   rJ  rÀ   r-   rG  r.   Útest_ipykernel˜  s(   ÿ€ÿÿzTestCache.test_ipykernel)r_   ro   rp   rÛ   rß   rå   ræ   rè   rõ   rú   rÿ   r  r  r  r  r  r  r-  r1  Úskip_bad_accessÚunittestÚskipIfr    Únamer5  r7  rS  rU  Úversion_inforW  r-   r-   r-   r.   rÍ   4  s@    ÿÿ
5ÿrÍ   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚTestCacheZipc                    sv   t ƒ  ¡  d}d}d}tj | j|¡}t |d¡}| ||¡ W d   ƒ n1 s*w   Y  t	j 
d|¡ d| _d S )NzI
from numba import jit

@jit(cache=True)
def add(x, y):
    return x + y
ztest_module.pyztest_archive.ziprô   r   Útest_module)Úsuperr‡   r    r!   r"   r*   ÚzipfileÚZipFileÚwritestrr}   r~   r   )rO   Úmod_contentÚmod_filenameÚzip_filenameÚzip_pathÚzf©r^   r-   r.   r‡   Ô  s   
ÿ
zTestCacheZip.setUpc                 C   s   t j d¡ t j dd ¡ d S )Nr   r^  )r}   r!   r‰   rˆ   rU   r-   r-   r.   r‹   ë  s   zTestCacheZip.tearDownc                 C   s€   dd l }| dd¡}|  |d¡ |  |jdd¡ |  |jd¡ tjd= t ¡  dd l }| dd¡}|  |d¡ |  |jd¡ d S )Nr   r?   rG   rÑ   r>   r^  )r^  ÚaddrN   rÊ   r}   rˆ   Ú	importlibÚinvalidate_caches)rO   r^  Úresult1Úresult2r-   r-   r.   Útest_zip_cachingñ  s   zTestCacheZip.test_zip_caching)r_   ro   rp   r‡   r‹   rn  Ú__classcell__r-   r-   rh  r.   r]  Ò  s    r]  c                   @   ó    e Zd ZdZdd„ Zdd„ ZdS )ÚTestCacheZipLibzR
    ZipCache tests that don't require the setup/teardown from `TestCacheZip`
    c                 C   sJ   dd„ }d}t  ||¡}|  |¡ |  |jttdƒƒ¡ |  |jd¡ d S )Nc                   S   r¥   rT   r-   r-   r-   r-   r.   Ú	mock_func  r§   z<TestCacheZipLib.test_zip_locator_creation.<locals>.mock_funcz/path/to/archive.zip/module.pyz/path/to/archive.zipz	module.py)r   r%  ÚassertIsNotNonerN   Ú	_zip_pathrñ   r   Ú_internal_path)rO   rr  rf  r,  r-   r-   r.   Útest_zip_locator_creation  s   
z)TestCacheZipLib.test_zip_locator_creationc                 C   s&   dd„ }d}t  ||¡}|  |¡ d S )Nc                   S   r¥   rT   r-   r-   r-   r-   r.   rr    r§   z@TestCacheZipLib.test_zip_locator_non_zip_path.<locals>.mock_funcz/path/to/module.py)r   r%  r&  )rO   rr  Únon_zip_pathr,  r-   r-   r.   Útest_zip_locator_non_zip_path  s   z-TestCacheZipLib.test_zip_locator_non_zip_pathN)r_   ro   rp   Ú__doc__rv  rx  r-   r-   r-   r.   rq    s    rq  c                       s0   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚTestSequentialParForsCachec                    ó   t t| ƒ ¡  dt_d S )NT)r_  rz  r‡   r   Úsequential_parfor_loweringrU   rh  r-   r.   r‡   *  ó   
z TestSequentialParForsCache.setUpc                    r{  )NF)r_  rz  r‹   r   r|  rU   rh  r-   r.   r‹   /  r}  z#TestSequentialParForsCache.tearDownc                 C   sj   |   ¡ }|  d¡ |j}t d¡}|  ||ƒ|| | ¡ dd„ |j ¡ D ƒ}|  |dg¡ |  d¡ d S )Nr   r  c                 S   s   g | ]}|j j‘qS r-   )ÚlibraryÚhas_dynamic_globals)r™   Úcresr-   r-   r.   rš   :  s    ÿz;TestSequentialParForsCache.test_caching.<locals>.<listcomp>Fr?   )	r–   r¤   Úparfor_usecaserÜ   ÚonesrÔ   Ú	overloadsrÅ   rN   )rO   r•   r,   ÚaryÚdynamic_globalsr-   r-   r.   rÛ   4  s   

ÿz'TestSequentialParForsCache.test_caching)r_   ro   rp   r‡   r‹   rÛ   ro  r-   r-   rh  r.   rz  (  s    rz  c                   @   s<   e Zd ZdZdd„ Ze e ¡ dkd¡dd„ ƒZ	dd	„ Z
d
S )ÚTestCacheWithCpuSettingFc                 C   sN   d}|   ¡  ¡ D ]\}}||v r|  ||| ¡ |d7 }q| j|ddd d S )Nr   r>   znothing to compare©Úmsg)r¡   ÚitemsÚassertGreaterEqualÚassertGreater)rO   Ú
mtimes_oldÚmatch_countÚkrH   r-   r-   r.   Úcheck_later_mtimesD  s   €
ÿz*TestCacheWithCpuSetting.check_later_mtimesÚgenericzLLVM detected 'generic' CPUc                 C   s  |   d¡ | jt ¡ ddœd |  ¡ }t|  ¡ ƒ}| jdddœd |  |¡ |  t|  ¡ ƒ|¡ |  	¡ }|j
j}|j}| ¡ }|  t|ƒd¡ | ¡ \}}|d d dkr]||}	}
n||}
}	|  |
d d t ¡ ¡ |  |
d d d¡ |  |	d d d¡ |  |	d d d¡ d S )Nr   Ú )ÚNUMBA_CPU_NAMEÚNUMBA_CPU_FEATURESr«   r  r?   r>   )r¤   rÁ   ÚllÚget_host_cpu_namer¡   r¢   rœ   r  r‹  r–   rÓ   Ú_cacheÚ_cache_fileÚ_load_indexrN   Úkeys)rO   r  Ú
cache_sizer•   r6   Ú
cache_fileÚcache_indexÚkey_aÚkey_bÚkey_genericÚkey_hostr-   r-   r.   Útest_user_set_cpu_nameM  s6   
ÿÿ
þ

z.TestCacheWithCpuSetting.test_user_set_cpu_namec                 C   s:  |   d¡ tj ¡ }t ¡ }| jd|id t|  ¡ ƒ}|  ¡ }d}|  	||¡ | jd|id |  
|¡ |  t|  ¡ ƒ|¡ |  ¡ }|jj}|j}| ¡ }	|  t|	ƒd¡ |	 ¡ \}
}|
d d |krj|
|}}n|
|}}|  |d d | ¡ ¡ |  |d d |¡ |  |d d | ¡ ¡ |  |d d |¡ d S )Nr   r“  r«   z	-sse;-avxr?   r>   )r¤   r   Útarget_contextr   Úget_host_cpu_featuresrÁ   r¢   rœ   r¡   ÚassertNotEqualr  r‹  r–   rÓ   r–  r—  r˜  rN   r™  Ú_get_host_cpu_name)rO   Úcpu_codegenÚsystem_featuresrš  r  Úmy_cpu_featuresr•   r6   r›  rœ  r  rž  Úkey_modifiedr   r-   r-   r.   Útest_user_set_cpu_featuresr  s8   

ÿÿ

z2TestCacheWithCpuSetting.test_user_set_cpu_featuresN)r_   ro   rp   Ú_numba_parallel_test_r  rY  rZ  r”  r•  r¡  rª  r-   r-   r-   r.   r†  @  s    	ÿ
#r†  c                   @   s6   e Zd ZdZej e¡Zej 	ed¡Z
dZdd„ ZdS )ÚTestMultiprocessCacheFr©   rª   c                 C   sŠ   |   ¡ }|j}d}zt d¡}W n ty   t}Y nw | |¡}zt| |t|ƒ¡ƒ}W | 	¡  n| 	¡  w |  
|||d  d ¡ d S )NrG   Úspawnr>   r?   )r–   Úsimple_usecase_callerr`   ra   ÚAttributeErrorÚPoolrÃ   ÚimapÚrangeÚcloserN   )rO   r•   r,   r£   ri   ÚpoolrQ   r-   r-   r.   Útest_multiprocessing¦  s   ÿ
z*TestMultiprocessCache.test_multiprocessingN)r_   ro   rp   r«  r    r!   rË   r   rÌ   r"   r‚   r   rµ  r-   r-   r-   r.   r¬  œ  s    r¬  c                   @   sx   e Zd ZdZej e¡Zej 	ed¡Z
dZdZdZdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Ze eedƒd¡dd„ ƒZdS )ÚTestCacheFileCollisionFr©   Úcaching_file_loc_fodderzD
from numba import njit
@njit(cache=True)
def bar():
    return 123
zD
from numba import njit
@njit(cache=True)
def bar():
    return 321
c                 C   sð   t dƒ| _tj d| j¡ d| _|  | jtj¡ | j| _d 	| jdg¡| _
tj 	| j| j¡}t |¡ ttj 	|d¡dƒ}t| j|d W d   ƒ n1 sOw   Y  ttj 	|d	¡dƒ}t| j|d W d   ƒ d S 1 sqw   Y  d S )
NÚtest_cache_file_locr   Úmodule_name_that_is_unlikelyÚ.Úfooz__init__.pyrô   ©Úfilezfoo.py)r   r*   r}   r!   r~   r   ÚassertNotInrˆ   Úmodname_bar1r"   Úmodname_bar2r    r#   r$   ÚprintÚsource_text_1Úsource_text_2)rO   ÚfoomodÚfoutr-   r-   r.   r‡   Í  s   

ÿ"ÿzTestCacheFileCollision.setUpc                 C   s2   t j | jd ¡ t j | jd ¡ t j | j¡ d S rT   )r}   rˆ   r‰   r¿  rÀ  r!   rŠ   r*   rU   r-   r-   r.   r‹   Û  s   zTestCacheFileCollision.tearDownc                 C   ó   t | jƒjS rT   )r   r¿  ÚbarrU   r-   r-   r.   Úimport_bar1à  ó   z"TestCacheFileCollision.import_bar1c                 C   rÆ  rT   )r   rÀ  rÇ  rU   r-   r-   r.   Úimport_bar2ã  rÉ  z"TestCacheFileCollision.import_bar2c                 C   sT   |   ¡ }|  ¡ }|jjj}|jjj}|  ||¡ |  | d¡¡ |  | d¡¡ d S )Nz__init__.bar-3.pyzfoo.bar-3.py)rÈ  rÊ  r–  r—  Ú_index_namer¤  Ú
assertTrueÚ
startswith)rO   Úbar1Úbar2Úidxname1Úidxname2r-   r-   r.   Útest_file_locationæ  s   

z)TestCacheFileCollision.test_file_locationra   z)Test requires multiprocessing.get_contextc                 C   s>  |   ¡ }|  ¡ }tƒ }|ƒ }W d   ƒ n1 sw   Y  | ¡ }|  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ tƒ }|ƒ }W d   ƒ n1 sWw   Y  | ¡ }|  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  ||¡ zt d¡}W n t	yž   t
dƒ Y nw | ¡ }|jt|| j| j| jfd	}	|	 ¡  | ¡ }
| ¡ }| ¡ }| ¡ }|	 ¡  |  ||¡ |  ||¡ |  |
 d¡d¡ |  |
 d¡d¡ |  |
 d¡d¡ |  |
 d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ d S )
Nzindex savedr>   z
data savedzindex loadedr   zdata loadedr­  zmissing spawn contextrZ   )rÈ  rÊ  r   ÚgetvaluerN   Úcountr¤  r`   ra   Ú
ValueErrorrÁ  rb   rc   Úcache_file_collision_testerr*   r¿  rÀ  re   rf   r"   )rO   rÎ  rÏ  ÚbufÚres1ÚcachelogÚres2ÚmpÚqrk   Úlog1Úgot1Úlog2Úgot2r-   r-   r.   Útest_no_collisionð  s^   ÿÿÿþÿz(TestCacheFileCollision.test_no_collisionN)r_   ro   rp   r«  r    r!   rË   r   rÌ   r"   r‚   r   rÂ  rÃ  r‡   r‹   rÈ  rÊ  rÒ  rY  Ú
skipUnlessÚhasattrr`   rá  r-   r-   r-   r.   r¶  ¹  s     
ÿr¶  c           	      C   s®   t j d|¡ t|ƒj}t|ƒj}tƒ }|ƒ }W d   ƒ n1 s"w   Y  |  | ¡ ¡ |  |¡ tƒ }|ƒ }W d   ƒ n1 sDw   Y  |  | ¡ ¡ |  |¡ d S )Nr   )r}   r!   r~   r   rÇ  r   ry   rÓ  )	rÜ  r*   r¿  rÀ  rÎ  rÏ  r×  Úr1Úr2r-   r-   r.   rÖ  .  s   

ÿ
ÿrÖ  c                   @   s0   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
S )Ú#TestCacheMultipleFilesWithSignatureFz
from file2 import function2
z¤
from numba import njit

@njit('float64(float64)', cache=True)
def function1(x):
    return x

@njit('float64(float64)', cache=True)
def function2(x):
    return x
c                 C   s¨   t dƒ| _tj | jd¡| _t| jdƒ}t| j|d W d   ƒ n1 s&w   Y  tj | jd¡| _	t| j	dƒ}t| j
|d W d   ƒ d S 1 sMw   Y  d S )Nr¸  zfile1.pyrô   r¼  zfile2.py)r   r*   r    r!   r"   Úfile1r$   rÁ  Úsource_text_file1Úfile2Úsource_text_file2)rO   rÅ  r-   r-   r.   r‡   P  s   
ÿ"ÿz)TestCacheMultipleFilesWithSignature.setUpc                 C   s   t  | j¡ d S rT   )r'   r(   r*   rU   r-   r-   r.   r‹   [  s   z,TestCacheMultipleFilesWithSignature.tearDownc                 C   s¦   t jtj| jgt jt jd}| ¡ \}}d| ¡ › d| ¡ › }| j|j	d|d t jtj| j
gt jt jd}| ¡ \}}d| ¡ › d| ¡ › }|  |j	d|¡ d S )N©r¯   r°   zstdout:
z


stderr:
r   r‡  )r´   rµ   r}   r¶   rç  r·   r¸   r»   rN   r¹   ré  )rO   r¾   r¿   rÀ   rˆ  r-   r-   r.   Ú*test_caching_mutliple_files_with_signature^  s   þþzNTestCacheMultipleFilesWithSignature.test_caching_mutliple_files_with_signatureN)	r_   ro   rp   r«  rè  rê  r‡   r‹   rì  r-   r-   r-   r.   ræ  <  s    ræ  c                   @   sB   e Zd Zej e¡Zej ed¡Z	dZ
dd„ Zdd„ Zdd„ Zd	S )
ÚTestCFuncCachezcfunc_cache_usecases.pyÚcfunc_caching_test_fodderc                 C   sf   dt | j| jd }tjtjd|gtjtjd}| ¡ \}}|j	dkr1t
d|j	› d| ¡ › dƒ‚d S )	Naf  if 1:
            import sys

            sys.path.insert(0, %(tempdir)r)
            mod = __import__(%(modname)r)
            mod.self_test()

            f = mod.add_usecase
            assert f.cache_hits == 1
            f = mod.outer
            assert f.cache_hits == 1
            f = mod.div_usecase
            assert f.cache_hits == 1
            r­   r®   rë  r   zprocess failed with code z:stderr follows
Ú
)rŸ   r*   r   r´   rµ   r}   r¶   r·   r¸   r¹   rº   r»   )rO   r¼   r¾   r¿   rÀ   r-   r-   r.   rÁ   v  s   óÿ

ÿÿz&TestCFuncCache.run_in_separate_processc                 C   s   |  ¡  d S rT   )Ú	self_test©rO   r•   r-   r-   r.   Úcheck_moduleŽ  rÉ  zTestCFuncCache.check_modulec                 C   sÎ   |   d¡ |  ¡ }|   d¡ |  |jjd¡ |  |jjd¡ |  |jjd¡ |  |jjd¡ |  |¡ |  ¡ }|   d¡ |  |jjd¡ |  |jjd¡ |  |jjd¡ |  |jjd¡ |  |¡ |  	¡  d S )Nr   rÎ   r>   )
r¤   r–   rN   rÓ   rÄ   rä   rç   Údiv_usecaserò  rÁ   rñ  r-   r-   r.   rÛ   ‘  s    




zTestCFuncCache.test_cachingN)r_   ro   rp   r    r!   rË   r   rÌ   r"   r‚   r   rÁ   rò  rÛ   r-   r-   r-   r.   rí  p  s    rí  c                   @   s   e Zd ZdS )ÚTestLocatorN)r_   ro   rp   r-   r-   r-   r.   rô  ©  s    rô  c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú&TestCacheLocatorEnvironmentIntegrationz9Integration tests for environment variable functionality.c              	   C   sz   dd„ }t ddƒ* |  t¡ t|ƒ W d   ƒ n1 sw   Y  W d   ƒ d S W d   ƒ d S 1 s6w   Y  d S )Nc                   S   ó   dS ©NrC  r-   r-   r-   r-   r.   rr  ±  r§   z\TestCacheLocatorEnvironmentIntegration.test_locators_env_override_unknown.<locals>.mock_funcÚNUMBA_CACHE_LOCATOR_CLASSESzfoo,bar)r   ÚassertRaisesÚRuntimeErrorr   )rO   rr  r-   r-   r.   Ú"test_locators_env_override_unknown°  s   þ
ÿü"üzITestCacheLocatorEnvironmentIntegration.test_locators_env_override_unknownc                 C   sT   dd„ }t ddƒ t|ƒ}t}|  |jj|¡ W d   ƒ d S 1 s#w   Y  d S )Nc                   S   rö  r÷  r-   r-   r-   r-   r.   rr  ¼  r§   z[TestCacheLocatorEnvironmentIntegration.test_locators_env_override_single.<locals>.mock_funcrø  r
   )r   r   r
   r(  Ú_implr,  ©rO   rr  r6   ÚexpectedLocatorr-   r-   r.   Ú!test_locators_env_override_single»  s   þ
ÿ"úzHTestCacheLocatorEnvironmentIntegration.test_locators_env_override_singlec                 C   sZ   dd„ }t dt› dƒ t|ƒ}t}|  |jj|¡ W d   ƒ d S 1 s&w   Y  d S )Nc                   S   rö  r÷  r-   r-   r-   r-   r.   rr  É  r§   z[TestCacheLocatorEnvironmentIntegration.test_locators_env_override_custom.<locals>.mock_funcrø  z.TestLocator)r   r_   r   rô  r(  rü  r,  rý  r-   r-   r.   Ú!test_locators_env_override_customÈ  s   þ
ÿ"úzHTestCacheLocatorEnvironmentIntegration.test_locators_env_override_customc                 C   sX   dd„ }d}t }td|ƒ t|ƒ}|  |jj|¡ W d   ƒ d S 1 s%w   Y  d S )Nc                   S   rö  r÷  r-   r-   r-   r-   r.   rr  Ö  r§   zYTestCacheLocatorEnvironmentIntegration.test_locators_env_override_list.<locals>.mock_funczXInTreeCacheLocatorFsAgnostic,InTreeCacheLocator,IPythonCacheLocator,UserWideCacheLocatorrø  )r
   r   r   r(  rü  r,  )rO   rr  ÚlocatorClassesrþ  r6   r-   r-   r.   Útest_locators_env_override_listÕ  s   þ"ûzFTestCacheLocatorEnvironmentIntegration.test_locators_env_override_listc                 C   s(   dd„ }t |ƒ}t}|  |jj|¡ d S )Nc                   S   rö  r÷  r-   r-   r-   r-   r.   rr  å  r§   zOTestCacheLocatorEnvironmentIntegration.test_default_locators.<locals>.mock_func)r   r	   r(  rü  r,  rý  r-   r-   r.   Útest_default_locatorsä  s   z<TestCacheLocatorEnvironmentIntegration.test_default_locatorsN)	r_   ro   rp   ry  rû  rÿ  r   r  r  r-   r-   r-   r.   rõ  ­  s    rõ  c                   @   rp  )Ú TestInTreeCacheLocatorFsAgnosticz7Test _InTreeCacheLocatorFsAgnostic class functionality.c                 C   s¶   ddl m} t |¡}t ||¡}t ||¡}|  |¡ |  |¡ | ¡ }| ¡ }|  	t
|ƒd¡ |  	t
|ƒd¡ |  	|d |d ¡ |  	|d t|d ƒ¡ |  |d |d ¡ dS )z9Test that FsAgnostic locator floors timestamp to seconds.r>   r  r?   r   N)r   r  r#  r$  r	   r%  r
   rs  Úget_source_stamprN   r¢   r   ÚassertLessEqual)rO   r  r+  Úregular_locatorÚfs_agnostic_locatorÚregular_stampÚfs_agnostic_stampr-   r-   r.   Útest_source_stamp_precisionð  s   
ÿ

z<TestInTreeCacheLocatorFsAgnostic.test_source_stamp_precisionc                 C   sh   ddl m} t |¡}t ||¡}t |¡}|j}| 	¡ }t
|ƒ}|  |d |¡ |  |d |j¡ dS )z:Test FsAgnostic timestamp handling using filesystem mtime.r>   r  r   N)r   r  r#  r$  r
   r%  r    rƒ   Úst_mtimer  r   rN   Úst_size)rO   r  r+  r  Ústat_resultÚoriginal_mtimeÚstampÚexpected_timestampr-   r-   r.   Útest_timestamp_precision_on_fs  s   
ÿ
z?TestInTreeCacheLocatorFsAgnostic.test_timestamp_precision_on_fsN)r_   ro   rp   ry  r  r  r-   r-   r-   r.   r  í  s    !r  Ú__main__)Prj  r#  r`   r    r'   rƒ   r´   r}   rw   rY  rì   r`  Úpathlibr   Úllvmlite.bindingÚbindingr”  ÚnumpyrÜ   Úmathr   Únumbar   Ú
numba.corer   Únumba.core.cachingr   r   r   r	   r
   Únumba.core.errorsr   Únumba.parforsr   Únumba.tests.supportr   r   r   r   r   r   r   r   r   r   Únumba.core.registryr   rU  ÚImportErrorr/   Ú_access_preventableÚ_access_msgrâ  rX  r3   r=   rB   rF   rI   rK   rL   rd   r{   r¨   rÍ   r]  rq  rz  r†  r¬  r¶  rÖ  ræ  rí  rô  rõ  r  r_   Úmainr-   r-   r-   r.   Ú<module>   s~    0ÿ	:7)   !;\t49@
?ÿ