U
    Ã9%eXu  ã                   @   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mZ d dl	m
Z
 d dlmZmZ d dlmZmZmZmZ d dlmZ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  d dl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z* d dl+Z+eƒ Z,de,_e+ -ej .d¡ d¡Z/e+ -e 0¡ dkd¡Z1G dd„ de2ƒZ3G dd„ de+j#ƒZ4G dd„ de+j#ƒZ5G dd„ de+j#ƒZ6G dd„ de#ƒZ7G dd„ de+j#ƒZ8e'G dd„ de"e#ƒƒZ9G d d!„ d!e#ƒZ:e;d"krÊe+ <¡  dS )#é    N©Únjit)Útypes)Úcompile_isolatedÚFlags)ÚrtsysÚnrtoptÚ_nrt_pythonÚnrt)Ú	intrinsicÚinclude_path)Ú	signature)Úimpl_ret_untracked)Úir©ÚNRT_get_api)ÚEnableNRTStatsMixinÚTestCaseÚtemp_directoryÚimport_dynamicÚskip_if_32bitÚskip_unless_cffiÚrun_in_subprocess)Ú
cpu_targetTÚlinuxzlinux only test)Úi386Úx86_64zx86 only testc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚDummyr   c                 C   s   t | ƒ jd7  _d S ©Né   ©ÚtypeÚalive©Úself© r%   úS/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/tests/test_nrt.pyÚ__init__+   s    zDummy.__init__c                 C   s   t | ƒ jd8  _d S r   r    r#   r%   r%   r&   Ú__del__.   s    zDummy.__del__N)Ú__name__Ú
__module__Ú__qualname__r"   r'   r(   r%   r%   r%   r&   r   (   s   r   c                   @   s   e Zd ZdZdZdd„ ZdS )ÚTestNrtMemInfoNotInitializedzn
    Unit test for checking the use of the NRT fails if the
    initialization sequence has not been run.
    Fc              
   C   st   ddddœ}|  ¡ D ]Z\}}zH|  t¡}dt_tt|ƒ}||Ž  W 5 Q R X d}|  |t|jƒ¡ W 5 dt_X qd S )Nr%   )r%   r%   )r%   )ZlibraryÚmeminfo_newÚmeminfo_allocTFz'Runtime must be initialized before use.)	Úitemsr   Ú_initÚassertRaisesÚRuntimeErrorÚgetattrÚassertInÚstrÚ	exception)r$   ÚmethodsÚmethÚargsÚraisesÚfnÚmsgr%   r%   r&   Útest_init_fail9   s    þ
z+TestNrtMemInfoNotInitialized.test_init_failN)r)   r*   r+   Ú__doc__Z_numba_parallel_test_r=   r%   r%   r%   r&   r,   2   s   r,   c                       s\   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	e
dd„ ƒZdd„ Z‡  ZS )ÚTestNrtMemInfoz2
    Unit test for core MemInfo functionality
    c                    s$   dt _t tj¡ tt| ƒ ¡  d S )Nr   )	r   r"   r   Ú
initializer   Útarget_contextÚsuperr?   ÚsetUpr#   ©Ú	__class__r%   r&   rC   Q   s    zTestNrtMemInfo.setUpc                 C   s   t ƒ }|  t jd¡ d}t ||¡}|  |jd¡ ~|  t jd¡ | ¡  |  |jd¡ |  t jd¡ | ¡  |  |jd¡ ~|  t jd¡ d S )Nr   ì   þJ[= é   r   )r   ÚassertEqualr"   r   r-   ÚrefcountÚacquireÚrelease)r$   ÚdÚaddrÚmir%   r%   r&   Útest_meminfo_refct_1X   s    z#TestNrtMemInfo.test_meminfo_refct_1c                 C   s¬   t ƒ }|  t jd¡ d}t ||¡}|  |jd¡ ~|  t jd¡ tdƒD ]}| ¡  qJ|  |jd¡ |  t jd¡ tdƒD ]}| ¡  q||  |jd¡ ~|  t jd¡ d S )Nr   rF   éd   ée   r   )	r   rH   r"   r   r-   rI   ÚrangerJ   rK   )r$   rL   rM   rN   ÚctÚ_r%   r%   r&   Útest_meminfo_refct_2i   s     

