U
    9%eH)                     @   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re  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/Darija-Ai-API/env/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	Exception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	      )r4      )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forceobjrA   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$   r:   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$   r:   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$   )r7   )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 rG   )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        )rK   )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.   r3   y      @      ?)y              ?r4   )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=   zif 1:
            import pickle

            data = {pickled!r}
            func = pickle.loads(data)
            res = func(4.0)
            assert res == 8.0, res
            -cN)	rE   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%   r7   r4   r8   
   r'         *   +         N)
r9   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
        rP   N)rS   r$   rT   rU   )r   rV   r   r   r   test_imp_deprecation   s    z+TestDispatcherPickling.test_imp_deprecationN)__name__
__module____qualname__r   
contextlibcontextmanagerr   r$   r*   r0   r2   r5   r6   r<   r@   rB   rC   rD   rF   rI   rJ   rM   rO   rW   rf   rg   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.serializern   r1   r   r   hashidra   r_   )r   rn   Z
random_objZbytebufhashedZgot1Zgot2r   r   r   test_numba_unpickle   s    
z)TestSerializationMisc.test_numba_unpickleN)rh   ri   rj   rr   r   r   r   r   rm      s   rm   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rh   ri   rj   classvarr   r   r   r   Klass   s   rv   c                      s
   d _ d S Nd   )ru   r   rv   r   r   mutator   s    zKTestCloudPickleIssues.test_dynamic_class_reset_on_unpickle.<locals>.mutatorc                      s     jd d S rw   )r`   ru   r   rv   r   r   r   check   s    zITestCloudPickleIssues.test_dynamic_class_reset_on_unpickle.<locals>.checkr   )r   rz   r|   savedr   r{   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>.KlassNrt   r   r   r   r   rv      s   rv   r   )r   r   r   r   r   )r   r   r   !check_unpickle_dyn_class_new_procr   r   r`   r   )r   rv   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)rx   rx   )numbaZnjit
issue_7356r`   )r   Zcfuncr   r   r   test_dynamic_class_issue_7356  s    
z3TestCloudPickleIssues.test_dynamic_class_issue_7356N)rh   ri   rj   __doc__Z_numba_parallel_test_r~   unittestZskipIfr   r   r   r   r   r   r   rs      s   

rs   c                   @   s   e Zd ZdZdS )DynClassN)rh   ri   rj   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)beforerx   )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   )Zrun_namerv   rx   )runpyZ
run_moduleri   AssertionErrorru   r   _check_dyn_class)Zglbsrv   r}   r   r   r   r     s    r   c                 C   s*   t | }|jdkstd|_t||  d S rw   )r   ru   r   r   )r}   rv   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 )Nrx   zCheck failed. Klass reset.)ru   r   r   ry   r   r   r|   4  s    
z_check_dyn_class.<locals>.checkzExpected reuse)r   r   )rv   r}   r|   Zloadedr   ry   r   r   3  s    r   r   )rk   rb   r   r   rS   rT   r   multiprocessingr   r   Znumba.core.errorsr   Znumba.tests.supportr   Znumba.core.target_extensionr   Znumba.cloudpickler   r   Zserialize_usecasesr   rm   rs   r1   r   r   r   r   r   rh   mainr   r   r   r   <module>   s0    26		