U
    ,‰dz’  ã                   @   s  d dl Z d dlm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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" zd dl#Z#W n e$k
rì   dZ#Y nX dd	„ Z%e%ƒ Z&d
Z'e (e&e'¡Z)dd„ Z*dd„ Z+dd„ Z,dd„ Z-dd„ Z.dd„ Z/G dd„ deeƒZ0dd„ Z1G dd„ deƒZ2G dd„ de2ƒZ3G dd „ d e3ƒZ4e!G d!d"„ d"e3ƒƒZ5G d#d$„ d$e3ƒZ6G d%d&„ d&e2ƒZ7e G d'd(„ d(ejƒƒZ8d)d*„ Z9G d+d,„ d,ejƒZ:G d-d.„ d.e2ƒZ;e<d/kre =¡  dS )0é    N)Únjit)Úcodegen)Ú_UserWideCacheLocator)ÚNumbaWarning)Úparfor)
ÚTestCaseÚSerialMixinÚcapture_cache_logÚimport_dynamicÚoverride_configÚoverride_env_configÚrun_in_new_process_cachingÚskip_if_typeguardÚskip_parfors_unsupportedÚtemp_directoryc               
   C   sÈ   t dƒ} tj | d¡}t |¡ ttj |d¡dƒ}| d¡ W 5 Q R X t |d¡ zTz4ttj |d¡dƒ}| d	¡ W 5 Q R X W W ¢"d
S  t
k
r¦   Y W ¢
dS X W 5 t |d¡ t 	|¡ X d S )NÚ
test_cacheZwritable_testZwrite_okÚwtZcheck1é@  iý  Zwrite_forbiddenZcheck2FT)r   ÚosÚpathÚjoinÚmkdirÚopenÚwriteÚchmodÚshutilÚrmtreeÚPermissionError)ÚtempdirZtest_dirÚf© r    ú</tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_caching.pyÚcheck_access_is_preventable$   s    

r"   z9Cannot create a directory to which writes are preventablec                  C   s   d} t | ƒ| fS )NZabcd)Úhash)Úcr    r    r!   Úconstant_unicode_cacheH   s    r%   c                  C   sB   t } tdd| ƒ}| ƒ \}}|ƒ \}}||ks2t‚||ks>t‚d S ©NT©Úcache)r%   r   ÚAssertionError)ÚpyfuncÚcfuncZexp_hvZexp_strZgot_hvZgot_strr    r    r!   Úcheck_constant_unicode_cacheM   s    

r,   c                   C   s
   dddœS )Né   é   )ÚaÚbr    r    r    r    r!   Ú
dict_cacheV   s    r1   c                  C   s.   t } tdd| ƒ}| ƒ }|ƒ }||ks*t‚d S r&   )r1   r   r)   ©r*   r+   ÚexpÚgotr    r    r!   Úcheck_dict_cacheZ   s
    r5   c                  c   s   dD ]
} | V  qd S )N)r-   r.   é   r    )Úvr    r    r!   Úgenerator_cacheb   s    r8   c                  C   s6   t } tdd| ƒ}t| ƒ ƒ}t|ƒ ƒ}||ks2t‚d S r&   )r8   r   Úlistr)   r2   r    r    r!   Úcheck_generator_cacheg   s
    

r:   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_testp   s    zTestCaching.run_testc                 C   s   |   t¡ d S ©N)rA   r,   ©r>   r    r    r!   Útest_constant_unicode_cacheu   s    z'TestCaching.test_constant_unicode_cachec                 C   s   |   t¡ d S rB   )rA   r5   rC   r    r    r!   Útest_dict_cachex   s    zTestCaching.test_dict_cachec                 C   s   |   t¡ d S rB   )rA   r:   rC   r    r    r!   Útest_generator_cache{   s    z TestCaching.test_generator_cachec                 C   s¸   t | jjƒ}t ¡ }| ¡ }|jt||dfd}| ¡  | 	¡  | 
¡ \}}|sZ|  |¡ |  |dd¡ |jt||dfd}| ¡  | 	¡  | 
¡ \}}|s¦|  |¡ |  |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Úfailr=   )r>   Ú	cache_dirÚctxÚresult_queueÚprocÚsuccessÚoutputr    r    r!   Útest_omitted~   s>    þ
ýþ
ýzTestCaching.test_omittedN)rL   Ú
__module__Ú__qualname__rA   rD   rE   rF   r[   r    r    r    r!   r;   o   s
   r;   c              	   C   sÚ   t d|ƒÆ tddddd„ƒ}z„|ƒ }|rf|j|jd  dksHtd	ƒ‚|j|jd  dksžtd
