
    ܙdt3                     N   d 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
mZmZmZ ddlmZmZmZ ddlmc mc mZ ddlmZmZmZ ddlZddlmZ  ej        ej        d          Zd	 Z d
 Z!d Z"dZ#dZ$dZ%d Z&dZ'd Z( e(e          Z) e(e          Z*d Z+ e+e          Z, e+e          Z- ej.         ej/        ej0                   ej/        ej0                  ej1        ej1                  Z2 ej.         ej/        ej3                   ej/        ej3                  ej1        ej1                  Z4 ej.        ej5        ej5        ej1        ej1                  Z6 G d de          Z7 G d de          Z8e G d de                      Z9e:dk    r ej;                     dS dS )z
Tests for @cfunc and friends.
    N)
namedtuple)cfunccarrayfarraynjit)typestypingutils)TestCasetagcaptured_stderr)numpy_supportz4CFFI not supported -- please install the cffi modulec                     | |z   S N abs     6lib/python3.11/site-packages/numba/tests/test_cfunc.pyadd_usecaser      s    q5L    c                     | |z  }|S r   r   )r   r   cs      r   div_usecaser      s    	AAHr   c                     | dz  S )N   r   )r   s    r   square_usecaser   "   s    6Mr   zfloat64(float64, float64)zfloat64(int64, int64)zfloat64(float64)c                 (    t                       | |z   S r   )objectr   s     r   objmode_usecaser    +   s    
HHHq5Lr      c                       fd}|S )Nc                 0    	| ||f          } 	|t                     }|j        |d<   |j        |dd<   |j        |dd<   |j        j        |d<   |j        j        |d<   d}t          j        ||          D ]\  }}||||f         ||z
  z  z  }||d<   d S )Nr                  )	CARRAY_USECASE_OUT_LENndimshapestridesflagsc_contiguousf_contiguousnpndindex
in_ptrout_ptrmnin_outsijfuncs
            r   cfarray_usecasez-make_cfarray_usecase.<locals>.cfarray_usecase5   s    d6Aq6""d7233A9AaC;AaC'A'AJq!$$ 	% 	%DAqQTa!e$$AAAr   r   r<   r=   s   ` r   make_cfarray_usecaser?   3   s$         r   c                       fd}|S )Nc                 ^    	| ||ft           j                  } 	|t          t           j                  }|j        |d<   |j        |dd<   |j        |dd<   |j        j        |d<   |j        j        |d<   d}t          j	        ||          D ]\  }}||||f         ||z
  z  z  }||d<   d S )Ndtyper   r$   r%   r&   r'   r(   )
r0   float32r)   r*   r+   r,   r-   r.   r/   r1   r2   s
            r   r=   z3make_cfarray_dtype_usecase.<locals>.cfarray_usecaseM   s    d6Aq6444d72BJ??A9AaC;AaC'A'AJq!$$ 	% 	%DAqQTa!e$$AAAr   r   r>   s   ` r   make_cfarray_dtype_usecaserE   J   s$         r   c                   B    e Zd Zd Zed             Zd Zd Zd Zd Z	dS )	TestCFuncc                 h    t          t                    t                    }|                     |j        d           |                     |j        d           |                     |j        t                     |j        }| 	                    |t                     |                     d|           |j        }| 	                    |t                     |j        }|                     t          j        |t          j                  j        |           |                      |dd          d           dS )z8
        Basic usage and properties of a cfunc.
        r          @g      @g      @N)r   add_sigr   assertEqual__name____qualname__assertIs__wrapped__native_nameassertIsInstancestrassertInaddressintctypescastc_void_pvalueassertPreciseEqual)selffsymboladdrcts        r   
test_basiczTestCFunc.test_basico   s    E'NN;'']333777am[111fc***mV,,,ydC(((XR99?FFF3c22222r   c                     ddl m} |                                \  }} t          t                    t
                    }|                    |j                  }|                     |d           d S )Nr   )cffi_usecasesg      @)	numba.testsrb   load_inline_moduler   
