U
    b»{jH)  ã                   @   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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 ddlT G d	d
„ d
eƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdd„ Zdd„ Zdd„ Zdd„ Zedkrøe ¡  dS )é    N)Úget_context)ÚTypingError)ÚTestCase)Úresolve_dispatcher_from_str©ÚdumpsÚloadsé   )Ú*c                   @   sº   e Zd Zdd„ Zej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d#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+S ),ÚTestDispatcherPicklingc                 O   s(   t tjd ƒD ]}||f|ž|Ž qd S )Nr	   )ÚrangeÚpickleÚHIGHEST_PROTOCOL)ÚselfÚmethÚargsÚkwargsÚproto© r   úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/numba/tests/test_serialize.pyÚrun_with_protocols   s    z)TestDispatcherPickling.run_with_protocolsc                 c   s:   d}t |ƒ}|j}t|jƒ|ƒ|_z
d V  W 5 ||_X d S )NÚcpu)r   ZtargetdescrÚtype)r   ZhwstrZdispatcher_clsZ	old_descrr   r   r   Úsimulate_fresh_target   s    
z,TestDispatcherPickling.simulate_fresh_targetc              	      sN   ‡ ‡‡fdd„}||ƒ t  ||¡}ˆ ¡ � t  |¡}||ƒ W 5 Q R X d S )Nc                    s<   t ˆtƒr(tˆtƒr(ˆjˆ| fˆ žŽ  nˆ | ˆ Ž ˆ¡ d S )N)Ú
isinstancer   Ú
issubclassÚ	ExceptionZassertRaisesZassertPreciseEqual)Úfunc©r   Úexpected_resultr   r   r   Úcheck_result'   s
    
ÿz7TestDispatcherPickling.check_call.<locals>.check_result)r   r   r   r   )r   r   r   r   r   r    ÚpickledÚnew_funcr   r   r   Ú
check_call&   s    

z!TestDispatcherPickling.check_callc                 C   s(   |   | jtdd¡ |   | jtdd¡ d S )Né   ©r	   é   )ç333333ó?gÍÌÌÌÌÌ@)r   r#   Zadd_with_sig©r   r   r   r   Útest_call_with_sig5   s    z)TestDispatcherPickling.test_call_with_sigc                 C   s:   |   | jtdd¡ |   | jtdd¡ |   | jtdd¡ d S )Nr$   r%   ç      @©r'   g333333@Úabc)ÚaÚbc)r   r#   Zadd_without_sigr(   r   r   r   Útest_call_without_sig:   s    z,TestDispatcherPickling.test_call_without_sigc                 C   s0   |   | jtdd¡ |   | jtttƒ tƒ f¡ d S )Nr*   r+   )r   r#   Zadd_nopythonr   Úobjectr(   r   r   r   Útest_call_nopython@   s    z)TestDispatcherPickling.test_call_nopythonc                 C   s   |   | jttd¡ d S )N©r	   é   )r   r#   Zadd_nopython_failr   r(   r   r   r   Útest_call_nopython_failE   s    z.TestDispatcherPickling.test_call_nopython_failc                 C   s   |   | jtdd¡ d S )Ng      @)g      @)r   r#   Zget_global_objmoder(   r   r   r   Útest_call_objmode_with_globalI   s    z4TestDispatcherPickling.test_call_objmode_with_globalc                 C   s   t dƒ}|  | j|dd¡ d S )Nr	   é   )r3   é   )Úclosurer   r#   ©r   Úinnerr   r   r   Útest_call_closureL   s    z(TestDispatcherPickling.test_call_closurec                 K   s    t d|Ž}|  | j|dd¡ d S )Nç      @g      @©ç      @)r<   )Zclosure_with_globalsr   r#   )r   Zjit_argsr:   r   r   r   Úcheck_call_closure_with_globalsP   s    
z6TestDispatcherPickling.check_call_closure_with_globalsc                 C   s   | j dd� d S )NT)Znopython©r?   r(   r   r   r   Ú'test_call_closure_with_globals_nopythonT   s    z>TestDispatcherPickling.test_call_closure_with_globals_nopythonc                 C   s   | j dd� d S )NT)Zforceobjr@   r(   r   r   r   Ú&test_call_closure_with_globals_objmodeW   s    z=TestDispatcherPickling.test_call_closure_with_globals_objmodec                 C   s   t dƒ}|  | j|dd¡ d S )Nr<   g      &@)r>   g      @)Zclosure_calling_other_functionr   r#   r9   r   r   r   Ú(test_call_closure_calling_other_functionZ   s    z?TestDispatcherPickling.test_call_closure_calling_other_functionc                 C   s   t dƒ}|  | j|dd¡ d S )Nr<   g       @r=   )Úclosure_calling_other_closurer   r#   r9   r   r   r   Ú'test_call_closure_calling_other_closure^   s    z>TestDispatcherPickling.test_call_closure_calling_other_closurec                 C   s   |   | jtdd¡ d S ©Né$   )r6   )r   r#   Zdyn_funcr(   r   r   r   Útest_call_dyn_funcb   s    z)TestDispatcherPickling.test_call_dyn_funcc                 C   s   |   | jtdd¡ d S rF   )r   r#   Zdyn_func_objmoder(   r   r   r   Útest_call_dyn_func_objmodef   s    z1TestDispatcherPickling.test_call_dyn_func_objmodec                 C   s   t dƒ}|  | jt |d¡ d S )Nç        )rJ   )Zget_renamed_moduler   r#   )r   Úexpectedr   r   r   Útest_renamed_modulej   s
    
 ÿz*TestDispatcherPickling.test_renamed_modulec                 C   s(   |   | jtdd¡ |   | jtdd¡ d S )Né.   r2   y      @      ð?)y              ð?r3   )r   r#   Zgenerated_addr(   r   r   r   Útest_call_generatedq   s    
 ÿ
 ÿz*TestDispatcherPickling.test_call_generatedc                 C   s6   t dƒ}t |¡}djf tƒ Ž}t tjd|g¡ dS )z}
        Check that reconstructing doesn't depend on resources already
        instantiated in the original process.
        r<   z±if 1:
            import pickle

            data = {pickled!r}
            func = pickle.loads(data)
            res = func(4.0)
            assert res == 8.0, res
            ú-cN)	rD   r   r   ÚformatÚlocalsÚ
