U
    ,d`,                     @   s  d dl Zd dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZmZ d dlmZ d dlZe Zde_e Z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dd Zdd ZG dd deZedkre   dS )    N)compile_isolatedFlags)jitnjit)typeserrors)TestCaseTc                   @   s   e Zd ZdS )MyErrorN__name__
__module____qualname__ r   r   ?/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_exceptions.pyr	      s   r	   c                   @   s   e Zd ZdS )
OtherErrorNr
   r   r   r   r   r      s   r   c                       s0   e Zd Z fddZdd Z fddZ  ZS )UDEArgsToSuperc                    s   t t| | || _d S N)superr   __init__value0selfargr   	__class__r   r   r      s    zUDEArgsToSuper.__init__c                 C   s8   t || jsdS d}|| j|jkO }|| j|jkO }|S NFT)
isinstancer   argsr   r   otherZsamer   r   r   __eq__   s    zUDEArgsToSuper.__eq__c                    s   t tt | jfS r   )hashr   r   __hash__r   r   r   r   r   r"   &   s    zUDEArgsToSuper.__hash__r   r   r   r   r    r"   __classcell__r   r   r   r   r      s   r   c                       s0   e Zd Z fddZdd Z fddZ  ZS )UDENoArgSuperc                    s   t t|   || _|| _d S r   )r   r&   r   deferargr   r   r   r   r   r   +   s    zUDENoArgSuper.__init__c                 C   sH   t || jsdS d}|| j|jkO }|| j|jkO }|| j|jkO }|S r   )r   r   r   r'   r   r   r   r   r   r    0   s    zUDENoArgSuper.__eq__c                    s   t tt | j| jfS r   )r!   r   r&   r"   r'   r   r#   r   r   r   r"   9   s    zUDENoArgSuper.__hash__r$   r   r   r   r   r&   *   s   	r&   c                    s    fdd}|S )Nc                    s0   | dkr n| dkrt n| dkr,tjj| S N         
ValueErrornplinalgLinAlgErroriexcr   r   raiser?   s    zraise_class.<locals>.raiserr   )r4   r5   r   r3   r   raise_class>   s    	r6   c                    s    fdd}|S )Nc                    sB   | dkr dn*| dkr(t  dn| dkr>tj d| S r(   r,   r1   r   r4   r   r   r5   L   s    zraise_instance.<locals>.raiserr   )r4   r   r5   r   r7   r   raise_instanceK   s    r8   c                    C   s    d S r   r   r   r   r   r   reraiseW   s    r9   c                    s    fdd}|S )Nc                    s   | dkrt dd | S )Nr+   bar)r   r1   innerr   r   outer\   s    
zouter_function.<locals>.outerr   )r<   r=   r   r;   r   outer_function[   s    r>   c                 C   s   | dkst dd S )Nr)   r:   )AssertionErrorr1   r   r   r   assert_usecasec   s    r@   c                   C   s
   t  d S r   r   r   r   r   r   ude_bug_usecaseg   s    rB   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d!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7S )8TestRaisingc              	   C   s   dd }t |ttjddtjf}|j}tjdtjd}| ||d||d | t	}||d W 5 Q R X | t
|jd d S )	Nc                 S   s
   | j | S r   )shape)ar2   r   r   r   pyfuncn   s    z5TestRaising.test_unituple_index_error.<locals>.pyfuncr)   Ar*   )Zdtyper   ztuple index out of range)r   r   Arrayint32entry_pointr.   emptyassertEqualassertRaises
IndexErrorstr	exception)r   rF   crescfuncrE   cmr   r   r   test_unituple_index_errorm   s    z%TestRaising.test_unituple_index_errorc              	   G   s,  |t tfkst| |}||  W 5 Q R X | |}||  W 5 Q R X | |jj|jj t|jtt	fr| 
|j|jk |tkr(z||  W n. tk
r   tjt  }|dd  }	Y nX z||  W n0 tk
r   tjt  }
|
dd  }Y nX t|	|D ]\}}| || qd S )N)force_pyobj_flagsno_pyobj_flagsr?   rM   rL   rP   r   r   r   r&   
assertTrue	Exception	tracebackformat_exceptionsysexc_infozip)r   Z	exec_moderF   rR   Zexpected_error_classr   ZpyerrZjiterrZ	py_framesZexpected_framesZc_framesZ
got_framesZexpfZgotfr   r   r   check_against_python}   s*    
z TestRaising.check_against_pythonc                 C   sp   t t}t|tjf|d}|j}| |dd | |||td | |||td | |||t	j
j
jd d S )Nflagsr   r)   r*   r+   )r6   r	   r   r   rI   rJ   rL   r_   r-   r.   r/   r0   r   ra   rF   rQ   rR   r   r   r   check_raise_class   s    
 zTestRaising.check_raise_classc                 C   s   | j td d S Nr`   )rc   rW   r#   r   r   r   test_raise_class_nopython   s    z%TestRaising.test_raise_class_nopythonc                 C   s   | j td d S rd   )rc   rV   r#   r   r   r   test_raise_class_objmode   s    z$TestRaising.test_raise_class_objmodec                 C   s   t ttfD ]r}t|d}t|tjf|d}|j}| |dd | 	||||d | 	|||t