square_sigr   _numba_test_funcptrcffirZ   )r[   rb   ffilibr\   ress         r   	test_cffizTestCFunc.test_cffi   sq    ------ 3355SE*n--%%af--T*****r   c                      t          t          dt          j        i          t                    }|                     |                    dd          d           d S )Nr   )localsr!   r%   rI   )r   div_sigr   int64r   rZ   rV   )r[   r\   s     r   test_localszTestCFunc.test_locals   sO     6E'3"4555kBBA44444r   c                 ^    t          t                    t                    }t                      5 }|                     |                    dd          d           d d d            n# 1 swxY w Y   |                     |                                d           t                      5 }|                    dd          }|                     |d           d d d            n# 1 swxY w Y   |                                }|                     d|           |                     d|           d S )	Nr&   r   g      @ r   g        zZeroDivisionError:zException ignored)	r   rn   r   r   rZ   rV   rK   getvaluerS   )r[   r\   errrj   s       r   test_errorszTestCFunc.test_errors   s{   E'NN;'' 	9###AHHQNNC888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9,,, 	.#((1a..C ##C---		. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.
 llnn*C000)3/////s#   +A((A,/A,)-C""C&)C&c                      t          t                    t                    }|                                }|                     |j        |           |                     d|           d S )Nzfadd double)r   rJ   r   inspect_llvmrS   rP   )r[   r\   irs      r   test_llvm_irzTestCFunc.test_llvm_ir   sV    E'NN;''^^amR(((mR(((((r   c                    |                      t                    5   t          t          d          t                     ddd           n# 1 swxY w Y   |                                 5 } t          t                    t                     ddd           n# 1 swxY w Y   |                     dt          |j	                             dS )z7
        Object mode is currently unsupported.
        T)forceobjNzUntyped global name 'object')
assertRaisesNotImplementedErrorr   rJ   r   assertTypingErrorr    rS   rR   	exception)r[   raisess     r   test_object_modezTestCFunc.test_object_mode   s+    233 	7 	7)E'D)))+666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7##%% 	,E'NN?+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,4c&:J6K6KLLLLLs#   %AAA+#BB!BN)
rL   
__module__rM   r`   skip_cffi_unsupportedrk   rp   ru   ry   r   r   r   r   rG   rG   m   s        3 3 3, + + +5 5 50 0 0 ) ) )M M M M Mr   rG   c                   Z    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZdS )
TestCArrayz*
    Tests for carray() and farray().
    c                    t          j        dd                              d                              t           j                  }t          j        t          t           j                  } | ||           ||          g|j        R   |S )N
      r   r%   rB   )r0   arangereshapeastyperD   emptyr)   r+   )r[   pointer_factoryr<   r   r8   s        r   run_carray_usecasezTestCArray.run_carray_usecase   s}    Ib"%%f--44RZ@@h-RZ@@@__Q!5!5@@@@@
r   c                     |                      ||          }|                      ||          }|                     ||           d S r   )r   rZ   )r[   r   pyfuncr   expectedgots         r   check_carray_usecasezTestCArray.check_carray_usecase   sH    **?FCC%%ou==#.....r   c                 J    |j                             t           j                  S r   )rV   data_asrX   r[   arrs     r   make_voidptrzTestCArray.make_voidptr   s    z!!&/222r   c                 n    |j                             t          j        t           j                            S r   )rV   r   POINTERc_floatr   s     r   make_float32_pointerzTestCArray.make_float32_pointer   s$    z!!&."@"@AAAr   c                 n    |j                             t          j        t           j                            S r   )rV   r   r   c_doubler   s     r   make_float64_pointerzTestCArray.make_float64_pointer   s$    z!!&."A"ABBBr   c                      fd}t          j        d                              d                              t           j                                      |          } |                     |          |j                  } |||            |                     |          |j                  } |||	                    d                      |                     |          |j        |j
                  } |||            |                     |          |j        t           j                  } |||            |                     |          |j        |j
                  } |||            |                     |          |j        t           j                  } |||                    t           j                                                  t                    5   |                     |          |j                   d d d            n# 1 swxY w Y                        t                    5   ||j        j        |j                   d d d            n# 1 swxY w Y                        t                    5 } |                     |          |j        t           j                   d d d            n# 1 swxY w Y                        dt'          |j                             d S )Nc                                          | |                               | j        j        |j        j                   d S r   )rZ   rK   rV   data)r   r   r[   s     r   eqz*TestCArray.check_carray_farray.<locals>.eq   s>    ##C222SZ_ho.BCCCCCr   r'   r   )orderKz%mismatching dtype 'int32' for pointer)r0   r   r   r   rD   copyr   r+   sizeravelrC   r   int32viewr|   	TypeErrorrV   r   rS   rR   r   )r[   r<   r   r   baser   r   s   `      r   check_carray_farrayzTestCArray.check_carray_farray   s   	D 	D 	D 	D 	D y||##F++222:>>CC%CPP D**400$*==
