
    xKg3                        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mZ ddlZddlm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jX                   ejZ                  ej\                         ejZ                  ej\                        ej^                  ej^                        Z0 ejX                   ejZ                  ejb                         ejZ                  ejb                        ej^                  ej^                        Z2 ejX                  ejf                  ejf                  ej^                  ej^                        Z4 G d de      Z5 G d de      Z6e G d de             Z7e8dk(  r ejr                          yy)z
Tests for @cfunc and friends.
    N)
namedtuple)cfunccarrayfarraynjit)typestypingutils)TestCaseskip_unless_cffitagcaptured_stderr)numpy_supportc                     | |z   S N abs     Z/home/alanp/www/video.onchill/myenv/lib/python3.12/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    
Hq5Lr      c                       fd}|S )Nc                 ^    	| ||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<   y )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_usecase1   s    6Aq6"723A99Aa;;Aa''A''AJJq!$DAqQTa!e$$A %Ar   r   r=   r>   s   ` r   make_cfarray_usecaser@   /   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<   y )Ndtyper   r%   r&   r'   r(   r)   )
r1   float32r*   r+   r,   r-   r.   r/   r0   r2   r3   s
            r   r>   z3make_cfarray_dtype_usecase.<locals>.cfarray_usecaseI   s    6Aq6472BJJ?A99Aa;;Aa''A''AJJq!$DAqQTa!e$$A %Ar   r   r?   s   ` r   make_cfarray_dtype_usecaserF   F   s     r   c                   :    e Zd Zd Zed        Zd Zd Zd Zd Z	y)	TestCFuncc                 X    t        t              t              }| j                  |j                  d       | j                  |j
                  d       | j                  |j                  t               |j                  }| j                  |t               | j                  d|       |j                  }| j                  |t               |j                  }| j                  t        j                  |t        j                         j"                  |       | j%                   |dd      d       y)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_basick   s     E'N;']37amm[1fc*mV,yydC(XXR9??F3c2r   c                     ddl m} |j                         \  }} t        t              t
              }|j                  |j                        }| j                  |d       y )Nr   )cffi_usecasesg      @)	numba.testsrc   load_inline_moduler   
square_sigr   _numba_test_funcptrcffir[   )r\   rc   ffilibr]   ress         r   	test_cffizTestCFunc.test_cffi   sL    - 335SE*n-%%aff-T*r   c                      t        t        dt        j                  i      t              }| j                  |j                  dd      d       y )Nr   )localsr"   r&   rJ   )r   div_sigr   int64r   r[   rW   )r\   r]   s     r   test_localszTestCFunc.test_locals   s:     6E'3"45kBA4r   c                     t        t              t              }t               5 }| j	                  |j                  dd      d       d d d        | j                  j                         d       t               5 }|j                  dd      }| j	                  |d       d d d        |j                         }| j                  d|       | j                  d|       y # 1 sw Y   xY w# 1 sw Y   JxY w)	Nr'   r   g      @ r   g        zZeroDivisionError:zException ignored)	r   ro   r   r   r[   rW   rL   getvaluerT   )r\   r]   errrk   s       r   test_errorszTestCFunc.test_errors   s    E'N;'###AHHQNC8 ,#((1a.C ##C-	 
 lln*C0)3/  s   #C9%C'C$'C0c                      t        t              t              }|j                         }| j	                  |j
                  |       | j	                  d|       y )Nzfadd double)r   rK   r   inspect_llvmrT   rQ   )r\   r]   irs      r   test_llvm_irzTestCFunc.test_llvm_ir   s>    E'N;'^^ammR(mR(r   c                 T   | j                  t              5   t        t        d      t               ddd       | j                         5 } t        t              t               ddd       | j                  dt        j                               y# 1 sw Y   axY w# 1 sw Y   ;xY w)z7
        Object mode is currently unsupported.
        T)forceobjNzUntyped global name 'object')
assertRaisesNotImplementedErrorr   rK   r   assertTypingErrorr!   rT   rS   	exception)r\   raisess     r   test_object_modezTestCFunc.test_object_mode   st     23)E'D)+6 4##%E'N?+ &4c&:J:J6KL	 43%%s   B
BBB'N)
rM   
__module__rN   ra   r   rl   rq   rv   rz   r   r   r   r   rH   rH   i   s0    3, + +50 )Mr   rH   c                   X    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y)
TestCArrayz*
    Tests for carray() and farray().
    c                    t        j                  dd      j                  d      j                  t         j                        }t        j
                  t        t         j                        } | ||       ||      g|j                    |S )N
      r   r&   rC   )r1   arangereshapeastyperE   emptyr*   r,   )r\   pointer_factoryr=   r   r9   s        r   run_carray_usecasezTestCArray.run_carray_usecase   sc    IIb"%%f-44RZZ@hh-RZZ@_Q!5@@
r   c                 p    | j                  ||      }| j                  ||      }| j                  ||       y r   )r   r[   )r\   r   pyfuncr   expectedgots         r   check_carray_usecasezTestCArray.check_carray_usecase   s6    **?FC%%ou=#.r   c                 T    |j                   j                  t         j                        S r   )rW   data_asrY   r\   arrs     r   make_voidptrzTestCArray.make_voidptr   s    zz!!&//22r   c                 z    |j                   j                  t        j                  t         j                              S r   )rW   r   POINTERc_floatr   s     r   make_float32_pointerzTestCArray.make_float32_pointer   s$    zz!!&.."@AAr   c                 z    |j                   j                  t        j                  t         j                              S r   )rW   r   r   c_doubler   s     r   make_float64_pointerzTestCArray.make_float64_pointer   s$    zz!!&.."ABBr   c                      fd}t        j                  d      j                  d      j                  t         j                        j                  |      } | j                  |      |j                        } |||        | j                  |      |j                        } |||j                  d              | j                  |      |j                  |j                        } |||        | j                  |      |j                  t         j                        } |||        | j                  |      |j                  |j                        } |||        | j                  |      |j                  t         j                        } |||j                  t         j                                j                  t              5   | j                  |      |j                         d d d         j                  t              5   ||j                   j"                  |j                         d d d         j                  t              5 } | j                  |      |j                  t         j                         d d d         j%                  dt'        j(                               y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   GxY w)Nc                     j                  | |       j                  | j                  j                  |j                  j                         y r   )r[   rL   rW   data)r   r   r\   s     r   eqz*TestCArray.check_carray_farray.<locals>.eq   s5    ##C2SZZ__hoo.B.BCr   r(   r   )orderKz%mismatching dtype 'int32' for pointer)r1   r   r   r   rE   copyr   r,   sizeravelrD   r   int32viewr}   	TypeErrorrW   r   rT   rS   r   )r\   r=   r   r   baser   r   s   `      r   check_carray_farrayzTestCArray.check_carray_farray   s   	D yy|##F+222::>CC%CP **40$**=
1d**40$))<
1djjo **40$**djjI
1d**40$**bjjI
1d ""4($**djjA
1d""4($**bhh?
1dii!" y)""4($**5 * y)!!4::. * y)V**40$**bhhG *=&**+	- *) *) *)s$   #J4(K 2K4J= K	Kc                 0    | j                  t        d       y)z,
        Test pure Python carray().
        CN)r   r   r\   s    r   test_carrayzTestCArray.test_carray        	  -r   c                 0    | j                  t        d       y)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 ]1  t        fd|j                  D              } |j                  |  3 yw)z
        Generate a bunch of concrete signatures by varying the width
        and signedness of size arguments (see issue #1923).
        c              3   L   K   | ]  }|t         j                  k(  rn|  y wr   )r   intp).0r   actual_sizes     r   	<genexpr>z.TestCArray.make_carray_sigs.<locals>.<genexpr>  s(      3"1Q )*UZZQ>"1s   !$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   sk     
 "JJUZZ!KKu{{DK 3",//3 3D(*(($//	Ds   BBc                    |}| j                  t              D ]:  } t        |      |      }| j                  | j                  ||j
                         < |}| j                  t              D ]:  } t        |      |      }| j                  | j                  ||j
                         < | j                         5 } t        t              |      }d d d        | j                  dt        j                               |}| j                  t              D ]:  } t        |      |      }| j                  | j                  ||j
                         < y # 1 sw Y   xY w)Nz7mismatching dtype 'float32' for pointer type 'float64*')r   carray_float32_usecase_sigr   r   r   rW   r   carray_float64_usecase_sigrT   rS   r   carray_voidptr_usecase_sig)r\   usecasedtype_usecaser   sigr]   r   s          r   check_numba_carray_farrayz$TestCArray.check_numba_carray_farray
  s+   (()CDCc
6"A%%d&?&?R E
 (()CDCc
6"A%%d&?&?R E ##%101&9A &O&**+	- (()CDCc
6"A%%d&?&?R E &%s   9EEc                 8    | j                  t        t               y)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Lr   c                 8    | j                  t        t               y)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)rM   r   rN   __doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      sI    /
3BC&-P..	0S0MMr   r   c                   ,    e Zd ZdZefdZd Zd Zd Zy)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                 B    ddl m}  |       }|j                  |       |S )Nr   )FFI)rh   r   cdef)r\   srcr   ri   s       r   get_ffizTestCffiStruct.get_ffi@  s    e
r   c                 .   | j                         }|j                  d      }t        j                  |d      }| j	                  |t
        j                         | j                  t        |      d       | j                  |j                  d      t
        j                         | j                  |j                  d      t
        j                         | j                  |j                  d      t
        j                         | j                  |j                  d      t        j                  t
        j                  d	
             |j                  d      }t        j                  |d      }| j	                  |t        j                         | j                  |j                  d   t        j                   |             | j                  |j                  d   t
        j"                         | j                  |j$                  t
        j                         y )N