d | 	|||tjjjd q
d S )Nsome messager`   r   r)   r*   r+   )r	   r   r&   r8   r   r   rI   rJ   rL   r_   r-   r.   r/   r0   )r   ra   clazzrF   rQ   rR   r   r   r   check_raise_instance   s    

 z TestRaising.check_raise_instancec                 C   s   | j td d S rd   )ri   rV   r#   r   r   r   test_raise_instance_objmode   s    z'TestRaising.test_raise_instance_objmodec                 C   s   | j td d S rd   )ri   rW   r#   r   r   r   test_raise_instance_nopython   s    z(TestRaising.test_raise_instance_nopythonc                 K   s|   t ttfD ]l}t|d}t|}tf ||}tf |t|}| ||||d | |||td | |||td q
dS )zD
        Check exception propagation from nested functions.
        rg   r)   r*   r+   N)	r	   r   r&   r8   r>   r   r_   r-   r   )r   ra   Zjit_argsrh   Zinner_pyfuncrF   Zinner_cfuncrR   r   r   r   check_raise_nested   s    
zTestRaising.check_raise_nestedc                 C   s   | j tdd d S )NT)Zforceobj)rl   rV   r#   r   r   r   test_raise_nested_objmode   s    z%TestRaising.test_raise_nested_objmodec                 C   s   | j tdd d S )NT)Znopython)rl   rW   r#   r   r   r   test_raise_nested_nopython   s    z&TestRaising.test_raise_nested_nopythonc                    s   dd t }t|d|d}|j}fddtffddtffddtffD ]6\  fd	d
}||}||}| |||  qNd S )Nc                 S   s   | d S r   r   r3   r   r   r   	raise_exc   s    z,TestRaising.check_reraise.<locals>.raise_excr   r`   c                      s    t S r   )ZeroDivisionErrorr   ro   r   r   <lambda>       z+TestRaising.check_reraise.<locals>.<lambda>c                      s    t ddS Nmsgr)   rA   r   rq   r   r   rr      rs   c                      s    t ddS rt   )r&   r   rq   r   r   rr      rs   c                    s    fdd}|S )Nc                      s*   z
  W n  k
r$     Y nX d S r   r   r   )errfnopr   r   impl   s    
z9TestRaising.check_reraise.<locals>.gen_impl.<locals>.implr   )rw   ry   )rv   rx   )rw   r   gen_impl   s    z+TestRaising.check_reraise.<locals>.gen_impl)r9   r   rJ   rp   r   r&   r_   )r   ra   rF   rQ   rR   rz   ZpybasedZcbasedr   )rv   rx   ro   r   check_reraise   s$    


