o
    ۾i                     @   sF  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mZ d dlm	Z	 d dl
mZmZ d dlmZ d dlmZ dd Zd	d
 Zedv r`ejjjZejjjZejjjZejjjZejjjZejjjZdddddZeedkdG dd de	ZeedkdG dd de	ZeedkdG dd de	Ze dkre!  dS dS )    N)Mockcall)TestCase)jitobjmode)	PYVERSION)_numba_unpicklec                 C   s
   d| _ | S )z4Decorator to enable sys.monitoring on the dispatcherT)_enable_sysmon)disp r   S/home/ubuntu/.local/lib/python3.10/site-packages/numba/tests/test_sys_monitoring.pyr	      s   r	   c                     s(   t tddd   fdd}  | fS )Nint64(int64)c                 S      | d S N   r   xr   r   r   foo      zgenerate_usecase.<locals>.fooc                    s   d | d  S )N      r   r   r   r   r   call_foo   s   z"generate_usecase.<locals>.call_foo)r	   r   )r   r   r   r   generate_usecase   s
   r   )      )r      DebuggerCoverageProfiler	Optimizer)r   r   r   r   r   zneeds Python 3.12+c                   @   s   e Zd Zdd Zdd Zdd Zd*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 )+TestMonitoringc                 C   s   g }t dD ]}tj|d ur|t|  q|r'dd| }| | t \| _	| _
d| _| jd d | _d| j | _tjj| _d S )N   zVCannot run monitoring tests when other monitors are active, found monitor(s) of type: z, 
   r   r   r   )rangesys
monitoringget_toolappendTOOL2MONITORTYPEjoinskipTestr   r   r   arg
foo_resultcall_foo_resultPROFILER_IDtool_id)selfmonitor_kindsimsgr   r   r   setUp7   s   
zTestMonitoring.setUpc                 C   s`   |t  }| |jd dd t| jD }|d j}t| jj|t| j	jdf}|
| d S )Nr   c                 S   s   g | ]	}|j d kr|qS )RESUME)opname.0r   r   r   r   
<listcomp>S   s    
z7TestMonitoring.check_py_start_calls.<locals>.<listcomp>r   )PY_STARTassertEqual
call_countdisget_instructionsr   offsetr   __code__r   assert_has_calls)r2   allcalls	mockcallsinstrA   callsr   r   r   check_py_start_callsM   s   
z#TestMonitoring.check_py_start_callsc                 C   sd   |t  }| |jd dd t| jD d j}t| jj	d| j
t| jj	|| jg}|| d S )Nr   c                 S   s   g | ]}|qS r   r   r9   r   r   r   r;   f   s    z8TestMonitoring.check_py_return_calls.<locals>.<listcomp>r   )	PY_RETURNr=   r>   r?   r@   r   rA   r   r   rB   r.   r/   rC   )r2   rD   rE   rA   rG   r   r   r   check_py_return_calls[   s   z$TestMonitoring.check_py_return_callsNc           
      C   s   zU|d u r	| j }n|}tj|d i }d}|D ]}t }	tj|||	 |	||< ||O }qtj|| ||  W |D ]
}tj||d  q<tj|t tj| |S |D ]
}tj||d  qXtj|t tj| w )Ncustom_monitorr   )	r1   r&   r'   use_tool_idr   register_callback
set_events	NO_EVENTSfree_tool_id)
r2   functionargseventsr1   _tool_id	callbacksevent_bitmaskeventcallbackr   r   r   run_with_eventsk   s.   