big_structTuse_record_dtype   i1f2d3af4)	   )rD   r,   myfuncr   r%   )r   typeofcffi_supportmap_typerR   r   RecordrL   lenr   rE   float64NestedArrayr	   	Signaturer   CPointerr   r   )r\   ri   r   nbtyper   r   s         r   test_type_parsingz TestCffiStruct.test_type_parsingG  sg   llnZZ-
&&zDIfell3Va(t,ekk:t,emm<t,emm<MM% EMM>	
 H%##FTBc6#3#34!ennV&<=!ekk2%--8r   c                    | j                         }|j                  d      }t        j                  |d      }t        j                  |j                  d      d      }t        d        t        |      fd       }|j                  d      }|j                  d|      }t        d	      D ]T  }|d
z  ||   _	        |dz  ||   _
        d|z   dz  ||   _        t        d      D ]  }	|dz  |	z   ||   j                  |	<    V t        |j                  d|            }
|j                  |
d	      }t        j                   |j#                  |      t%        j&                  |      d	      } |      }| j)                  ||       y )Nr   Tr   r   c                     d}t        | j                        D ]P  }| |   }||j                  |j                  z  |j                  z  z  }|| |   j
                  j                         z  }R |S )Nr   )ranger   r   r   r   r   sum)r   tmpr;   elems       r   calcz0TestCffiStruct.test_cfunc_callback.<locals>.calcd  sc    C499%Awtww(47722tAw{{(( & Jr   c                 ,    t        | |      } |      S r   )r   )ptrr7   r   r   s      r   fooz/TestCffiStruct.test_cfunc_callback.<locals>.foom  s    #q>D:r   zbig_struct[3]zbig_struct*r&   {      r%   r   r   size_t)bufferrD   r,   )r   r   r   r   r   r   newrX   r   r   r   r   r   rV   rW   r1   ndarrayr  r   as_dtyperL   )r\   ri   r   nb_big_structr   r   mydatar   r;   r<   r_   r   arrayexpectr   s                 @r   test_cfunc_callbackz"TestCffiStruct.test_cfunc_callback^  sh   llnZZ-
$--j4P##CJJx$84P		 
	 
s	 
	
 )hh}f-qACCFICCFIQ#CFI1X !B