z#TestNrtMemInfo.test_meminfo_refct_2c                 C   s¾   t ƒ }|  t jd¡ d}t ||¡}|  |jd¡ t|ƒ}|  |jd¡ |  ||j¡ |  |j	¡ |  
||j¡ |  |j¡ |  |jd¡ |  |jd¡ ~~|  t jd¡ ~|  t jd¡ d S )Nr   rF   r   )r   rH   r"   r   r-   rI   Ú
memoryviewÚdataÚassertFalseÚreadonlyÚassertIsÚobjÚ
assertTrueÚc_contiguousÚitemsizeÚndim)r$   rL   rM   rN   Úmviewr%   r%   r&   Útest_fake_memoryview|   s$    z#TestNrtMemInfo.test_fake_memoryviewc                 C   sh  ddl m}m}m}m} t tj¡}|jd }t	j
|dd}|j}|||jƒ||d ƒƒ}	tdƒD ]}
|  |	j|
 d¡ qbtdƒD ]}
|
d |	j|
< q‚t|ƒ}|  |j|¡ |  |j¡ |  ||j¡ |  |j¡ |  |jd¡ |  |jd¡ ~tj||j|j |d}~tj t |j¡d |¡ |d7 }tdƒD ]}
|  |	j|
 |
d	 ¡ q4|  |j j|¡ ~d S )
Nr   ©Úc_uint32Úc_void_pÚPOINTERÚcasté
   T©Úsafeì   ËK— r   ©ÚdtypeÚshapeÚbufferrG   )Úctypesrc   rd   re   rf   Únprl   Úuint32r^   r   r.   rW   rR   rH   ÚcontentsrV   ÚnbytesrX   rY   rZ   r[   r\   r]   r_   ÚndarrayÚtestingÚassert_equalÚarangeÚsize)r$   rc   rd   re   rf   rl   ÚbytesizerN   rM   Úc_arrÚir`   Úarrr%   r%   r&   Útest_memoryview’   s8    
ÿzTestNrtMemInfo.test_memoryviewc                 C   s$  ddl m}m}m}m} t tj¡}|jd }t	j
|dd}|  |jd¡ |j}|||ƒ||d ƒƒ}	tdƒD ]}
|  |	j|
 d¡ qntdƒD ]}
|
d |	j|
< qŽtj|||j |d}|  |jd¡ ~tj t |j¡d |¡ |d7 }tdƒD ]}
|  |	j|
 |
d	 ¡ qò|  |j j|¡ ~d S )
Nr   rb   rg   Trh   r   rj   rk   rG   )ro   rc   rd   re   rf   rp   rl   rq   r^   r   r.   rH   rI   rW   rR   rr   rt   ru   rv   rw   rx   )r$   rc   rd   re   rf   rl   ry   rN   rM   rz   r{   r|   r%   r%   r&   Útest_buffer»   s,    
ÿzTestNrtMemInfo.test_bufferc              
   C   s\   t jjd d }dD ]B}|  t¡}tj||d W 5 Q R X |  d|› dt|j	ƒ¡ qd S )Né   rG   ©TFrh   zRequested allocation of z bytes failed.)
r   Úsize_tÚmaxvalr1   ÚMemoryErrorr   r.   r4   r5   r6   )r$   rx   Úpredr:   r%   r%   r&   Útest_allocate_invalid_sizeß   s    ÿz)TestNrtMemInfo.test_allocate_invalid_sizec              
   C   sT   d}dD ]F}|   t¡}tj||d W 5 Q R X d|› d}|  |t|jƒ¡ qd S )Niöÿÿÿr€   rh   z,Cannot allocate a negative number of bytes: Ú.)r1   Ú
ValueErrorr   r.   r4   r5   r6   )r$   rx   r„   r:   r<   r%   r%   r&   Útest_allocate_negative_sizeé   s    z*TestNrtMemInfo.test_allocate_negative_size)r)   r*   r+   r>   rC   rO   rU   ra   r}   r~   r   r…   rˆ   Ú__classcell__r%   r%   rD   r&   r?   L   s   )$
	r?   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestTracemalloczB
    Test NRT-allocated memory can be tracked by tracemalloc.
    c                 C   sl   zdd l }W n tk
r*   |  d¡ Y nX | ¡  z(| ¡ }|ƒ }| ¡ }~| |d¡W ¢S | ¡  X d S )Nr   ztracemalloc not availableÚlineno)ÚtracemallocÚImportErrorZskipTestÚstartÚstopZtake_snapshotZ
compare_to)r$   ÚfuncrŒ   ÚbeforeÚresÚafterr%   r%   r&   Úmeasure_memory_diffù   s    z#TestTracemalloc.measure_memory_diffc                    sÒ   d‰ t j‰t‡ ‡fdd„ƒ‰‡fdd„}‡fdd„}|jjd }ˆƒ  |  |¡}|d	 }|  |jˆ ¡ | j|jˆ d
 dd |j	d	 }|  
tj |j¡d¡ |  
|j|¡ |  |¡}|d	 }|  |jˆ d ¡ d S )Ni@B c                      s   t  ˆ ˆ¡S )z<
            Allocate and return a large array.
            )rp   Úemptyr%   )ÚNrl   r%   r&   Úalloc_nrt_memory  s    z7TestTracemalloc.test_snapshot.<locals>.alloc_nrt_memoryc                      s   ˆ ƒ S ©Nr%   r%   ©r—   r%   r&   Úkeep_memory  s    z2TestTracemalloc.test_snapshot.<locals>.keep_memoryc                      s
   ˆ ƒ  d S r˜   r%   r%   r™   r%   r&   Úrelease_memory  s    z5TestTracemalloc.test_snapshot.<locals>.release_memoryr   r   g=
×£p=ð?zpUnexpected allocation overhead encountered. May be due to difference in CPython builds or running under coverage)r<   ztest_nrt.pyg{®Gáz„?)rp   Zint8r   Ú__code__Úco_firstlinenor”   ZassertGreaterEqualrx   Ú
assertLessÚ	tracebackrH   ÚosÚpathÚbasenameÚfilenamer‹   )r$   rš   r›   Zalloc_linenoÚdiffÚstatÚframer%   )r–   r—   rl   r&   Útest_snapshot	  s(    
ÿ

zTestTracemalloc.test_snapshotN)r)   r*   r+   r>   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ejd	d
„ ƒZ	dS )ÚTestNRTIssuec                    sh   t dd„ ƒ‰ t ‡ fdd„ƒ‰t ‡fdd„ƒ}d}tj |df¡}|||ƒ}| ||¡}tj ||¡ d	S )
zO
        GitHub Issue #1244 https://github.com/numba/numba/issues/1244
        c                 S   s   | \}}t  |d |d  ¡S )NrG   )ÚmathÚsqrt)ÚvectorÚxÚyr%   r%   r&   Úcalculate_2D_vector_mag9  s    zNTestNRTIssue.test_issue_with_refct_op_pruning.<locals>.calculate_2D_vector_magc                    s<   t jdt jd}ˆ | ƒ}| \}}|| |d< || |d< |S ©NrG   ©rl   r   r   )rp   r•   Úfloat64)r«   Únormalized_vectorÚmagr¬   r­   )r®   r%   r&   Únormalize_2D_vector?  s    zJTestNRTIssue.test_issue_with_refct_op_pruning.<locals>.normalize_2D_vectorc                    sV   t j| dft jd}t| ƒD ]4}|| }ˆ |ƒ}|d ||df< |d ||df< q|S r¯   )rp   r•   r±   rR   )Únum_vectorsZvectorsZnormalized_vectorsr{   r«   r²   )r´   r%   r&   Únormalize_vectorsK  s    zHTestNRTIssue.test_issue_with_refct_op_pruning.<locals>.normalize_vectorsrg   rG   N)r   rp   ÚrandomÚpy_funcru   Zassert_almost_equal)r$   r¶   rµ   Ztest_vectorsÚgotÚexpectedr%   )r®   r´   r&   Ú test_issue_with_refct_op_pruning5  s    

z-TestNRTIssue.test_issue_with_refct_op_pruningc                 C   s`   dd„ }t |dt tjt tjdd¡f¡ƒ}| ¡ \}}|  |d¡ |  |tj	dtjd¡ d S )Nc                   S   s   dt jdt jdfS )Ng        r   r°   )rp   ÚzerosÚint32r%   r%   r%   r&   Úfc  s    z.TestNRTIssue.test_incref_after_cast.<locals>.fr%   r   ÚCy                r°   )
r   r   ÚTupleZ
complex128ZArrayr½   Úentry_pointZassertPreciseEqualrp   r¼   )r$   r¾   ZcresÚzr|   r%   r%   r&   Útest_incref_after_cast`  s    ÿÿz#TestNRTIssue.test_incref_after_castc                 C   sB   t dd„ ƒ}|ƒ \}}tj ||¡ tj |tjdtjd¡ d S )Nc                  S   s0   t jdt jd} t jdt jd}| |d d … fS )Nrg   r°   )rp   Úonesr±   )ÚaÚbr%   r%   r&   r¾   r  s    z5TestNRTIssue.test_refct_pruning_issue_1511.<locals>.frg   r°   )r   rp   ru   rv   rÄ   r±   )r$   r¾   rÅ   rÆ   r%   r%   r&   Útest_refct_pruning_issue_1511q  s
    

z*TestNRTIssue.test_refct_pruning_issue_1511c                 C   sV   t dd„ ƒ}t ddddddddddg
g¡}| |dd¡}||ddƒ}|  ||¡ d S )Nc                 S   s`   t  | dk¡}t|d ƒdkr(d}d}n|d d }|d d }|d | }|d | }||fS )Nr   r   )rp   ÚwhereÚlen)Úimager¬   r­   Znext_locZy_offsetZx_offsetZ
next_loc_xZ
next_loc_yr%   r%   r&   Úudt}  s    z7TestNRTIssue.test_refct_pruning_issue_1526.<locals>.udtr   r   é   )r   rp   Úarrayr¸   rH   )r$   rË   rÅ   Úexpectr¹   r%   r%   r&   Útest_refct_pruning_issue_1526|  s    
 z*TestNRTIssue.test_refct_pruning_issue_1526c                 C   sR   ddl m} |  tj¡ |dd„ ƒ}|  tj¡ |  |ƒ | ¡ ¡ |  tj¡ d S )Nr   r   c                   S   s   dS )Né{   r%   r%   r%   r%   r&   Úfoo  s    z8TestNRTIssue.test_no_nrt_on_njit_decoration.<locals>.foo)Únumbar   rX   r   r0   rH   r¸   r\   )r$   r   rÑ   r%   r%   r&   Útest_no_nrt_on_njit_decoration“  s    