subprocessr#   ÚsysÚ
executable)r   r   r!   Úcoder   r   r   Útest_other_processw   s    
ùz)TestDispatcherPickling.test_other_processc                 C   s  t dƒ}t |¡}t dƒ}t |¡}t |¡}t |¡}t |¡}|  ||¡ |  |ddƒd¡ | ¡  |  |ddƒd¡ |  ||¡ |  |ddƒd¡ t dƒ}|d	d
ƒ t |¡}~t 	¡  t |¡}t |¡}|  ||¡ |  |ddƒd¡ | ¡  |  |ddƒd¡ dS )z¼
        Check that deserializing the same function multiple times re-uses
        the same dispatcher object.

        Note that "same function" is intentionally under-specified.
        r$   r6   r3   r7   é
   r&   é   é   é*   é+   é   é   N)
r8   r   r   r   ÚassertIsÚassertEqualZdisable_compileÚassertIsNotÚgcZcollect)r   r   r!   Zfunc2Zpickled2ÚfÚgÚhr   r   r   Ú
test_reuseˆ   s0    








z!TestDispatcherPickling.test_reusec                 C   s   d}t  tjd|g¡ dS )zN
        The imp module was deprecated in v3.4 in favour of importlib
        a  if 1:
            import pickle
            import warnings
            with warnings.catch_warnings(record=True) as w:
                warnings.simplefilter('always', DeprecationWarning)
                from numba import njit
                @njit
                def foo(x):
                    return x + 1
                foo(1)
                serialized_foo = pickle.dumps(foo)
            for x in w:
                if 'serialize.py' in x.filename:
                    assert "the imp module is deprecated" not in x.msg
        rO   N)rR   r#   rS   rT   )r   rU   r   r   r   Útest_imp_deprecation­   s    z+TestDispatcherPickling.test_imp_deprecationN)Ú__name__Ú