zTestMonitoring.run_with_eventsc                 C   4   |  | j| jftf}| t|d | | d S r   )rZ   r   r-   r<   r=   lenrH   r2   cbr   r   r   test_start_event      zTestMonitoring.test_start_eventc                 C   r[   r   )rZ   r   r-   rJ   r=   r\   rK   r]   r   r   r   test_return_event   r`   z TestMonitoring.test_return_eventc                 C   s@   |  | j| jfttf}| t|d | | | | d S )Nr   )	rZ   r   r-   r<   rJ   r=   r\   rK   rH   r]   r   r   r   test_call_event_chain   s   
z$TestMonitoring.test_call_event_chainc           	      C   s8  t ddd }zV| j}tj|d i }d}ttf}|D ]}t }tj||| |||< ||O }qtj	||j
| || j}W |D ]
}tj||d  qDtj	||j
d tj| n|D ]
}tj||d  qatj	||j
d tj| w | ||| j | t|d |t   |t   d S )Nr   c                 S   r   )Nr   r   r   r   r   r   r         zPTestMonitoring.test_instrumented_code_does_not_trigger_numba_events.<locals>.foorL   r   r   )r   r1   r&   r'   rM   r<   rJ   r   rN   set_local_eventsrB   r-   rQ   r=   py_funcr\   assert_not_called)	r2   r   r1   rV   rW   rT   rX   rY   resultr   r   r   4test_instrumented_code_does_not_trigger_numba_events   s:   

zCTestMonitoring.test_instrumented_code_does_not_trigger_numba_eventsc                 C   s   dd }zF| j }tj|d tj||jt tj|tt  t	|| j
}| ||| j
 W tj|td  tj||jd tj| d S tj|td  tj||jd tj| w )Nc                 S   r   r   r   r   r   r   r   r      s   zBTestMonitoring.test_instrumented_code_can_be_compiled.<locals>.foorL   r   )r1   r&   r'   rM   rd   rB   r<   rN   r   r   r-   r=   rQ   )r2   r   r1   rg   r   r   r   &test_instrumented_code_can_be_compiled   s   z5TestMonitoring.test_instrumented_code_can_be_compiledc                 C   sf   dd }t jjj}dd }||}| |d|f}||   |t}| |d|f}||   d S )Nc                    s(   | ddd  | d fdd}|S )Nzvoid()c                   s   s    dV  d S )Nr$   r   r   r   r   r   producer   s   
zTTestMonitoring.test_unhandled_events_are_ignored.<locals>.generate.<locals>.producerzint64()c                     s     } t | S N)next)prj   r   r   consumer   s   zTTestMonitoring.test_unhandled_events_are_ignored.<locals>.generate.<locals>.consumerr   )decro   r   rn   r   generate   s
   
zBTestMonitoring.test_unhandled_events_are_ignored.<locals>.generatec                 S   s   dd S )Nc                 S   s   | S rk   r   )fnr   r   r   <lambda>   s    zTTestMonitoring.test_unhandled_events_are_ignored.<locals>.<lambda>.<locals>.<lambda>r   )sigr   r   r   rs      s    zBTestMonitoring.test_unhandled_events_are_ignored.<locals>.<lambda>r   )r&   r'   rT   PY_YIELDrZ   assert_called_oncer   rf   )r2   rq   rX   wrapperpy_consumerpy_cbnb_consumernb_cbr   r   r   !test_unhandled_events_are_ignored   s   
z0TestMonitoring.test_unhandled_events_are_ignoredc              
   C   s   zHt }| j}tj|d tj|| tj|}| || | | j	}tj|}| || | || j
 W tj|t tj| d S tj|t tj| w )NrL   )r<   r1   r&   r'   rM   rO   
get_eventsr=   r   r-   r/   rP   rQ   )r2   rX   r1   active_eventsrg   r   r   r    test_event_with_no_callback_runs   s   z/TestMonitoring.test_event_with_no_callback_runsc                 C   s  t tjjd}zat}| j}tj|d tj|| tj||| tj	|}| 
|| | | j}tj	|}| 
|| | 
|| j |  W tj  tj||d  tj|t tj| d S tj  tj||d  tj|t tj| w )N)return_valuerL   )r   r&   r'   DISABLEr<   r1   rM   rO   rN   r}   r=   r   r-   r/   assert_calledrestart_eventsrP   rQ   )r2   rY   rX   r1   r~   rg   r   r   r   test_disable_from_callback  s,   



z)TestMonitoring.test_disable_from_callbackc                    s   z`| j tjd t t }tj |  fddttdfdd}|d |	  |d tj
t |  | |jd	 W tj
t tj d  tj d S tj
t tj d  tj w )
NrL   c                    s   | rt j  d S d S rk   )r&   r'   rO   )switch_on_event)rX   r1   r   r   objmode_enable_event>  s   zGTestMonitoring.test_mutation_from_objmode.<locals>.objmode_enable_eventr   c                    s:   t   |  W d    | d S 1 sw   Y  | d S )N   )r   )enable)r   r   r   r   B  s   

z6TestMonitoring.test_mutation_from_objmode.<locals>.foor   r   r   )r1   r&   r'   rM   rJ   r   rN   r	   r   rf   rO   rP   r   r=   r>   rQ   )r2   rY   r   r   )rX   r   r1   r   test_mutation_from_objmode2  s,   z)TestMonitoring.test_mutation_from_objmodec                 C   s  t jjtft jjtft jjtft jjttfi}i }zt|	 D ]2\}}t j
|d|  d}i }|||< |D ]}t }|tkrGt j||| |||< ||O }q6q| D ]	}t j|| qU| | j W |	 D ]"\}}|D ]}|tkr~t j||d  qpt j|t t j| qjn(|	 D ]"\}}|D ]}|tkrt j||d  qt j|t t j| qw |t jj }	| t|	d |	t }|  |t jj }
| t|
d | |
 |t jj }| t|d | | |t jj }| t|d | | | | d S )Ncustom_monitor_r   r   r   )r&   r'   DEBUGGER_IDrP   COVERAGE_IDr<   r0   rJ   OPTIMIZER_IDitemsrM   r   rN   keysrO   r   r-   rQ   r=   r\   rf   rH   rK   )r2   tool_ids_2_eventsall_callbacksr1   rT   rW   rV   rX   rY   dbg_toolcov_tool	prof_toolopt_toolr   r   r   test_multiple_tool_id\  sl   




	