z+TestNRTIssue.test_no_nrt_on_njit_decorationN)
r)   r*   r+   r»   rÃ   rÇ   rÏ   r   Zrun_test_in_subprocessrÓ   r%   r%   r%   r&   r¨   4  s   +r¨   c                   @   s:   e Zd ZdZdd„ Ze d¡dd„ ƒZee	dd„ ƒƒZ
d	S )
ÚTestRefCtPruninga¡  
define i32 @"MyFunction"(i8** noalias nocapture %retptr, { i8*, i32 }** noalias nocapture %excinfo, i8* noalias nocapture readnone %env, double %arg.vt.0, double %arg.vt.1, double %arg.vt.2, double %arg.vt.3, double %arg.bounds.0, double %arg.bounds.1, double %arg.bounds.2, double %arg.bounds.3, i8* %arg.xs.0, i8* nocapture readnone %arg.xs.1, i64 %arg.xs.2, i64 %arg.xs.3, double* nocapture readonly %arg.xs.4, i64 %arg.xs.5.0, i64 %arg.xs.6.0, i8* %arg.ys.0, i8* nocapture readnone %arg.ys.1, i64 %arg.ys.2, i64 %arg.ys.3, double* nocapture readonly %arg.ys.4, i64 %arg.ys.5.0, i64 %arg.ys.6.0, i8* %arg.aggs_and_cols.0.0, i8* nocapture readnone %arg.aggs_and_cols.0.1, i64 %arg.aggs_and_cols.0.2, i64 %arg.aggs_and_cols.0.3, i32* nocapture %arg.aggs_and_cols.0.4, i64 %arg.aggs_and_cols.0.5.0, i64 %arg.aggs_and_cols.0.5.1, i64 %arg.aggs_and_cols.0.6.0, i64 %arg.aggs_and_cols.0.6.1) local_unnamed_addr {
entry:
tail call void @NRT_incref(i8* %arg.xs.0)
tail call void @NRT_incref(i8* %arg.ys.0)
tail call void @NRT_incref(i8* %arg.aggs_and_cols.0.0)
%.251 = icmp sgt i64 %arg.xs.5.0, 0
br i1 %.251, label %B42.preheader, label %B160

B42.preheader:                                    ; preds = %entry
%0 = add i64 %arg.xs.5.0, 1
br label %B42

B42:                                              ; preds = %B40.backedge, %B42.preheader
%lsr.iv3 = phi i64 [ %lsr.iv.next, %B40.backedge ], [ %0, %B42.preheader ]
%lsr.iv1 = phi double* [ %scevgep2, %B40.backedge ], [ %arg.xs.4, %B42.preheader ]
%lsr.iv = phi double* [ %scevgep, %B40.backedge ], [ %arg.ys.4, %B42.preheader ]
%.381 = load double, double* %lsr.iv1, align 8
%.420 = load double, double* %lsr.iv, align 8
%.458 = fcmp ole double %.381, %arg.bounds.1
%not..432 = fcmp oge double %.381, %arg.bounds.0
%"$phi82.1.1" = and i1 %.458, %not..432
br i1 %"$phi82.1.1", label %B84, label %B40.backedge

B84:                                              ; preds = %B42
%.513 = fcmp ole double %.420, %arg.bounds.3
%not..487 = fcmp oge double %.420, %arg.bounds.2
%"$phi106.1.1" = and i1 %.513, %not..487
br i1 %"$phi106.1.1", label %B108.endif.endif.endif, label %B40.backedge

B160:                                             ; preds = %B40.backedge, %entry
tail call void @NRT_decref(i8* %arg.ys.0)
tail call void @NRT_decref(i8* %arg.xs.0)
tail call void @NRT_decref(i8* %arg.aggs_and_cols.0.0)
store i8* null, i8** %retptr, align 8
ret i32 0

B108.endif.endif.endif:                           ; preds = %B84
%.575 = fmul double %.381, %arg.vt.0
%.583 = fadd double %.575, %arg.vt.1
%.590 = fptosi double %.583 to i64
%.630 = fmul double %.420, %arg.vt.2
%.638 = fadd double %.630, %arg.vt.3
%.645 = fptosi double %.638 to i64
tail call void @NRT_incref(i8* %arg.aggs_and_cols.0.0)              ; GONE 1
tail call void @NRT_decref(i8* null)                                ; GONE 2
tail call void @NRT_incref(i8* %arg.aggs_and_cols.0.0), !noalias !0 ; GONE 3
%.62.i.i = icmp slt i64 %.645, 0
%.63.i.i = select i1 %.62.i.i, i64 %arg.aggs_and_cols.0.5.0, i64 0
%.64.i.i = add i64 %.63.i.i, %.645
%.65.i.i = icmp slt i64 %.590, 0
%.66.i.i = select i1 %.65.i.i, i64 %arg.aggs_and_cols.0.5.1, i64 0
%.67.i.i = add i64 %.66.i.i, %.590
%.84.i.i = mul i64 %.64.i.i, %arg.aggs_and_cols.0.5.1
%.87.i.i = add i64 %.67.i.i, %.84.i.i
%.88.i.i = getelementptr i32, i32* %arg.aggs_and_cols.0.4, i64 %.87.i.i
%.89.i.i = load i32, i32* %.88.i.i, align 4, !noalias !3
%.99.i.i = add i32 %.89.i.i, 1
store i32 %.99.i.i, i32* %.88.i.i, align 4, !noalias !3
tail call void @NRT_decref(i8* %arg.aggs_and_cols.0.0), !noalias !0 ; GONE 4
tail call void @NRT_decref(i8* %arg.aggs_and_cols.0.0)              ; GONE 5
br label %B40.backedge

B40.backedge:                                     ; preds = %B108.endif.endif.endif, %B84, %B42
%scevgep = getelementptr double, double* %lsr.iv, i64 1
%scevgep2 = getelementptr double, double* %lsr.iv1, i64 1
%lsr.iv.next = add i64 %lsr.iv3, -1
%.294 = icmp sgt i64 %lsr.iv.next, 1
br i1 %.294, label %B42, label %B160
}
    c                 C   sú   | j }t| ¡ ƒ}dd„ |D ƒ}dd„ |D ƒ}t |¡}t| ¡ ƒ}dd„ |D ƒ}dd„ |D ƒ}|  ||¡ |  ||¡ t|ƒt|ƒ }	t|ƒt|ƒ }