ƒ‚n8|j|jd  dks‚tdƒ‚|j|jd  dksžtdƒ‚d}W n   t ¡ }d}Y nX |  ||f¡ W 5 Q R X d S )NZ	CACHE_DIRTr'   rJ   c                 S   s   | S rB   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)rJ   )	r   r   Z_cache_hitsZ
signaturesr)   Z_cache_missesÚ	tracebackÚ
format_excÚput)rW   rU   Zsecond_callr_   rZ   rY   r    r    r!   rQ   ©   s.    ÿÿÿÿ
rQ   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   s^   t dƒ| _tj d| j¡ tj | j| jd ¡| _tj | jd¡| _	t
 | j| j¡ d | _d S )Nr   r   z.pyÚ__pycache__)r   r   Úsysr   Úinsertr   r   ÚmodnameÚmodfilerU   r   ÚcopyÚusecases_fileZmaxDiffrC   r    r    r!   ÚsetUpË   s    
zBaseCacheTest.setUpc                 C   s"   t j | jd ¡ t j | j¡ d S rB   )re   ÚmodulesÚpoprg   r   Úremover   rC   r    r    r!   ÚtearDownÓ   s    zBaseCacheTest.tearDownc              	   C   sr   t j | jd ¡}|d k	rN|jg}|D ](}zt |¡ W q$ tk
rJ   Y q$X q$t| jƒ}|  	|j
 d¡| j¡ |S )NÚco)re   rl   rm   rg   Ú
__cached__r   ÚunlinkÚFileNotFoundErrorr
   r=   Ú__file__Úrstriprh   )r>   ÚoldÚcachedÚfnÚmodr    r    r!   Úimport_module×   s    