z$TestMonitoring.test_multiple_tool_idc                    s  t  }t  }t  }d ttd fdd}d }z| j}tj|d tj|t| tj|t	| tj|t
| tj|tt	B t
B  z|  W n tya } z|}W Y d }~nd }~ww tj|t |  |jd }| |jd tj | |jd d t | |jd d d   |  |jd }	| |	jd tj | |	jd t |jd }
| |
jd |jj | |
jd t |  t|
jd  |  |jd }| |jd |jj | |jd t |  t|jd  W tj|t tj|td  tj|t	d  tj|t
d  tj| n&tj|t tj|td  tj|t	d  tj|t
d  tj| w |  t| d S )	Nexception raised()c                         t  rk   )
ValueErrorr   r5   r   r   r     r   z9TestMonitoring.test_raising_under_monitoring.<locals>.foorL   r   r   r   )r   r	   r   r1   r&   r'   rM   rN   rJ   RAISE	PY_UNWINDrO   r   rP   rv   call_args_listr=   rS   r   rB   r   assertIsInstanceKeyErrorre   assertInstrrQ   )r2   ret_callbackraise_callbackunwind_callbackr   store_raisedr1   raisesthe_callnumba_unpickle_callfoo_callunwind_callr   r   r   test_raising_under_monitoring  sn   





z,TestMonitoring.test_raising_under_monitoringc                    s  t  }t  }t  }d ttd fdd}d }z| j}tj|d tj|t| tj|t	| tj|t
| tj|tt
B t	B  z|  W n tya } z|}W Y d }~nd }~ww tj|t |  |jd }| |jd tj | |jd d t | |jd d d   |  | |jd	 |jd }	| |	jd tj | |	jd t |jd }
| |
jd |jj | |
jd t |  t|
jd  |jd }t j}| |jd | | |jd t |  t|jd  |  W tj|t tj|td  tj|t
d  tj|t	d  tj| n&tj|t tj|td  tj|t
d  tj|t	d  tj| w |  t| d S )
Nr   r   c                      r   rk   )StopIterationr   r   r   r   r     r   z@TestMonitoring.test_stop_iteration_under_monitoring.<locals>.foorL   r   r   r   r   )r   r	   r   r1   r&   r'   rM   rN   rJ   r   STOP_ITERATIONrO   r   rP   rv   r   r=   rS   r   rB   r   r>   r   r   re   r   r   	_getframef_coderf   rQ   )r2   return_callbackr   stopiter_callbackr   r   r1   r   r   r   r   	meth_calltest_method_coder   r   r   $test_stop_iteration_under_monitoring  s~   










z3TestMonitoring.test_stop_iteration_under_monitoringc                 C   s   d}t t|d}d }zOz#t}| j}tj|d tj|| tj||| | 	| j
 W n tyC } z|}W Y d }~nd }~ww W tj||d  tj|t tj| ntj||d  tj|t tj| w |  | |t| d S )Ndeliberately broken callbackside_effectrL   )r   r   r<   r1   r&   r'   rM   rO   rN   r   r-   rP   rQ   rv   r   r   )r2   r5   rY   r   rX   r1   r   r   r   r   6test_raising_callback_unwinds_from_jit_on_success_path2  s.   zETestMonitoring.test_raising_callback_unwinds_from_jit_on_success_pathc                    s  d}dt t|d}G dd dt ttd fdd}d }zLz t}| j}tj	|d	 tj
|| tj||| |  W n tyW } z|}W Y d }~nd }~ww W tj||d  tj
|t tj| ntj||d  tj
|t tj| w |  | |jd
 |jd }| |jd tj | |jd t |jd }	| |	jd |jj | |	jd |j |jd }
t j}| |
jd | | |
jd |j | ||j d S )Nr   deliberately broken executionr   c                   @      e Zd ZdS )z]TestMonitoring.test_raising_callback_unwinds_from_jit_on_raising_path.<locals>.LocalExceptionN__name__
__module____qualname__r   r   r   r   LocalExceptionZ      r   r   c                          rk   r   r   r   msg_executionr   r   raising]  r   zVTestMonitoring.test_raising_callback_unwinds_from_jit_on_raising_path.<locals>.raisingrL   r   r   r   r   )r   r   	Exceptionr	   r   r   r1   r&   r'   rM   rO   rN   rP   rQ   r   r=   r>   r   rS   r   rB   r   r   re   assertIsr   r   r   )r2   msg_callbackrY   r   r   rX   r1   r   r   raising_callr   r   r   r   r   6test_raising_callback_unwinds_from_jit_on_raising_pathM  sN   