1dD**400$)<<
1djjoo D**400$*djII
1dD**400$*bjII
1d D""4(($*djAA
1dD""4(($*bh??
1dii!!""" y)) 	6 	6D""4(($*555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 y)) 	/ 	/D!4:...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ y)) 	HVD**400$*bhGGG	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H=&*++	- 	- 	- 	- 	-s6   +%HH #H I))I-0I-0K

KKc                 <    |                      t          d           dS )z,
        Test pure Python carray().
        CN)r   r   r[   s    r   test_carrayzTestCArray.test_carray         	  -----r   c                 <    |                      t          d           dS )z,
        Test pure Python farray().
        FN)r   r   r   s    r   test_farrayzTestCArray.test_farray   r   r   c              #      K   t           j        t           j        t           j        t           j        t           j        t           j        fD ].t          fd|j        D                       } |j	        | V  /dS )z
        Generate a bunch of concrete signatures by varying the width
        and signedness of size arguments (see issue #1923).
        c              3   @   K   | ]}|t           j        k    rn|V  d S r   )r   intp).0r   actual_sizes     r   	<genexpr>z.TestCArray.make_carray_sigs.<locals>.<genexpr>
  sE       3 3 )*UZQ 3 3 3 3 3 3r   N)
r   r   r   intcuintpuint32uintctupleargsreturn_type)r[   
formal_sigr   r   s      @r   make_carray_sigszTestCArray.make_carray_sigs  s      
 "JUZ!Ku{D 	0 	0K 3 3 3 3",/3 3 3 3 3D(*($/////		0 	0r   c                    |}|                      t                    D ];} t          |          |          }|                     | j        ||j                   <|}|                      t                    D ];} t          |          |          }|                     | j        ||j                   <|                                 5 } t          t                    |          }d d d            n# 1 swxY w Y   |                     dt          |j
                             |}|                      t                    D ];} t          |          |          }|                     | j        ||j                   <d S )Nz7mismatching dtype 'float32' for pointer type 'float64*')r   carray_float32_usecase_sigr   r   r   rV   r~   carray_float64_usecase_sigrS   rR   r   carray_voidptr_usecase_sig)r[   usecasedtype_usecaser   sigr\   r   s          r   check_numba_carray_farrayz$TestCArray.check_numba_carray_farray  s   (()CDD 	S 	SCc

6""A%%d&?RRRR (()CDD 	S 	SCc

6""A%%d&?RRRR##%% 	:1011&99A	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:O&*++	- 	- 	- (()CDD 	S 	SCc

6""A%%d&?RRRR	S 	Ss   C//C36C3c                 F    |                      t          t                     dS )zK
        Test Numba-compiled carray() against pure Python carray()
        N)r   carray_usecasecarray_dtype_usecaser   s    r   test_numba_carrayzTestCArray.test_numba_carray&  !     	&&~7KLLLLLr   c                 F    |                      t          t                     dS )zK
        Test Numba-compiled farray() against pure Python farray()
        N)r   farray_usecasefarray_dtype_usecaser   s    r   test_numba_farrayzTestCArray.test_numba_farray,  r   r   N)rL   r   rM   __doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s           / / /
3 3 3B B BC C C&- &- &-P. . .. . .	0 	0 	0S S S0M M MM M M M Mr   r   c                   .    e Zd ZdZefdZd Zd Zd ZdS )TestCffiStructz
typedef struct _big_struct {
    int    i1;
    float  f2;
    double d3;
    float  af4[9];
} big_struct;

typedef struct _error {
    int bits:4;
} error;

typedef double (*myfunc)(big_struct*, size_t);
c                 P    ddl m}  |            }|                    |           |S )Nr   )FFI)rg   r   cdef)r[   srcr   rh   s       r   get_ffizTestCffiStruct.get_ffiD  s3    cee
r   c                 f   |                                  }|                    d          }t          j        |d          }|                     |t
          j                   |                     t          |          d           |                     |                    d          t
          j	                   |                     |                    d          t
          j
                   |                     |                    d          t
          j                   |                     |                    d          t          j        t
          j
        d	
                     |                    d          }t          j        |d          }|                     |t          j                   |                     |j        d         t          j        |                     |                     |j        d         t
          j                   |                     |j        t
          j                   d S )N
big_structTuse_record_dtype   i1f2d3af4)	   )rC   r+   myfuncr   r$   )r   typeofcffi_supportmap_typerQ   r   RecordrK   lenr   rD   float64NestedArrayr	   	Signaturer   CPointerr   r   )r[   rh   r   nbtyper   r   s         r   test_type_parsingz TestCffiStruct.test_type_parsingK  s   llnnZZ--
&zDIIIfel333Va(((t,,ek:::t,,em<<<t,,em<<<MM%  EM>>>	
 	
 	
 H%%#FTBBBc6#3444!enV&<&<===!ek222%-88888r   c                    |                                  }|                    d          }t          j        |d          }t          j        |                    d          d          }t          d             t          |          fd            }|                    d          }|                    d|          }t          d	          D ]]}|d
z  ||         _	        |dz  ||         _
        d|z   dz  ||         _        t          d          D ]}	|dz  |	z   ||         j        |	<   ^t          |                    d|                    }
|                    |
d	          }t          j        |                    |          t%          j        |          d	          } |          }|                     ||           d S )Nr   Tr   r   c                     d}t          | j                  D ]F}| |         }||j        |j        z  |j        z  z  }|| |         j                                        z  }G|S )Nr   )ranger   r   r   r   r   sum)r   tmpr:   elems       r   calcz0TestCffiStruct.test_cfunc_callback.<locals>.calch  sd    C49%% ) )Awtw(4722tAw{(((Jr   c                 :    t          | |          } |          S r   )r   )ptrr6   r   r   s      r   fooz/TestCffiStruct.test_cfunc_callback.<locals>.fooq  s    #q>>D4::r   zbig_struct[3]zbig_struct*r%   {      r$   r   r   size_t)bufferrC   r+   )r   r   r   r   r   r   newrW   r   r   r   r   r   rU   rV   r0   ndarrayr  r   as_dtyperK   )r[   rh   r   nb_big_structr   r   mydatar   r:   r;   r^   r   arrayexpectr   s                 @r   test_cfunc_callbackz"TestCffiStruct.test_cfunc_callbackb  s   llnnZZ--
$-j4PPP#CJJx$8$84PPP		 	 
	 
s	 	 	 	 
	
 ))hh}f--q 	+ 	+ACCFICCFIQ#CFI1XX + + !B
A
1+ 388Hc**++jjq!! 
::f%%(77  
 ef%%%%%r   c                 4   |                                  }|                     t                    5 }t          j        |                    d          d           d d d            n# 1 swxY w Y   |                     dt          |j                             d S )NerrorTr   z0field 'bits' has bitshift, this is not supported)	r   r|   
ValueErrorr   r   r   rK   rR   r   )r[   rh   r   s      r   test_unsupport_bitsizez%TestCffiStruct.test_unsupport_bitsize  s    llnnz** 	f!

7##!%   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	> !!	
 	
 	
 	
 	
s   *A%%A),A)N)rL   r   rM   c_sourcer   r   r
  r  r   r   r   r   r   3  sb        H #    9 9 9.)& )& )&V
 
 
 
 
r   r   __main__)<r   rV   os
subprocesssyscollectionsr   numpyr0   numbar   r   r   r   
numba.corer   r	   r
   numba.core.typing.cffi_utilscore
cffi_utilsr   numba.tests.supportr   r   r   unittestnumba.npr   
skipUnless	SUPPORTEDr   r   r   r   rJ   rn   re   r    r)   r?   r   r   rE   r   r   voidr   rD   r   r   r   r   voidptrr   rG   r   r   rL   mainr   r   r   <module>r#     sS   
  				     



 " " " " " "     - - - - - - - - - - - - + + + + + + + + + + 3 3 3 3 3 3 3 3 3 3 3 3 > > > > > > > > > >  " " " " " "++:         &
!
      & &%f--%%f--  ( 21&99 11&99 'UZu}(E(E(6u}(E(E(-
EJ@ @  (UZu}(E(E(6u}(E(E(-
EJ@ @  (UZu}(-
EJ@ @ FM FM FM FM FM FM FM FMRzM zM zM zM zM zM zM zMz d
 d
 d
 d
 d
X d
 d
 d
N zHMOOOOO r   