zBaseCacheTest.import_modulec                 C   s6   zdd„ t  | j¡D ƒW S  tk
r0   g  Y S X d S )Nc                 S   s   g | ]}|  d ¡s|‘qS ))z.pycz.pyo)Úendswith©Ú.0rx   r    r    r!   Ú
<listcomp>ê   s    
ÿz0BaseCacheTest.cache_contents.<locals>.<listcomp>)r   ÚlistdirrU   rs   rC   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 rB   )r   r   Úgetmtimer   rU   r|   rC   r    r!   Ú	<genexpr>ð   s   ÿz1BaseCacheTest.get_cache_mtimes.<locals>.<genexpr>)ÚdictÚsortedr€   rC   r    rC   r!   Úget_cache_mtimesï   s    
ÿzBaseCacheTest.get_cache_mtimesc                 C   s   |   ¡ }|  t|ƒ||¡ d S rB   )r€   r=   Úlen)r>   Únr$   r    r    r!   Úcheck_pycacheó   s    zBaseCacheTest.check_pycachec                 C   s   d S rB   r    rC   r    r    r!   Ú
dummy_test÷   s    zBaseCacheTest.dummy_test)rL   r\   r]   rj   rg   rk   ro   rz   r€   r…   rˆ   r‰   r    r    r    r!   rc   Å   s   rc   c                   @   s<   e Zd Zej e¡Zej ed¡Z	dZ
dd„ Zddd„ZdS )	ÚDispatcherCacheUsecasesTestúcache_usecases.pyÚdispatcher_caching_test_fodderc                 C   sf   dt | j| jd }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   rg   ú-c©ÚstdoutÚstderrr   zBprocess failed with code %s: 
stdout follows
%s
stderr follows
%s
©rƒ   r   rg   Ú
subprocessÚPopenre   Ú
executableÚPIPEÚcommunicateÚ
returncoder)   Údecode©r>   ÚcodeÚpopenÚoutÚerrr    r    r!   Úrun_in_separate_process   s    ú ÿ
ýÿz3DispatcherCacheUsecasesTest.run_in_separate_processNc                 C   sF   |j }|  t|j ¡ ƒ||j¡ |d k	rB|  t|j ¡ ƒ||j¡ d S rB   )Ústatsr=   ÚsumÚ
cache_hitsÚvaluesZcache_misses)r>   r?   ÚhitsÚmissesÚstr    r    r!   Ú
check_hits  s    ÿz&DispatcherCacheUsecasesTest.check_hits)N)rL   r\   r]   r   r   Údirnamert   Úherer   rj   rg   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)kpäe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¡ |j
}|  |ddƒd¡ |  |ddƒd¡ |  ¡  d S )Nr   r.   r6   é   ç      @ç      @é   r-   )r.   g     ÀE@é	   y              @y       @      @)rˆ   rz   Úadd_usecaseÚassertPreciseEqualr§   Úadd_objmode_usecaseÚrecord_returnÚaligned_arrÚtupleÚ
packed_arrÚgenerated_usecaserŸ   )r>   ry   r   Zrecr    r    r!   Útest_caching!  s4    






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.   r6   r«   r-   )rˆ   rz   r°   r±   ÚnpZaranger§   ©r>   ry   r   r    r    r!   Útest_caching_nrt_prunedC  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 )Nr6   r.   r«   é   ç      @r¬   )rz   r±   Úinnerrˆ   Úouter_uncachedÚouterrº   r    r    r!   Útest_inner_then_outerP  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 )Nr6   r.   r¼   r«   r½   r­   r®   )rz   r±   rÀ   rˆ   r¿   r¾   rº   r    r    r!   Útest_outer_then_innerd  s    


zTestCache.test_outer_then_innerc                 C   s.   |   ¡ }|j}|  |ddƒd¡ |  d¡ d S )Nr.   r6   r«   r   )rz   Úadd_nocache_usecaser±   rˆ   rº   r    r    r!   Útest_no_cachingr  s    zTestCache.test_no_cachingc              	   C   sv   |   ¡ }tjdd2}t dt¡ |j}|  |dƒd¡ |  d¡ W 5 Q R X |  t	|ƒd¡ |  
dt|d jƒ¡ d S )	NT©ÚrecordÚalwaysr¼   r«   r   r-   zBCannot cache compiled function "looplifted" as it uses lifted code)rz   ÚwarningsÚcatch_warningsÚsimplefilterr   Z
loopliftedr±   rˆ   r=   r†   ÚassertInÚstrÚmessage©r>   ry   Úwr   r    r    r!   Útest_loopliftedy  s    ÿzTestCache.test_loopliftedc              	   C   sx   |   ¡ }tjdd4}t dt¡ |j}tj |ƒ |j	¡ |  
d¡ W 5 Q R X |  t|ƒd¡ |  dt|d jƒ¡ d S )NTrÅ   rÇ   r   r-   zICannot cache compiled function "use_big_array" as it uses dynamic globals)rz   rÈ   rÉ   rÊ   r   Zuse_big_arrayr¹   ZtestingZassert_equalZbiggierˆ   r=   r†   rË   rÌ   rÍ   rÎ   r    r    r!   Útest_big_arrayˆ  s    ÿzTestCache.test_big_arrayc              
   C   sŽ   |   ¡ }|j|j|jfD ]p}tjdd,}t dt¡ |  |dƒd¡ |  	d¡ W 5 Q R X |  