__module__Ú__qualname__r   Ú
contextlibÚcontextmanagerr   r#   r)   r/   r1   r4   r5   r;   r?   rA   rB   rC   rE   rH   rI   rL   rN   rV   re   rf   r   r   r   r   r      s,   
%r   c                   @   s   e Zd Zdd„ ZdS )ÚTestSerializationMiscc                 C   s`   ddl m} tƒ }t |¡}t|ƒ}|t|ƒ||ƒ}|  ||¡ |t|ƒ||ƒ}|  ||¡ d S )Nr   )Ú_numba_unpickle)	Znumba.core.serializerm   r0   r   r   ÚhashÚidr`   r^   )r   rm   Z
random_objZbytebufÚhashedZgot1Zgot2r   r   r   Útest_numba_unpickleÄ   s    
z)TestSerializationMisc.test_numba_unpickleN)rg   rh   ri   rq   r   r   r   r   rl   Ã   s   rl   c                   @   sD   e Zd ZdZdZdd„ Ze e dkd¡dd„ ƒZd	d
„ Z	dd„ Z
dS )ÚTestCloudPickleIssueszOThis test case includes issues specific to the cloudpickle implementation.
    Fc                    s\   G dd„ dƒ‰ ‡ fdd„}‡ ‡fdd„}t ˆ ƒ}|ƒ  |ƒ  t|ƒ |ƒ  t|ƒ |ƒ  d S )Nc                   @   s   e Zd ZdZdS )zITestCloudPickleIssues.test_dynamic_class_reset_on_unpickle.<locals>.KlassN©rg   rh   ri   Úclassvarr   r   r   r   ÚKlassÜ   s   ru   c                      s
   dˆ _ d S ©Néd   )rt   r   ©ru   r   r   Úmutatorß   s    zKTestCloudPickleIssues.test_dynamic_class_reset_on_unpickle.<locals>.mutatorc                      s   ˆ  ˆ jd¡ d S rv   )r_   rt   r   ©ru   r   r   r   Úcheckâ   s    zITestCloudPickleIssues.test_dynamic_class_reset_on_unpickle.<locals>.checkr   )r   ry   r{   Úsavedr   rz   r   Ú$test_dynamic_class_reset_on_unpickleÚ   s    z:TestCloudPickleIssues.test_dynamic_class_reset_on_unpickleÚ__main__z*Test cannot run as when module is __main__c                 C   s:   t dƒ}|jtd�}| ¡  |jdd� |  |jd¡ d S )NÚspawn)Útargeté<   ©Útimeoutr   )r   ÚProcessÚ"check_main_class_reset_on_unpickleÚstartÚjoinr_   Úexitcode)r   ÚmpÚprocr   r   r   Ú!test_main_class_reset_on_unpickleî   s
    z7TestCloudPickleIssues.test_main_class_reset_on_unpicklec                 C   sT   G dd„ dƒ}t |ƒ}tdƒ}|jt|fd�}| ¡  |jdd� |  |jd¡ d S )Nc                   @   s   e Zd ZdZdS )zRTestCloudPickleIssues.test_dynamic_class_reset_on_unpickle_new_proc.<locals>.KlassNrs   r   r   r   r   ru   ù   s   ru   r   )r€   r   r�   r‚   r   )r   r   r„   Ú!check_unpickle_dyn_class_new_procr†   r‡   r_   rˆ   )r   ru   r|   r‰   rŠ   r   r   r   Ú-test_dynamic_class_reset_on_unpickle_new_proc÷   s    zCTestCloudPickleIssues.test_dynamic_class_reset_on_unpickle_new_procc                 C   s   t  t¡}|  |ƒ d¡ d S )N)rw   rw   )ÚnumbaZnjitÚ
issue_7356r_   )r   Zcfuncr   r   r   Útest_dynamic_class_issue_7356  s    
z3TestCloudPickleIssues.test_dynamic_class_issue_7356N)rg   rh   ri   Ú__doc__Z_numba_parallel_test_r}   ÚunittestZskipIfr‹   r�   r�   r   r   r   r   rr   Õ   s   
ÿ
rr   c                   @   s   e Zd ZdZdS )ÚDynClassN)rg   rh   ri   r-   r   r   r   r   r“     s   r“   c               	   C   sJ   t jdd�� dt_tj} W 5 Q R X t jdd�� tj}W 5 Q R X | |fS )NZintp)Úbeforerw   )Úafter)rŽ   Zobjmoder“   r-   )r”   r•   r   r   r   r�     s    r�   c                  C   sN   t jddd�} | d }|jdks$t‚|jdks2t‚t|ƒ}d|_t||ƒ d S )Nz"numba.tests.cloudpickle_main_classr~   )Úrun_nameru   rw   )ÚrunpyÚ
run_modulerh   ÚAssertionErrorrt   r   Ú_check_dyn_class)Zglbsru   r|   r   r   r   r…     s    þr…   c                 C   s*   t | ƒ}|jdkst‚d|_t|| ƒ d S rv   )r   rt   r™   rš   )r|   ru   r   r   r   rŒ   *  s    rŒ   c                    sR   ‡ fdd„}|ƒ  t |ƒ}|ˆ k	r*tdƒ‚|ƒ  t |ƒ}|ˆ k	rHtdƒ‚|ƒ  d S )Nc                      s   ˆ j dkrtdƒ‚d S )Nrw   zCheck failed. Klass reset.)rt   r™   r   rx   r   r   r{   4  s    
z_check_dyn_class.<locals>.checkzExpected reuse)r   r™   )ru   r|   r{   Zloadedr   rx   r   rš   3  s    rš   r~   )rj   ra   r   r—   rR   rS   r’   Úmultiprocessingr   rŽ   Znumba.core.errorsr   Znumba.tests.supportr   Znumba.core.target_extensionr   Znumba.cloudpickler   r   Zserialize_usecasesr   rl   rr   r0   r“   r�   r…   rŒ   rš   rg   Úmainr   r   r   r   Ú<module>   s0    26		