zTestRaising.check_reraisec                 C   s   | j td d S rd   )r{   rV   r#   r   r   r   test_reraise_objmode   s    z TestRaising.test_reraise_objmodec                 C   s   | j td d S rd   )r{   rW   r#   r   r   r   test_reraise_nopython   s    z!TestRaising.test_reraise_nopythonc              	   C   sT   t |}t|tjf|d}|j}| t}|d W 5 Q R X | t|j	d d S )Nr`   r)   z)exceptions must derive from BaseException)
r6   r   r   rI   rJ   rM   	TypeErrorrL   rO   rP   )r   clsra   rF   rQ   rR   rS   r   r   r   check_raise_invalid_class   s    z%TestRaising.check_raise_invalid_classc                 C   s    | j ttd | j dtd d S )Nr`   r)   )r   intrV   r#   r   r   r    test_raise_invalid_class_objmode  s    z,TestRaising.test_raise_invalid_class_objmodec              	   C   sx   d}|  tj}| jttd W 5 Q R X | |t|j |  tj}| jdtd W 5 Q R X | |t|j d S )Nz8Encountered unsupported constant type used for exceptionr`   r)   )	rM   r   UnsupportedErrorr   r   rW   assertInrO   rP   )r   ru   raisesr   r   r   !test_raise_invalid_class_nopython  s    z-TestRaising.test_raise_invalid_class_nopythonc              	   C   sD   t dd }d}| tj}|  W 5 Q R X | |t|j d S )Nc                   S   s   dd S )Nillegalr   r   r   r   r   foo  s    z8TestRaising.test_raise_bare_string_nopython.<locals>.foozCDirectly raising a string constant as an exception is not supported)r   rM   r   r   r   rO   rP   )r   r   ru   r   r   r   r   test_raise_bare_string_nopython  s    
z+TestRaising.test_raise_bare_string_nopythonc                 C   s:   t }t|tjf|d}|j}|d | |||td d S )Nr`   r)   r*   )r@   r   r   rI   rJ   r_   r?   rb   r   r   r   check_assert_statement  s
    z"TestRaising.check_assert_statementc                 C   s   | j td d S rd   )r   rV   r#   r   r   r   test_assert_statement_objmode  s    z)TestRaising.test_assert_statement_objmodec                 C   s   | j td d S rd   )r   rW   r#   r   r   r   test_assert_statement_nopython"  s    z*TestRaising.test_assert_statement_nopythonc           
      C   sr   d}d}|t f|tf|tffD ]N\}}i }t|d|i| |d }t|tjf|d}|j}	| |||	|d qd S )Nz def f(a):
  raise exc('msg', 10)zdef f(a):
  assert a != 1r4   fr`   r)   )	r?   r   r&   execr   r   rI   rJ   r_   )
r   ra   Zsimple_raiseZassert_raiseZf_textr4   locrF   rQ   rR   r   r   r   check_raise_from_exec_string%  s    z(TestRaising.check_raise_from_exec_stringc                 C   s   | j td d S rd   )r   rV   r#   r   r   r   $test_assert_from_exec_string_objmode3  s    z0TestRaising.test_assert_from_exec_string_objmodec                 C   s   | j td d S rd   )r   rW   r#   r   r   r   %test_assert_from_exec_string_nopython6  s    z1TestRaising.test_assert_from_exec_string_nopythonc                 C   s,   t }t|d|d}|j}| |||t d S )Nr   r`   )rB   r   rJ   r_   r~   rb   r   r   r   check_user_code_error_traceback9  s    z+TestRaising.check_user_code_error_tracebackc                 C   s   | j td d S rd   )r   rV   r#   r   r   r   &test_user_code_error_traceback_objmodeB  s    z2TestRaising.test_user_code_error_traceback_objmodec                 C   s   | j td d S rd   )r   rW   r#   r   r   r   'test_user_code_error_traceback_nopythonE  s    z3TestRaising.test_user_code_error_traceback_nopythonN)r   r   r   rT   r_   rc   re   rf   ri   rj   rk   rl   rm   rn   r{   r|   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rC   k   s6   &
		
	rC   __main__)!Znumpyr.   r\   rZ   Znumba.core.compilerr   r   Znumbar   r   Z
numba.corer   r   Znumba.tests.supportr   ZunittestrV   Zforce_pyobjectrW   rY   r	   r   r   r&   r6   r8   r9   r>   r@   rB   rC   r   mainr   r   r   r   <module>   s0    _