zETestMonitoring.test_raising_callback_unwinds_from_jit_on_raising_pathc           	         sp  d}dt t|d}G dd dt ttd fdd}d }zLz t}| j}tj	|d	 tj
|| tj||| |  W n tyW } z|}W Y d }~nd }~ww W tj||d  tj
|t tj| ntj||d  tj
|t tj| w |  |jd
 }| |jd
 |jj | t|jd   | t|jd  | ||j d S )Nr   r   r   c                   @   r   )z\TestMonitoring.test_raising_callback_unwinds_from_jit_on_unwind_path.<locals>.LocalExceptionNr   r   r   r   r   r     r   r   r   c                      r   rk   r   r   r   r   r   r     r   zUTestMonitoring.test_raising_callback_unwinds_from_jit_on_unwind_path.<locals>.raisingrL   r   r   )r   r   r   r	   r   r   r1   r&   r'   rM   rO   rN   rP   rQ   rv   r   r=   rS   re   rB   typer   r   r   )	r2   r   rY   r   r   rX   r1   r   r   r   r   r   5test_raising_callback_unwinds_from_jit_on_unwind_path  s@   	

zDTestMonitoring.test_raising_callback_unwinds_from_jit_on_unwind_pathc           
         s   dd }dd }t  }tj| |fd}t  }tj| |fd}||f}|D ]}|  q(|D ]}|  q1 fdd}	|	| |	| d S )Nc              
   S   p   z| j | j| jftftjjd}| t|d | 	| W d S  t
y7 } z|| W Y d }~d S d }~ww N)r1   r   )rZ   r   r-   r<   r&   r'   r   r=   r\   rH   r   putr2   qr^   er   r   r   t1_work     z@TestMonitoring.test_monitoring_multiple_threads.<locals>.t1_workc              
   S   r   r   )rZ   r   r-   rJ   r&   r'   r   r=   r\   rK   r   r   r   r   r   r   t2_work  r   z@TestMonitoring.test_monitoring_multiple_threads.<locals>.t2_work)targetrS   c                    s:   |   dkr|  st|   |  r
 d d S d S )Nr   zqueue supposed to be empty)qsizeemptyprintgetfail)r   r2   r   r   assert_empty_queue  s   zKTestMonitoring.test_monitoring_multiple_threads.<locals>.assert_empty_queue)queueQueue	threadingThreadstartr+   )
r2   r   r   q1t1q2t2threadstr   r   r   r    test_monitoring_multiple_threads  s   

z/TestMonitoring.test_monitoring_multiple_threadsrk   )r   r   r   r6   rH   rK   rZ   r_   ra   rb   rh   ri   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   .   s*    	
!$*ACR;0r"   c                   @   s   e Zd Zdd ZdS )TestMonitoringSelfTestc                 C   s,   | j tjddddid}| dt| d S )Nr"   r_   z-mcProfile)flagsz	skipped=1)subprocess_test_runnerr"   r   r   r   )r2   rr   r   r   +test_skipping_of_tests_if_monitoring_in_use  s   zBTestMonitoringSelfTest.test_skipping_of_tests_if_monitoring_in_useN)r   r   r   r   r   r   r   r   r     s    r   c                   @   sT   e Zd Zejddiddd Zejddiddd Zejdd	idd
d ZdS )TestMonitoringEnvVarControlNUMBA_ENABLE_SYS_MONITORING )envvarsc                 C      t dd }| |j d S )Nc                 S   r   r   r   r   r   r   r   r     rc   z9TestMonitoringEnvVarControl.test_default_off.<locals>.foor   assertFalser	   r2   r   r   r   r   test_default_off     
z,TestMonitoringEnvVarControl.test_default_off0c                 C   r   )Nc                 S   r   r   r   r   r   r   r   r     rc   z:TestMonitoringEnvVarControl.test_override_off.<locals>.foor   r   r   r   r   test_override_off  r   z-TestMonitoringEnvVarControl.test_override_off1c                 C   r   )Nc                 S   r   r   r   r   r   r   r   r     rc   z9TestMonitoringEnvVarControl.test_override_on.<locals>.foo)r   
assertTruer	   r   r   r   r   test_override_on  r   z,TestMonitoringEnvVarControl.test_override_onN)r   r   r   r   run_test_in_subprocessr   r   r   r   r   r   r   r     s    

r   __main__)"r?   r   r&   r   unittestunittest.mockr   r   numba.tests.supportr   numbar   r   numba.core.utilsr   numba.core.serializer   r	   r   r'   rT   r<   rJ   r   r   r   rP   r*   
skipUnlessr"   r   r   r   mainr   r   r   r   <module>   sL    





     ?