|	|
B }|  ||	|
A ¡ d |¡}dD ]}d 	|¡}|  
||¡ q¾|  tt| ¡ ƒƒt|ƒ¡ d S )	Nc                 S   s   g | ]}d |kr|‘qS ©Z
NRT_increfr%   ©Ú.0Úlnr%   r%   r&   Ú
<listcomp>ù  s      zDTestRefCtPruning.test_refct_pruning_op_recognize.<locals>.<listcomp>c                 S   s   g | ]}d |kr|‘qS ©Z
NRT_decrefr%   rÖ   r%   r%   r&   rÙ   ú  s      c                 S   s   g | ]}d |kr|‘qS rÕ   r%   rÖ   r%   r%   r&   rÙ   ÿ  s      c                 S   s   g | ]}d |kr|‘qS rÚ   r%   rÖ   r%   r%   r&   rÙ      s      Ú
)r   rG   é   é   é   z	; GONE {})Úsample_llvm_irÚlistÚ
splitlinesr   Z_remove_redundant_nrt_refctZassertNotEqualÚsetrH   ÚjoinÚformatr4   rÉ   )r$   Zinput_irZinput_linesZbefore_increfsZbefore_decrefsZ	output_irÚoutput_linesZafter_increfsZafter_decrefsZpruned_increfsZpruned_decrefsÚcombinedZpruned_linesr{   Úgoner%   r%   r&   Útest_refct_pruning_op_recognizeö  s&    


z0TestRefCtPruning.test_refct_pruning_op_recognizez3Pass removed as it was buggy. Re-enable when fixed.c                    s‚   t dd„ ƒ‰t dd„ ƒ‰ t ‡ ‡fdd„ƒ‰t dd‡fd	d
„ƒ}| d¡ t| |jd ¡ƒ}tt d|¡ƒ}|  t	|ƒd¡ dS )ztestcase from #2350c                 S   s"   t  |¡s||| f  d7  < d S r   ©rp   Úisnan©r¬   r­   ZaggÚfieldr%   r%   r&   Ú_append_non_na  s    
zITestRefCtPruning.test_refct_pruning_with_branches.<locals>._append_non_nac                 S   sB   t  |¡s>t  ||| f ¡r*|||| f< n||| f  |7  < d S r˜   ré   rë   r%   r%   r&   Ú_append  s    
zBTestRefCtPruning.test_refct_pruning_with_branches.<locals>._appendc                    s    ˆ| |||ƒ ˆ | |||ƒ d S r˜   r%   rë   )rî   rí   r%   r&   Úappend%  s    zATestRefCtPruning.test_refct_pruning_with_branches.<locals>.appendT)Zno_cpython_wrapperc                    s:   t | jd ƒD ]&}t | jd ƒD ]}ˆ ||| |ƒ q qd S )Nr   r   )rR   rm   )r|   rì   r{   Új)rï   r%   r&   Úextend,  s    zATestRefCtPruning.test_refct_pruning_with_branches.<locals>.extendz(f4[:,::1], f4)r   z!(NRT_incref|NRT_decref)\([^\)]+\)N)
r   Úcompiler5   Zinspect_llvmZ
signaturesrà   ÚreÚfinditerrH   rÉ   )r$   rñ   ZllvmirZrefopsr%   )rî   rí   rï   r&   Ú test_refct_pruning_with_branches  s    