A

1 	  388Hc*+jjq! 

::f%((7
 ef%r   c                    | j                         }| j                  t              5 }t        j                  |j                  d      d       d d d        | j                  dt        j                               y # 1 sw Y   /xY w)NerrorTr   z0field 'bits' has bitshift, this is not supported)	r   r}   
ValueErrorr   r   r   rL   rS   r   )r\   ri   r   s      r   test_unsupport_bitsizez%TestCffiStruct.test_unsupport_bitsize  si    llnz*f!!

7#!% + 	>  !	
 +*s   'A;;BN)rM   r   rN   c_sourcer   r   r
  r  r   r   r   r   r   /  s#    H # 9.)&V
r   r   __main__):r   rW   os
subprocesssyscollectionsr   numpyr1   numbar   r   r   r   
numba.corer   r	   r
   numba.core.typing.cffi_utilscore
cffi_utilsr   numba.tests.supportr   r   r   r   unittestnumba.npr   r   r   r   rK   ro   rf   r!   r*   r@   r   r   rF   r   r   voidr   rE   r   r   r   r   voidptrr   rH   r   r   rM   mainr   r   r   <module>r!     s  
  	  
 "  - - + + 3 32 2  " &
!
  & &f-%f-( 2&9 1&9 'UZZu}}(E(6u}}(E(-

EJJ@  (UZZu}}(E(6u}}(E(-

EJJ@  (UZZu}}(-

EJJ@ FM FMRzM zMz d
X d
 d
N zHMMO r   