t|ƒd¡ |  d |j¡t|d jƒ¡ qd S )NTrÅ   rÇ   g        r   r-   z#Cannot cache compiled function "{}")rz   Z	use_c_sinZuse_c_sin_nest1Zuse_c_sin_nest2rÈ   rÉ   rÊ   r   r±   rˆ   r=   r†   rË   ÚformatrL   rÌ   rÍ   )r>   ry   r   rÏ   r    r    r!   Útest_ctypes–  s    
þzTestCache.test_ctypesc              	   C   sŽ   |   ¡ }t ¡ t t dt¡ |j}|  |dƒd¡ |j}|  |dƒd¡ |j}|  |dƒd¡ |j	}|  |dƒd¡ |  
d¡ W 5 Q R X d S )NÚerrorr6   r«   é   é
   é   r®   )rz   rÈ   rÉ   rÊ   r   Zclosure1r±   Zclosure2Zclosure3Z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.   é   é   )rz   Zfirst_class_function_usecaser=   Zfirst_class_function_mulZ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¡ | dd¡ |  	¡ }|  
|jdd¡ |   ¡ }|  ||¡ |j}|ddƒ |  
|dd¡ |ddƒ |  
|dd¡ |j}|ddƒ |  
|dd¡ |  |  	¡ |¡ |  ¡  |  |  	¡ |¡ d S )Nr.   r6   r¬   r½   r   r-   )rz   r°   r²   r¿   rÀ   r³   r¶   r´   r·   r…   r§   ZassertIsNotr=   rŸ   )r>   ry   ÚmtimesÚmod2r   r    r    r!   Útest_cache_reuseÃ  s0    


zTestCache.test_cache_reusec              	   C   s~   |   ¡ }|j}|  |ddƒd¡ t| jdƒ}| d¡ W 5 Q R X |   ¡ }|j}|  |ddƒd¡ |j}|  |ddƒd¡ d S )Nr.   r6   r«   r/   z
Z = 10
é   )rz   r°   r±   r   rh   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.   r6   r«   rÖ   rà   )rz   r°   r±   ÚZZ	recompilerº   r    r    r!   Útest_recompileñ  s    zTestCache.test_recompilec                 C   s8   |   ¡ }|j}|  |dƒd¡ |j}|  |dƒd¡ d S )Nr.   r¼   rÕ   )rz   Zrenamed_function1r±   Zrenamed_function2rº   r    r    r!   Útest_same_names  s
    zTestCache.test_same_namesc                 C   sx   ddl m} |j}tdddƒ}zH||_t |¡}t 	||¡}|  