z1TestRefCtPruning.test_refct_pruning_with_branchesc                    sV   t  ¡  t  ¡  t  ¡  t  ¡  tdd„ ƒ‰ tdgƒ‡ fdd„ƒ}|  |dƒd¡ dS )	ztThe InlineAsm class from llvmlite.ir has no 'name' attr the refcount
        pruning pass should be tolerant to thisc                 S   s   dd„ }t tjtjtjƒ|fS )Nc                 S   sT   |\}}t  t  d¡t  d¡t  d¡g¡}|j|dd||fddd}t| ||j|ƒS )Né    zmov $2, $0; imul $1, $0z=&r,r,rZasm_mulF)ÚnameZside_effect)r   ÚFunctionTypeZIntTypeÚasmr   Úreturn_type)ZcgctxZbuilderÚsigr9   Zarg_0Zarg_1ZftyÚmulr%   r%   r&   ÚcodegenF  s    ÿ
 þz>TestRefCtPruning.test_inline_asm.<locals>.bar.<locals>.codegen)r   r   r½   )Ztyctxr¬   r­   rý   r%   r%   r&   ÚbarD  s    z-TestRefCtPruning.test_inline_asm.<locals>.barzint32(int32)c                    s   | d7 } ˆ | dƒ}|S )Nr   rG   r%   )r¬   rÂ   ©rþ   r%   r&   rÑ   P  s    