|¡ dt_t 	||¡}|  |t¡ W 5 ||_t`X d S )Nr-   )ÚfunctionÚpassztests/dummy_module.pyÚexecT)Zdummy_modulerå   Ú__code__Úcompilere   ÚfrozenÚinspectÚgetfiler   Úfrom_functionZassertIsNoneZassertIsInstance)r>   rå   Zold_codeZ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.   r6   r«   r   r-   N)
rz   r°   Ú
addCleanupr   r   r    Ú
cache_pathr±   r§   rˆ   )r>   ry   r   rÞ   r    r    r!   Ú_test_pycache_fallback"  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   Ústatr   Úst_moder   rò   rô   )r>   Ú	old_permsr    r    r!   Útest_non_creatable_pycache;  s    z$TestCache.test_non_creatable_pycachec                 C   sN   t j | jd¡}t  |¡ t  |¡j}t  |d¡ |  t j||¡ |  	¡  d S )Nrd   r   )
r   r   r   r   r   rö   r÷   r   rò   rô   )r>   Úpycacherø   r    r    r!   Útest_non_writable_pycacheF  s    
z#TestCache.test_non_writable_pycachec              
      sÒ   t jddg‰ ˆ ddddg7 ‰ zt ˆ dg ¡}W n4 tjk
rd } zˆ d|j ¡ W 5 d }~X Y nX | ¡  ¡ }t	j
 ˆjd	¡‰tˆd
ƒ}| d¡ W 5 Q R X ‡ ‡‡fdd„}|ƒ  |ƒ }ˆ d| ¡ ¡ d S )Nú-mÚIPythonú--quietú--quickú--no-bannerú--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               
      sj   t ˆdƒV} tjˆ | tjtjdd}| ¡ \}}|jdkrPˆ d|j||f ¡ |W  5 Q R £ S Q R X d S ©NÚrbT)Ústdinr   r‘   Úuniversal_newlinesé*   z6unexpected return code %d
-- stdout:
%s
-- stderr:
%s
©r   r“   r”   r–   r—   r˜   rT   ©r  Úpr   rž   ©Zbase_cmdZinputfnr>   r    r!   Úexecute_with_inputt  s    ý

ýz2TestCache.test_ipython.<locals>.execute_with_inputúcache hits = 1)re   r•   r“   Úcheck_outputÚCalledProcessErrorÚskipTestr˜   Ústripr™   r   r   r   r   r   r   rË   )r>   ÚverÚer   r  rž   r    r  r!   Útest_ipythonS  s     ÿzTestCache.test_ipythonNr   r«   zrequires ipykernel >= 6c              
      sÖ   t jddg‰ ˆ ddddg7 ‰ zt ˆ dg ¡}W n4 tjk
rd } zˆ d|j ¡ W 5 d }~X Y nX | ¡  ¡ }d	d
l	m
} | ¡ ‰tˆdƒ}| d¡ W 5 Q R X ‡ ‡‡fdd„}|ƒ  |ƒ }ˆ d| ¡ ¡ d S )Nrü   rý   rþ   rÿ   r   r  r  r  r   )ÚcompilerrÏ   r  c               
      sj   t ˆdƒV} tjˆ | tjtjdd}| ¡ \}}|jdkrPˆ d|j||f ¡ |W  5 Q R £ S Q R X d S r  r
  r  r  r    r!   r  ­  s    ý

ýz4TestCache.test_ipykernel.<locals>.execute_with_inputr  )re   r•   r“   r  r  r  r˜   r  r™   Ú	ipykernelr  Zget_tmp_directoryr   r   rË   )r>   r  r  r  r   r  rž   r    r  r!   Útest_ipykernelˆ  s"    ÿzTestCache.test_ipykernel)rL   r\   r]   r¸   r»   rÁ   rÂ   rÄ   rÐ   rÑ   rÓ   rØ   rÜ   rß   rá   rã   rä   rð   rô   Úskip_bad_accessÚunittestZskipIfr   Únamerù   rû   r  r  Úversion_infor  r    r    r    r!   rª     s>   "ÿÿ
5ÿrª   c                       s0   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚTestSequentialParForsCachec                    s   t t| ƒ ¡  dt_d S )NT)Úsuperr  rk   r   Úsequential_parfor_loweringrC   ©rK   r    r!   rk   Ä  s    z TestSequentialParForsCache.setUpc                    s   t t| ƒ ¡  dt_d S )NF)r  r  ro   r   r   rC   r!  r    r!   ro   É  s    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    )ZlibraryZhas_dynamic_globals)r}   Zcresr    r    r!   r~   Ô  s   ÿz;TestSequentialParForsCache.test_caching.<locals>.<listcomp>Fr.   )	rz   rˆ   Zparfor_usecaser¹   Zonesr±   Z	overloadsr£   r=   )r>   ry   r   ZaryZdynamic_globalsr    r    r!   r¸   Î  s    

ÿz'TestSequentialParForsCache.test_caching)rL   r\   r]   rk   ro   r¸   Ú__classcell__r    r    r!  r!   r  Â  s   r  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTestCacheWithCpuSettingFc                 C   sN   d}|   ¡  ¡ D ](\}}||kr|  ||| ¡ |d7 }q| j|ddd d S )Nr   r-   znothing to compare©Úmsg)r…   ÚitemsZassertGreaterEqualÚassertGreater)r>   Z
mtimes_oldÚmatch_countÚkr7   r    r    r!   Úcheck_later_mtimesÞ  s    
ÿz*TestCacheWithCpuSetting.check_later_mtimesc              	   C   s"  |   d¡ |  ¡ }| ¡  t|  ¡ ƒ}|  ¡ }tddƒ |  ¡  W 5 Q R X |  |¡ |  	t|  ¡ ƒ|¡ |j
j}|j}| ¡ }|  t|ƒd¡ | ¡ \}}|d d t ¡ kr¼|| }	}
n
|| }	}
|  |	d d t ¡ ¡ |  |	d d t ¡ ¡ |  |
d d d¡ |  |
d d d¡ d S )Nr   ZNUMBA_CPU_NAMEZgenericr.   r-   Ú )rˆ   rz   Ú	self_testr†   r€   r…   r   rŸ   r*  r'  r°   Ú_cacheÚ_cache_fileÚ_load_indexr=   ÚkeysÚllÚget_host_cpu_namer   Úget_host_cpu_features)r>   ry   Ú
cache_sizerÝ   r(   Ú
cache_fileÚcache_indexÚkey_aÚkey_bÚkey_hostÚkey_genericr    r    r!   Útest_user_set_cpu_nameç  s*    


z.TestCacheWithCpuSetting.test_user_set_cpu_namec              	   C   s6  |   d¡ |  ¡ }| ¡  t|  ¡ ƒ}|  ¡ }d}t ¡ }|  ||¡ t	d|ƒ |  
¡  W 5 Q R X |  |¡ |  t|  ¡ ƒ|¡ |jj}|j}| ¡ }|  t|ƒd¡ | ¡ \}	}
|	d d |krÐ|	|
 }}n
|
|	 }}|  |d d t ¡ ¡ |  |d d |¡ |  |d d t ¡ ¡ |  |d d |¡ d S )Nr   z	-sse;-avxZNUMBA_CPU_FEATURESr.   r-   )rˆ   rz   r,  r†   r€   r…   r   r3  ÚassertNotEqualr   rŸ   r*  r'  r°   r-  r.  r/  r=   r0  r1  r2  )r>   ry   r4  rÝ   Zmy_cpu_featuresZsystem_featuresr(   r5  r6  r7  r8  r9  r:  r    r    r!   Útest_user_set_cpu_features  s0    


z2TestCacheWithCpuSetting.test_user_set_cpu_featuresN)rL   r\   r]   Ú_numba_parallel_test_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k
r8   t}Y nX | |¡}zt| |t	|ƒ¡ƒ}W 5 | ¡  X |  
|||d  d ¡ d S )Nr6   Úspawnr-   r.   )rz   Zsimple_usecase_callerrM   rN   ÚAttributeErrorZPoolÚcloser¡   ÚimapÚranger=   )r>   ry   r   r‡   rV   Úpoolr@   r    r    r!   Útest_multiprocessing0  s    


z*TestMultiprocessCache.test_multiprocessingN)rL   r\   r]   r>  r   r   r¨   rt   r©   r   rj   rg   rF  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‹   Z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 5 Q R X ttj 	|d	¡dƒ}t| j|d W 5 Q R X d S )
NÚtest_cache_file_locr   Zmodule_name_that_is_unlikelyÚ.Zfooz__init__.pyrÏ   ©Úfilezfoo.py)r   r   re   r   rf   rg   ZassertNotInrl   Úmodname_bar1r   Úmodname_bar2r   r   r   ÚprintÚsource_text_1Úsource_text_2)r>   ZfoomodÚfoutr    r    r!   rk   W  s    

zTestCacheFileCollision.setUpc                 C   s2   t j | jd ¡ t j | jd ¡ t j | j¡ d S rB   )re   rl   rm   rL  rM  r   rn   r   rC   r    r    r!   ro   e  s    zTestCacheFileCollision.tearDownc                 C   s   t | jƒjS rB   )r
   rL  ÚbarrC   r    r    r!   Úimport_bar1j  s    z"TestCacheFileCollision.import_bar1c                 C   s   t | jƒjS rB   )r
   rM  rR  rC   r    r    r!   Úimport_bar2m  s    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)rS  rT  r-  r.  Z_index_namer<  Ú
assertTrueÚ
startswith)r>   Úbar1Úbar2Zidxname1Zidxname2r    r    r!   Útest_file_locationp  s    

z)TestCacheFileCollision.test_file_locationrN   z)Test requires multiprocessing.get_contextc              	   C   s  |   ¡ }|  ¡ }tƒ }|ƒ }W 5 Q R X | ¡ }|  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ tƒ }|ƒ }W 5 Q R X | ¡ }|  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  ||¡ zt d¡}W n t	k
r   t
dƒ Y nX | ¡ }|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 contextrG   )rS  rT  r	   Úgetvaluer=   Úcountr<  rM   rN   Ú
ValueErrorrN  rO   rP   Úcache_file_collision_testerr   rL  rM  rR   rS   r   )r>   rW  rX  ÚbufZres1ZcachelogZres2ÚmpÚqrX   Zlog1Zgot1Úlog2Zgot2r    r    r!   Útest_no_collisionz  sX    þÿz(TestCacheFileCollision.test_no_collisionN)rL   r\   r]   r>  r   r   r¨   rt   r©   r   rj   rg   rO  rP  rk   ro   rS  rT  rY  r  Ú
skipUnlessÚhasattrrM   rb  r    r    r    r!   rG  C  s   
ÿrG  c           	   	   C   s†   t j d|¡ t|ƒj}t|ƒj}tƒ }|ƒ }W 5 Q R X |  | ¡ ¡ |  |¡ tƒ }|ƒ }W 5 Q R X |  | ¡ ¡ |  |¡ d S )Nr   )re   r   rf   r
   rR  r	   rb   rZ  )	r`  r   rL  rM  rW  rX  r^  Zr1Z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 5 Q R X tj | jd¡| _	t| j	dƒ}t| j
|d W 5 Q R X d S )NrH  zfile1.pyrÏ   rJ  zfile2.py)r   r   r   r   r   Úfile1r   rN  Úsource_text_file1Úfile2Úsource_text_file2)r>   rQ  r    r    r!   rk   Ú  s    
z)TestCacheMultipleFilesWithSignature.setUpc                 C   s   t  | j¡ d S rB   )r   r   r   rC   r    r    r!   ro   å  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 )Nr   zstdout:
z


stderr:
r   r$  )r“   r”   re   r•   rf  r–   r—   r™   r=   r˜   rh  )r>   rœ   r   rž   r%  r    r    r!   Ú*test_caching_mutliple_files_with_signatureè  s    þþzNTestCacheMultipleFilesWithSignature.test_caching_mutliple_files_with_signatureN)	rL   r\   r]   r>  rg  ri  rk   ro   rj  r    r    r    r!   re  Æ  s   re  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.pyZ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rbt
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Ÿ      s    ó ÿ
z&TestCFuncCache.run_in_separate_processc                 C   s   |  ¡  d S rB   )r,  ©r>   ry   r    r    r!   Úcheck_module  s    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ˆ   rz   r=   r°   r¢   rÀ   rÃ   Zdiv_usecasern  rŸ   rm  r    r    r!   r¸     s     




zTestCFuncCache.test_cachingN)rL   r\   r]   r   r   r¨   rt   r©   r   rj   rg   rŸ   rn  r¸   r    r    r    r!   rk  ú  s   rk  Ú__main__)>rë   Zllvmlite.bindingZbindingr1  rM   Znumpyr¹   r   r   r“   re   r`   r  rÈ   Znumbar   Z
numba.corer   Znumba.core.cachingr   Znumba.core.errorsr   Znumba.parforsr   Znumba.tests.supportr   r   r	   r
   r   r   r   r   r   r   r  ÚImportErrorr"   Z_access_preventableZ_access_msgrc  r  r%   r,   r1   r5   r8   r:   r;   rQ   rc   rŠ   rª   r  r#  r?  rG  r]  re  rk  rL   Úmainr    r    r    r!   Ú<module>   sb   0
	:6$   &Lt49