z-TestRefCtPruning.test_inline_asm.<locals>.foorg   é   N)Úllvmr@   Zinitialize_native_targetZinitialize_native_asmprinterZinitialize_native_asmparserr   r   rH   )r$   rÑ   r%   rÿ   r&   Útest_inline_asm:  s    
z TestRefCtPruning.test_inline_asmN)r)   r*   r+   rß   rè   ÚunittestÚskiprõ   Ú
linux_onlyÚx86_onlyr  r%   r%   r%   r&   rÔ   ¬  s   H
$rÔ   c                       sH   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	‡  Z
S )ÚTestNrtExternalCFFIz?Testing the use of externally compiled C code that use NRT
    c                    s   t j tt| ƒ ¡  d S r˜   )r   rA   rB   r  rC   r#   rD   r%   r&   rC   ]  s    zTestNrtExternalCFFI.setUpc              	   C   sz   ddl m} |ƒ }|j||tƒ gd | |¡ td |¡ƒ}|j|d tj	 
|¡ zt|ƒ}W 5 tj	 |¡ X ||fS )Nr   ©ÚFFI)Úinclude_dirszcffi_test_{})Útmpdir)Úcffir	  Z
set_sourcer   Úcdefr   rä   rò   Úsysr¡   rï   Úremover   )r$   r÷   Úsourcer  r	  Úffir  Úmodr%   r%   r&   Úcompile_cffi_moduleb  s    
z'TestNrtExternalCFFI.compile_cffi_modulec                 C   s.   ddl m} |ƒ }| dtjd ¡}|ƒ }|S )Nr   r  zvoid* (*)()Zget_api)r  r	  rf   r	   Z	c_helpers)r$   r	  r  Znrt_get_apiÚtabler%   r%   r&   Úget_nrt_api_tabler  s
    z%TestNrtExternalCFFI.get_nrt_api_tablec           
      C   sš   d  | jj¡}d}d}|  |||¡\}}|  |jjd¡ |  ¡ }|j |¡}|  |jjd¡ t	| 
d|¡ƒ}t |¡}	|  |	jd¡ ~	|  |jjd¡ d S )	Nz{}_test_manage_memoryaz  
#include <stdio.h>
#include "numba/core/runtime/nrt_external.h"

int status = 0;

void my_dtor(void *ptr) {
    free(ptr);
    status = 0xdead;
}

NRT_MemInfo* test_nrt_api(NRT_api_functions *nrt) {
    void * data = malloc(10);
    NRT_MemInfo *mi = nrt->manage_memory(data, my_dtor);
    nrt->acquire(mi);
    nrt->release(mi);
    status = 0xa110c;
    return mi;
}
        z;
void* test_nrt_api(void *nrt);
extern int status;
        r   i
 r   r   i­Þ  )rä   rE   r)   r  rH   ÚlibÚstatusr  Útest_nrt_apiÚintrf   r
   ÚMemInforI   )
r$   r÷   r  r  r  r  r  ÚoutÚmi_addrrN   r%   r%   r&   Útest_manage_memoryz  s    
z&TestNrtExternalCFFI.test_manage_memoryc                 C   s¼   d  | jj¡}d}d}|  |||¡\}}|  ¡ }dt tj¡j }|j	 
||¡}t| d|¡ƒ}	t |	¡}
|  |
jd¡ | | d  |¡|
j¡¡}tjdtj|d	}tj |d
ddg¡ d S )Nz{}_test_allocatea7  
#include <stdio.h>
#include "numba/core/runtime/nrt_external.h"

NRT_MemInfo* test_nrt_api(NRT_api_functions *nrt, size_t n) {
    size_t *data = NULL;
    NRT_MemInfo *mi = nrt->allocate(n);
    data = nrt->get_data(mi);
    data[0] = 0xded;
    data[1] = 0xabc;
    data[2] = 0xdef;
    return mi;
}
        z(void* test_nrt_api(void *nrt, size_t n);rÜ   r   r   z	char [{}])rÜ   )rm   rl   rn   ií  i¼
  iï  )rä   rE   r)   r  r  rp   rl   Zintpr^   r  r  r  rf   r
   r  rH   rI   rn   rW   rt   ru   rv   )r$   r÷   r  r  r  r  r  Únumbytesr  r  rN   rn   r|   r%   r%   r&   Útest_allocate£  s    
z!TestNrtExternalCFFI.test_allocatec                 C   sH   ddl m} tdd„ ƒ}|ƒ }t| d|  ¡ ¡ƒ}|ƒ }|  ||¡ d S )Nr   r  c                   S   s   t ƒ S r˜   r   r%   r%   r%   r&   r  Æ  s    z6TestNrtExternalCFFI.test_get_api.<locals>.test_nrt_apir   )r  r	  r   r  rf   r  rH   )r$   r	  r  r  rÎ   r¹   r%   r%   r&   Útest_get_apiÃ  s    
z TestNrtExternalCFFI.test_get_api)r)   r*   r+   r>   rC   r  r  r  r  r   r‰   r%   r%   rD   r&   r  Y  s   ) r  c                   @   sT   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S )ÚTestNrtStatisticsc                 C   s   t  ¡ | _d S r˜   )r	   Úmemsys_stats_enabledÚ_TestNrtStatistics__stats_stater#   r%   r%   r&   rC   Ò  s    zTestNrtStatistics.setUpc                 C   s   | j rt ¡  nt ¡  d S r˜   )r#  r	   Úmemsys_enable_statsÚmemsys_disable_statsr#   r%   r%   r&   ÚtearDownÖ  s    
zTestNrtStatistics.tearDownc                 C   s&   d}t j ¡ }d|d< t||d d S )Na¡  if 1:
        from numba import njit
        import numpy as np
        from numba.core.runtime import rtsys, _nrt_python
        from numba.core.registry import cpu_target

        @njit
        def foo():
            return np.arange(10)[0]

        # initialize the NRT before use
        rtsys.initialize(cpu_target.target_context)
        assert _nrt_python.memsys_stats_enabled()
        orig_stats = rtsys.get_allocation_stats()
        foo()
        new_stats = rtsys.get_allocation_stats()
        total_alloc = new_stats.alloc - orig_stats.alloc
        total_free = new_stats.free - orig_stats.free
        total_mi_alloc = new_stats.mi_alloc - orig_stats.mi_alloc
        total_mi_free = new_stats.mi_free - orig_stats.mi_free

        expected = 1
        assert total_alloc == expected
        assert total_free == expected
        assert total_mi_alloc == expected
        assert total_mi_free == expected
        Ú1ÚNUMBA_NRT_STATS©Úenv)r    ÚenvironÚcopyr   )r$   Úsrcr*  r%   r%   r&   Útest_stats_env_var_explicit_onÝ  s    
z0TestNrtStatistics.test_stats_env_var_explicit_onc                 C   s   d}t ||d d S )Na“  if 1:
        from numba import njit
        import numpy as np
        from numba.core.runtime import rtsys, _nrt_python

        @njit
        def foo():
            return np.arange(10)[0]

        assert _nrt_python.memsys_stats_enabled() == False
        try:
            rtsys.get_allocation_stats()
        except RuntimeError as e:
            assert "NRT stats are disabled." in str(e)
        r)  )r   )r$   r*  r-  r%   r%   r&   Úcheck_env_var_offÿ  s    z#TestNrtStatistics.check_env_var_offc                 C   s    t j ¡ }d|d< |  |¡ d S )NÚ0r(  )r    r+  r,  r/  ©r$   r*  r%   r%   r&   Útest_stats_env_var_explicit_off  s    
z1TestNrtStatistics.test_stats_env_var_explicit_offc                 C   s$   t j ¡ }| dd ¡ |  |¡ d S )Nr(  )r    r+  r,  Úpopr/  r1  r%   r%   r&   Útest_stats_env_var_default_off  s    
z0TestNrtStatistics.test_stats_env_var_default_offc                 C   sœ   t dd„ ƒ}t ¡  |  t ¡ ¡ tdƒD ]l}t ¡ }t ¡  |  	t ¡ ¡ |ƒ  t ¡  |  t ¡ ¡ t ¡ }|ƒ  t ¡ }|  
||¡ |  ||¡ q*d S )Nc                  S   s   t  d¡} t  d| d  ¡S )NrÜ   rÞ   r   )rp   rÄ   rw   )Útmpr%   r%   r&   rÑ   !  s    
z7TestNrtStatistics.test_stats_status_toggle.<locals>.foorG   )r   r	   r$  r\   r"  rR   r   Úget_allocation_statsr%  rX   rH   rž   )r$   rÑ   r{   Zstats_1Zstats_2Zstats_3r%   r%   r&   Útest_stats_status_toggle  s     
z*TestNrtStatistics.test_stats_status_togglec              	   C   sJ   t  ¡  |  t  ¡ ¡ |  t¡}t ¡  W 5 Q R X |  dt	|j
ƒ¡ d S )NúNRT stats are disabled.)r	   r%  rX   r"  r1   r2   r   r6  r4   r5   r6   )r$   r:   r%   r%   r&   Ú5test_rtsys_stats_query_raises_exception_when_disabledC  s
    zGTestNrtStatistics.test_rtsys_stats_query_raises_exception_when_disabledc                 C   s~   d}|D ]p}t td|› ƒ}| j|dJ t ¡  |  t ¡ ¡ |  t¡}|ƒ  W 5 Q R X |  dt	|j
ƒ¡ W 5 Q R X qd S )N)ZallocÚfreeZmi_allocZmi_freeZmemsys_get_stats_)Ú
stats_funcr8  )r3   r	   ZsubTestr%  rX   r"  r1   r2   r4   r5   r6   )r$   Zmethod_variationsr8   r;  r:   r%   r%   r&   Ú<test_nrt_explicit_stats_query_raises_exception_when_disabledO  s    zNTestNrtStatistics.test_nrt_explicit_stats_query_raises_exception_when_disabledN)r)   r*   r+   rC   r&  r.  r/  r2  r4  r7  r9  r<  r%   r%   r%   r&   r!  Ð  s   "$r!  Ú__main__)=r©   r    Úplatformr  ró   Únumpyrp   rÒ   r   Z
numba.corer   Znumba.core.compilerr   r   Znumba.core.runtimer   r   r	   r
   Znumba.core.extendingr   r   Znumba.core.typingr   Znumba.core.imputilsr   Zllvmliter   Zllvmlite.bindingZbindingr  Znumba.core.unsafe.nrtr   Znumba.tests.supportr   r   r   r   r   r   r   Znumba.core.registryr   r  Zenable_nrt_flagsZskipIfÚ
startswithr  Úmachiner  Úobjectr   r,   r?   rŠ   r¨   rÔ   r  r!  r)   Úmainr%   r%   r%   r&   Ú<module>   sP   $ÿÿ
 )@x .v 
