U
    hâËd�·  ã                   @   sp  d 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 ddlmZmZ ddlmZmZ ddlmZ dd	lmZmZ eejƒd
d„ ƒZeejƒdd„ ƒZeejƒeejƒdd„ ƒƒZeejƒdd„ ƒZeejƒdd„ ƒZ eej!ƒdd„ ƒZ"eej!ƒdd„ ƒZ#eej$ƒdd„ ƒZ%eej$ƒdd„ ƒZ&eej'ƒdd„ ƒZ(eej'ƒeej)ƒdd„ ƒƒZ*eej+ƒd d!„ ƒZ,eej+ƒd"d#„ ƒZ-eej.ƒd$d%„ ƒZ/eej.ƒd&d'„ ƒZ0eej1ƒd(d)„ ƒZ2eej3ƒd*d+„ ƒZ4eej3ƒd,d-„ ƒZ5eej6ƒd.d/„ ƒZ7eej6ƒd0d1„ ƒZ8eej9ƒd2d3„ ƒZ:eej9ƒd4d5„ ƒZ;eej<ƒd6d7„ ƒZ=eej>ƒd8d9„ ƒZ?eej>ƒd:d;„ ƒZ@eejAƒd<d=„ ƒZBeejAƒd>d?„ ƒZCeejDƒd@dA„ ƒZEeejFƒdBdC„ ƒZGeejHƒdDdE„ ƒZIeejJƒdFdG„ ƒZKeejLƒdHdI„ ƒZMeejJƒdJdK„ ƒZNeejOƒeejPƒdLdM„ ƒƒZQeejRƒeejSƒdNdO„ ƒƒZTeejUƒdPdQ„ ƒZVeejWƒdRdS„ ƒZXG dTdU„ dUeYƒZZdVdW„ Z[eejWƒdXdY„ ƒZ\e	ejWƒdZd[„ ƒZ]d\d]„ Z^eej_ƒd^d_„ ƒZ`d`da„ Zaeej_ƒdbdc„ ƒZbe	ej_ƒddde„ ƒZceejdƒdfdg„ ƒZeeejdƒdhdi„ ƒZfeejgƒdjdk„ ƒZheejgƒdldm„ ƒZieejjƒdndo„ ƒZkeejjƒdpdq„ ƒZleejmƒeejnƒdrds„ ƒƒZoeejmƒeejnƒdtdu„ ƒƒZpeejqƒdvdw„ ƒZreejsƒdxdy„ ƒZteejsƒdzd{„ ƒZueejvƒd|d}„ ƒZweejvƒd~ds„ ƒZodd€„ Zxd�d‚„ Zyeejzƒdƒd„„ ƒZ{eej|ƒd…d†„ ƒZ}eej|ƒd‡dˆ„ ƒZ~eejƒd‰dŠ„ ƒZ€eej�ƒd‹dŒ„ ƒZ‚eejƒƒd�dŽ„ ƒZ„e ƒd�¡Z…eej†ƒd�d‘„ ƒZ‡eej†ƒd’d“„ ƒZˆd”S )•zG
Boxing and unboxing of native Numba values to / from CPython objects.
é    )Úir)ÚtypesÚcgutils)ÚboxÚunboxÚreflectÚNativeValue)ÚNumbaNotImplementedError)ÚtypeofÚPurpose)ÚsetobjÚlistobj)Únumpy_support)ÚcontextmanagerÚ	ExitStackc                 C   s   |j  |¡S ©N)ÚpyapiZbool_from_bool©ÚtypÚvalÚc© r   úJ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/core/boxing.pyÚbox_bool   s    r   c                 C   s<   |j  |¡}t |jd¡}|j d||¡}t||j  ¡ d�S )Nr   ú!=©Úis_error)	r   Zobject_istruer   ÚConstantÚtypeÚbuilderÚicmp_signedr   Úc_api_error)r   Úobjr   ZistrueÚzeror   r   r   r   Úunbox_boolean   s    r$   c                 C   s$   |j  |j|| | j¡}| | j|¡S r   )ÚcontextÚcastr   Zliteral_typer   r   r   r   r   Úbox_literal_integer!   s    r'   c                 C   sF   | j r$|j ||jj¡}|j |¡S |j ||jj¡}|j |¡S d S r   )	Úsignedr   Zsextr   ZlonglongZlong_from_longlongZzextZ	ulonglongZlong_from_ulonglong)r   r   r   ZivalZullvalr   r   r   Úbox_integer(   s
    r)   c              	   C   sœ   |j  | ¡}t |j|¡}|j |¡}|j |¡�J | jrH|j 	|¡}n|j 
|¡}|j |¡ |j |j ||¡|¡ W 5 Q R X t|j |¡|j ¡ d�S ©Nr   )r%   Úget_argument_typer   Úalloca_oncer   r   Znumber_longZif_object_okr(   Zlong_as_longlongZlong_as_ulonglongÚdecrefÚstoreÚtruncr   Úloadr!   )r   r"   r   Zll_typer   ZlongobjZllvalr   r   r   Úunbox_integer1   s    "ÿr1   c                 C   s<   | t jkr|j ||jj¡}n| t jks,t‚|}|j |¡S r   )	r   Úfloat32r   Úfpextr   ÚdoubleÚfloat64ÚAssertionErrorZfloat_from_double)r   r   r   Údbvalr   r   r   Ú	box_floatA   s
    
r8   c                 C   sj   |j  |¡}|j  |¡}|j  |¡ | tjkrF|j ||j 	| ¡¡}n| tj
ksTt‚|}t||j  ¡ d�S r*   )r   Znumber_floatZfloat_as_doubler-   r   r2   r   Zfptruncr%   r+   r5   r6   r   r!   )r   r"   r   Zfobjr7   r   r   r   r   Úunbox_floatJ   s    

ÿr9   c                 C   sr   |j j|j| |d�}| tjkrH|j |j|jj¡}|j |j	|jj¡}n| tj
ksVt‚|j|j	 }}|j ||¡S ©N©Úvalue)r%   Úmake_complexr   r   Ú	complex64r3   Úrealr   r4   ÚimagÚ
complex128r6   Zcomplex_from_doubles)r   r   r   ÚcvalZfrealZfimagr   r   r   Úbox_complexX   s    
rC   c              	   C   sÖ   |j  |jtj¡}|j || ¡ ¡}t 	|j|¡}t 
|j|¡� |j dd| f ¡ W 5 Q R X | tjkr´|j  |j| ¡}|j  |j|jtjtj¡|_|j  |j|jtjtj¡|_n| tjksÂt‚|}t| ¡ |d�S )NÚPyExc_TypeErrorzconversion to %s failedr   )r%   r=   r   r   rA   r   Zcomplex_adaptorÚ_getpointerr   Zis_falseZif_unlikelyÚerr_set_stringr>   r&   r?   r5   r2   r@   r6   r   Ú	_getvalue)r   r"   r   Zc128ÚokÚfailedZcplxr   r   r   Úunbox_complexd   s(    ÿ
 ÿ ÿrJ   c                 C   s
   |j  ¡ S r   )r   Ú	make_noner   r   r   r   Úbox_none|   s    rL   c                 C   s   t |j ¡ ƒS r   ©r   r%   Úget_dummy_valuer   r   r   r   Ú
unbox_none€   s    rO   c                 C   s   |j  || j¡S r   )r   Zcreate_np_datetimeÚ	unit_coder   r   r   r   Úbox_npdatetime†   s    rQ   c                 C   s   |j  |¡}t||j  ¡ d�S r*   )r   Zextract_np_datetimer   r!   ©r   r"   r   r   r   r   r   Úunbox_npdatetimeŠ   s    rS   c                 C   s   |j  || j¡S r   )r   Zcreate_np_timedeltarP   r   r   r   r   Úbox_nptimedelta�   s    rT   c                 C   s   |j  |¡}t||j  ¡ d�S r*   )r   Zextract_np_timedeltar   r!   rR   r   r   r   Úunbox_nptimedelta”   s    rU   c                 C   s*   |j  tj¡}|j ||¡}| tj|¡S )z0
    Convert a raw pointer to a Python int.
    )r%   Úget_value_typer   Úuintpr   Zptrtointr   )r   r   r   Zll_intpÚaddrr   r   r   Úbox_raw_pointerš   s    rY   c                 C   s4   |  | j|¡}|j |j | j¡¡}|j ||f¡S )z6
    Fetch an enum member given its native value.
    )r   Údtyper   ÚunserializeÚserialize_objectÚinstance_classÚcall_function_objargs)r   r   r   ÚvalobjÚcls_objr   r   r   Úbox_enum¤   s    ra   c                 C   s   |j  |d¡}| | j|¡S )z=
    Convert an enum member's value to its native value.
    r<   )r   Úobject_getattr_stringr   rZ   )r   r"   r   r_   r   r   r   Ú
unbox_enum¯   s    rc   c                 C   sH   t  t  d¡|jjj¡}|j |t  t  d¡¡¡}|j	 
||| j|j¡S )Né    é   )r   r   ZIntTyper   ZpointeeÚcountr   ÚbitcastZPointerTyper   Zrecreate_recordrZ   Úenv_manager)r   r   r   ÚsizeÚptrr   r   r   Ú
box_record»   s    rk   c                    s\   ˆj  ¡ ‰ ˆj  |ˆ ¡}t ˆj|¡}ˆj | ¡}ˆj ||¡}‡ ‡fdd„}t	|||d�S )Nc                      s   ˆj  ˆ ¡ d S r   ©r   Zrelease_bufferr   ©Úbufr   r   r   ÚcleanupÍ   s    zunbox_record.<locals>.cleanup©ro   r   )
r   Úalloca_bufferZextract_record_datar   Úis_nullr   r%   rV   rg   r   )r   r"   r   rj   r   Zltypr   ro   r   rm   r   Úunbox_recordÄ   s    
rs   c              
   C   s*  |j j|j j|j jdœtj }|j tj	|¡}t
j|j|d�}|j ||j j¡}|j tj| j¡}| d¡}| d¡}	| tj¡}
t
 |j|¡}t
 |j|g|j¡�d\}|j |j ||j ||
¡g¡¡}|j t
 |j|¡¡� |j |j ||	¡|¡ W 5 Q R X W 5 Q R X |j |¡}|j  |||¡S )N)é   é   é   r;   r   rt   )r   Zpy_unicode_1byte_kindZpy_unicode_2byte_kindZpy_unicode_4byte_kindr   Zsizeof_unicode_charr%   Úget_constantr   Zint32r   Úalloca_once_valuer   rg   ÚcstringÚintprf   r   Ú	loop_nestr0   ÚgepÚmulÚif_thenÚis_not_nullr.   ÚaddZstring_from_kind_and_data)r   r   r   Zunicode_kindÚkindÚrawptrÚstrptrÚfullsizer#   ÚoneÚsteprf   ÚidxÚchÚstrlenr   r   r   Úbox_unicodecharseqÒ   s(    ýý

",rŠ   c              	   C   sÆ   |j  | ¡}|j |¡\}}}}}}	t |j|¡�n t |j	| j
¡}
|j d||
¡}|j |||
¡}t |d ¡}t |j|¡}t |j|j ||j	¡||¡ W 5 Q R X |j |¡}t||j |¡d�S ©Nz<=r   )r%   rV   r   Zstring_as_string_size_and_kindr   Ú	if_likelyr   r   r   r   rf   Úicmp_unsignedÚselectrx   Úmemcpyrg   r0   r   Únot_)r   r"   r   ÚltyrH   Úbufferri   r�   Zis_asciiZhashvÚstorage_sizeÚ	size_fitsÚnull_stringÚoutspaceÚretr   r   r   Úunbox_unicodecharseqì   s     
ÿ þr˜   c                 C   s<   |j  |j| |¡}|j |j|j¡}|j j |j| |¡ |S r   )	r%   Úmake_helperr   r   Úbytes_from_string_and_sizeÚdataÚnitemsÚnrtr-   )r   r   r   r"   r—   r   r   r   Ú	box_bytes
  s    rž   c              
   C   sä   t j|j|d�}|j ||jj¡}|j tj	| j
¡}| d¡}| d¡}t  |j|¡}t  |j|g|j¡�Z\}	|j |j ||	g¡¡}
|j t  |j|
¡¡� |j |j |	|¡|¡ W 5 Q R X W 5 Q R X |j |¡}|j ||¡S )Nr;   r   rt   )r   rx   r   rg   r   ry   r%   rw   r   rz   rf   r   r{   r0   r|   r~   r   r.   r€   rš   )r   r   r   r‚   rƒ   r„   r#   r…   rf   r‡   rˆ   r‰   r   r   r   Úbox_charseq  s    

,rŸ   c              	   C   sÀ   |j  | ¡}|j |¡\}}}t |j|¡�n t |j	| j
¡}|j d||¡}|j |||¡}t |d ¡}	t |j|	¡}
t |j|j |
|j	¡||¡ W 5 Q R X |j |
¡}t||j |¡d�S r‹   )r%   rV   r   Zstring_as_string_and_sizer   rŒ   r   r   r   r   rf   r�   rŽ   rx   r�   rg   r0   r   r�   )r   r"   r   r‘   rH   r’   ri   r“   r”   r•   r–   r—   r   r   r   Úunbox_charseq)  s     þr    c              
   C   s¢   |j  |j| |¡}t |j|j ¡ ¡}|j |j¡�\\}}|�$ | 	| j
|j¡}|j ||¡ W 5 Q R X |� |j |j ¡ |¡ W 5 Q R X W 5 Q R X |j |¡S r   )r%   r™   r   r   rx   r   Úborrow_noneÚif_elseZvalidr   r   r›   r.   rK   r0   )r   r   r   Úoptvalr—   ÚthenÚ	otherwiseZvalidresr   r   r   Úbox_optionalE  s    (r¦   c              
      s  ˆ j  ˆ j| j¡}ˆ j d|ˆ j ¡ ¡‰t ˆ j|j¡}t 	ˆ jtj
¡}ˆ j ˆ¡�z\}}|�H ˆ  | j|¡‰ˆ j  ˆ j| jˆj¡}ˆ j ||¡ ˆ j ˆj|¡ W 5 Q R X |� ˆ j ||¡ W 5 Q R X W 5 Q R X ˆjdk	rð‡ ‡‡fdd„}	nd}	ˆ j |¡}
t|
ˆ j |¡|	d�S )z>
    Convert object *obj* to a native optional structure.
    r   Nc                	      s$   ˆ j  ˆ¡� ˆ ¡  W 5 Q R X d S r   )r   r~   ro   r   ©r   Zis_not_noneÚnativer   r   ro   i  s    zunbox_optional.<locals>.cleanup©r   ro   )r%   Zmake_optional_noner   r   r    r   r¡   r   r,   rx   Ú	false_bitr¢   r   Zmake_optional_valuer<   r.   r   ro   r0   r   )r   r"   r   ZnonevalZretptrZerrptrr¤   ZorelseZjustro   r—   r   r§   r   Úunbox_optionalR  s,    
 ÿ"
ÿr«   c           	      C   sZ   ddl m} |j |¡\}}}}|j |j| ¡}||_||_||_	t
| ¡ |j |¡d�S )z;
    Convert object *obj* to a native slice structure.
    r   )Úslicingr   )Únumba.cpythonr¬   r   Zslice_as_intsr%   r™   r   ÚstartÚstopr†   r   rG   r�   )	r   r"   r   r¬   rH   r®   r¯   r†   Zslir   r   r   Úunbox_slicet  s    r°   c                 C   sÖ   | j }dD ]b}t||ƒ}t|tƒr
zt|tƒ W q
 tk
rj } ztd|› dt|ƒ› �ƒ‚W 5 d }~X Y q
X q
| j  ¡ \}}|j	 
|¡}	|j	 
|¡}
|j	 |	¡}|j	 |
¡}|j	 ||¡}|j	 |¡ |j	 |¡ |S )N)r®   r¯   r†   z7Unable to create literal slice. Error encountered with z attribute. )Úliteral_valueÚgetattrÚ
isinstanceÚintr
   r   Ú
ValueErrorÚstrÚ
__reduce__r   r\   r[   Úcallr-   )r   r   r   Z	slice_litÚ
field_nameZ	field_objÚeZpy_ctorZpy_argsZserialized_ctorZserialized_argsZctorÚargsr"   r   r   r   Úbox_slice_literal�  s&    

ÿr¼   c                 C   s   t |j ¡ ƒS r   rM   ©r   r"   r   r   r   r   Úunbox_string_literal›  s    r¾   c           	      C   sˆ   |j  | ¡}||j |j|d�}|j jrnt | j¡}|j |j 	|¡¡}|j
 | ||¡}|j j |j| |¡ |S |j}|j
 |¡ |S d S r:   )r%   Ú
make_arrayr   Ú
enable_nrtr   Úas_dtyperZ   rh   Z
read_constZ	add_constr   Znrt_adapt_ndarray_to_pythonr�   r-   ÚparentÚincref)	r   r   r   ÚnativearyclsÚ	nativearyÚnp_dtypeZdtypeptrZnewaryrÂ   r   r   r   Ú	box_array§  s    rÇ   c           
   	      sÆ   ˆj  ¡ ‰ ˆj  |ˆ ¡}t ˆj|¡}ˆj | ¡}|ˆjˆjƒ}| ¡ }t 	ˆjˆj 
|¡¡�> ˆj |ˆj j¡}ˆjjrŠˆj  ˆ |¡ nˆj  ˆ |¡ W 5 Q R X ‡ ‡fdd„}	tˆj |¡||	d�S )zK
    Convert a Py_buffer-providing object to a native array structure.
    c                      s   ˆj  ˆ ¡ d S r   rl   r   rm   r   r   ro   Ì  s    zunbox_buffer.<locals>.cleanupr©   )r   rq   Ú
get_bufferr   r   r   r%   r¿   rE   rŒ   r�   rg   ÚvoidptrrÀ   Znrt_adapt_buffer_from_pythonZnumba_buffer_adaptorr   r0   )
r   r"   r   Úresr   rÄ   rÅ   Úaryptrrj   ro   r   rm   r   Úunbox_buffer¸  s    
ÿrÌ   c              	   C   sü   |j  | ¡}||j |jƒ}| ¡ }|j ||jj¡}|j jrL|j ||¡}n|j 	||¡}zt
 | j¡j}W n tk
r†   tj}	Y n X |j |¡}|j d|j|¡}	|j t |j|¡|	¡}
|jj|
dd�� |j dd¡ W 5 Q R X t|j |¡|
d�S )zC
    Convert a Numpy array object to a native array structure.
    r   F©ZlikelyrD   zXcan't unbox array from PyObject into native value.  The object maybe of a different typer   )r%   r¿   r   rE   rg   r   rÉ   rÀ   Znrt_adapt_ndarray_from_pythonZnumba_array_adaptorr   rÁ   rZ   Úitemsizer	   r   rª   r   r�   Úor_r   r~   rF   r   r0   )r   r"   r   rÄ   rÅ   rË   rj   ÚerrcodeZexpected_itemsizeZitemsize_mismatchrI   r   r   r   Úunbox_arrayÒ  s4    
ýþÿrÑ   c                 C   sN   |j  | j¡}t| ƒD ]2\}}|j ||¡}| ||¡}|j  |||¡ q|S )zD
    Convert native array or structure *val* to a tuple object.
    )r   Ú	tuple_newrf   Ú	enumerater   Úextract_valuer   Ztuple_setitem)r   r   r   Z	tuple_valÚirZ   Úitemr"   r   r   r   Ú	box_tuple  s    r×   c                 C   sL   |j  |j  | j¡¡}t| ||ƒ}|j  ||¡}|j  |¡ |j  |¡ |S )zI
    Convert native array or structure *val* to a namedtuple object.
    )r   r[   r\   r]   r×   r¸   r-   )r   r   r   r`   Z	tuple_objr"   r   r   r   Úbox_namedtuple  s    rØ   c              
      s˜  t | ƒ}g }g ‰ |j | ¡}t |jtj¡}t |j|¡}|j 	|¡}|j 
d|t |j|¡¡}	|jj|j |	¡dd��, |j dd|f |¡ |j tj|¡ W 5 Q R X t| ƒD ]r\}
}|j ||
¡}| ||¡}| |j¡ |jj|jdd�� |j tj|¡ W 5 Q R X |jdk	r²ˆ  |j¡ q²|j |j| |¡}|j ||¡ ˆ �rv|jj|	dd�� ‡ fdd	„}W 5 Q R X nd}t|j |¡||j |¡d
�S )zN
    Convert tuple *obj* to a native array (if homogeneous) or structure.
    z==FrÍ   ZPyExc_ValueErrorz<size mismatch for tuple, expected %d element(s) but got %%zdNTc                     s   t ˆ ƒD ]
} | ƒ  qd S r   )Úreversed)Úfunc©Zcleanupsr   r   ro   G  s    zunbox_tuple.<locals>.cleanuprp   )Úlenr%   rV   r   rx   r   rª   r,   r   Ú
tuple_sizer�   r   r   r   r~   r�   Ú
err_formatr.   Útrue_bitrÓ   Ztuple_getitemr   Úappendr<   r   ro   Z
make_tupler   r0   )r   r"   r   ÚnÚvaluesr‘   Úis_error_ptrZ	value_ptrZactual_sizeZsize_matchesrÕ   ZeltypeÚelemr¨   r<   ro   r   rÛ   r   Úunbox_tuple  sD    
ÿý

ÿrå   c                 C   s0  t  |j|j| |¡}|j}t |j|¡}|j t |j|¡¡�Ì\}}|� |j	 
|¡ W 5 Q R X |�œ |j}|j	 |¡}|jjt |j|¡dd��V t |j|¡�<}	| |	j¡}
| |
¡ | | j|
¡}|j	 ||	j|¡ W 5 Q R X W 5 Q R X |j ||¡ W 5 Q R X W 5 Q R X |jj |j| |¡ |j |¡S )z5
    Convert native list *val* to a list object.
    TrÍ   )r   ÚListInstancer%   r   rÂ   r   rx   r¢   r   r   rÃ   ri   Úlist_newr~   Ú	for_rangeÚgetitemÚindexÚincref_valuer   rZ   Úlist_setitemr.   r�   r-   r0   )r   r   r   Úlistr"   rÊ   Ú
has_parentr¥   rœ   ÚlooprÖ   Úitemobjr   r   r   Úbox_listQ  s(    ÿ
&"rñ   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú_NumbaTypeHelperaÿ  A helper for acquiring `numba.typeof` for type checking.

    Usage
    -----

        # `c` is the boxing context.
        with _NumbaTypeHelper(c) as nth:
            # This contextmanager maintains the lifetime of the `numba.typeof`
            # function.
            the_numba_type = nth.typeof(some_object)
            # Do work on the type object
            do_checks(the_numba_type)
            # Cleanup
            c.pyapi.decref(the_numba_type)
        # At this point *nth* should not be used.
    c                 C   s
   || _ d S r   )r   )Úselfr   r   r   r   Ú__init__„  s    z_NumbaTypeHelper.__init__c                 C   sH   | j }|j |jjd¡}|j |¡}|j |d¡}|| _|j 	|¡ | S )NZnumbar
   )
r   r%   Úinsert_const_stringr   Úmoduler   Úimport_module_noblockrb   Ú	typeof_fnr-   )ró   r   Z
numba_nameZ	numba_modrø   r   r   r   Ú	__enter__‡  s    z_NumbaTypeHelper.__enter__c                 O   s   | j }|j | j¡ d S r   )r   r   r-   rø   )ró   r»   Úkwargsr   r   r   r   Ú__exit__�  s    z_NumbaTypeHelper.__exit__c                 C   s   | j j | j|g¡}|S r   )r   r   r^   rø   )ró   r"   rÊ   r   r   r   r
   ”  s    z_NumbaTypeHelper.typeofN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rô   rù   rû   r
   r   r   r   r   rò   s  s
   	rò   c                    s  ‡ ‡‡fdd„}t j ˆ jˆ j| |¡\}}ˆ jj|dd���ž\}	}
|	��h ||_t |j	d¡}ˆ jj
ˆ j d||¡dd��È tˆ ƒ�´}| ˆ j ||¡¡}t ˆ j|¡�z‰ˆ j |ˆj¡}||||ƒ ˆ  | j|¡}ˆ jj
|jdd�� ˆ j tjˆ¡ ˆ ¡  W 5 Q R X |jˆj|jdd� W 5 Q R X ˆ j |¡ W 5 Q R X W 5 Q R X | j�rV||_ˆ jj
ˆ j ˆ j ˆ¡¡dd�� ˆ j  ||j!¡ W 5 Q R X | "d¡ ˆ j |j|¡ W 5 Q R X |
� ˆ j tjˆ¡ W 5 Q R X W 5 Q R X ˆ j 
ˆ j ˆ¡¡� ˆ jj# ˆ j| |j¡ W 5 Q R X d	S )
z9
    Construct a new native list from a Python list.
    c              	      sº   |   |¡}ˆ jjt ˆ j|¡dd�� ˆ j tjˆ¡ ˆ ¡  W 5 Q R X ˆ j d||¡}ˆ jj|dd��< ˆ j tjˆ¡ ˆ j	 
dd||¡ ˆ j	 |¡ ˆ ¡  W 5 Q R X ˆ j	 |¡ d S )NFrÍ   r   rD   z(can't unbox heterogeneous list: %S != %S)r
   r   r~   r   rr   r.   rß   Údo_breakr    r   rÞ   r-   )Únthrð   Úexpected_typobjÚtypobjÚtype_mismatch©r   Úerrorptrrï   r   r   Úcheck_element_type�  s&    
þ ýz2_python_list_to_native.<locals>.check_element_typeTrÍ   r   ú>F)rÃ   N)$r   ræ   Úallocate_exr%   r   r¢   ri   r   r   r   r~   r    rò   r
   r   Zlist_getitemr   rè   rê   r   rZ   r   r.   rß   r   Úsetitemr<   r-   Ú	reflectedrÂ   r�   r0   Úobject_set_private_dataÚmeminfoÚ	set_dirtyr�   )r   r"   r   ri   Úlistptrr  r  rH   rí   Úif_okÚ	if_not_okr#   r  r  rð   r¨   r   r  r   Ú_python_list_to_native™  s@    ÿ
 ÿ
$r  c              
      sú   ˆ j  ˆ¡}t ˆ jtj¡}t ˆ jˆ j | ¡¡}ˆ j  	ˆ¡}ˆ j 
t ˆ j|¡¡�t\}}|�> tj ˆ jˆ j| |¡}	||	_| jrˆˆ|	_ˆ j |	j|¡ W 5 Q R X |� t| ˆˆ |||ƒ W 5 Q R X W 5 Q R X ‡ ‡fdd„}
tˆ j |¡ˆ j |¡|
d�S )z�
    Convert list *obj* to a native list.

    If list was previously unboxed, we reuse the existing native list
    to ensure consistency.
    c                      s   ˆ j  ˆ¡ d S r   ©r   Zobject_reset_private_datar   ©r   r"   r   r   ro   ý  s    zunbox_list.<locals>.cleanupr©   )r   Ú	list_sizer   rx   r   rª   r,   r%   rV   Úobject_get_private_datar¢   r   r   ræ   Úfrom_meminfori   r  rÂ   r.   r<   r  r   r0   )r   r"   r   ri   r  r  rj   Úhas_meminfor¥   rí   ro   r   r  r   Ú
unbox_listß  s&    &
þr  c                 C   sü  | j s
dS | jj r$d | ¡}t|ƒ‚t |j|j| |¡}|jj|j	dd���¦ |j
}|j |¡}|j}|j ||¡}|j d|t |jd¡¡}	|j |	¡��B\}
}|
�¼ t |j|¡�<}| |j¡}| |¡ | | j|¡}|j ||j|¡ W 5 Q R X t |j|¡�R}|j ||j¡}| |¡}| |¡ | | j|¡}|j ||¡ |j |¡ W 5 Q R X W 5 Q R X |�h |j |||d¡ t |j|¡�<}| |j¡}| |¡ | | j|¡}|j ||j|¡ W 5 Q R X W 5 Q R X W 5 Q R X | d¡ W 5 Q R X dS )zD
    Reflect the native list's contents into the Python object.
    Nz2cannot reflect element of reflected container: {}
FrÍ   z>=r   ) r  rZ   ÚformatÚ	TypeErrorr   ræ   r%   r   r~   ÚdirtyrÂ   r   r  ri   Úsubr    r   r   r   r¢   r   rè   ré   rê   rë   r   rì   r€   Zlist_appendr-   Zlist_setslicer  )r   r   r   Úmsgrí   r"   ri   Únew_sizeÚdiffZ	diff_gt_0Zif_growZ	if_shrinkrï   rÖ   rð   r‡   r   r   r   Úreflect_list  sH    

ÿ


 
0r!  c                 C   sX  t j |j|j| |¡\}}|jj|dd���ì\}}	|��¶ t |jt 	|j
jd¡¡}
|j
 |¡��}|j}|j
 |¡}|j |
¡}|jjt |j|¡dd��Š\}}|� |j ||
¡ W 5 Q R X |�X |j d||¡}|jj|dd��, |j tj|¡ |j
 dd¡ | ¡  W 5 Q R X W 5 Q R X W 5 Q R X | | j|¡}|jj|jdd�� |j tj|¡ W 5 Q R X |j|j
|jdd� W 5 Q R X | j�r”||_|jj|j |j |¡¡dd�� |j
 ||j¡ W 5 Q R X |  d¡ |j |j|¡ W 5 Q R X |	� |j tj|¡ W 5 Q R X W 5 Q R X |j |j |¡¡� |jj! "|j| |j¡ W 5 Q R X dS )	z7
    Construct a new native set from a Python set.
    TrÍ   NFr   rD   zcan't unbox heterogeneous set)Z	do_resize)#r   ÚSetInstancer	  r%   r   r¢   r   rx   r   r   r   ZpyobjZset_iterater<   Úget_typer0   rr   r.   r    r~   rß   rF   r   r   rZ   r   Z	add_pyapir  rÂ   r�   r  r  r  r�   r-   )r   r"   r   ri   Úsetptrr  rH   Úinstr  r  Z	typobjptrrï   rð   r  r  Zif_firstZif_not_firstr  r¨   r   r   r   Ú_python_set_to_native9  sV    ÿþ
ÿÿ&ÿ
$r&  c              
      sô   ˆ j  ˆ¡}t ˆ jtj¡}t ˆ jˆ j | ¡¡}ˆ j  	ˆ¡}ˆ j 
t ˆ j|¡¡�n\}}|�8 tj ˆ jˆ j| |¡}	| jr‚ˆ|	_ˆ j |	j|¡ W 5 Q R X |� t| ˆˆ |||ƒ W 5 Q R X W 5 Q R X ‡ ‡fdd„}
tˆ j |¡ˆ j |¡|
d�S )zŒ
    Convert set *obj* to a native set.

    If set was previously unboxed, we reuse the existing native set
    to ensure consistency.
    c                      s   ˆ j  ˆ¡ d S r   r  r   r  r   r   ro   ‘  s    zunbox_set.<locals>.cleanupr©   )r   Zset_sizer   rx   r   rª   r,   r%   rV   r  r¢   r   r   r"  r  r  rÂ   r.   r<   r&  r   r0   )r   r"   r   ri   r  r$  rj   r  r¥   r%  ro   r   r  r   Ú	unbox_sett  s$    &
þr'  c              
   C   sÞ   |j }|j |¡}t |j|¡}|jj|dd��  t |jt 	|j
d¡¡}| ¡ �t}|j |¡}|jj}	|jj |j| j|	¡ | | j|	¡}
|j |||
¡ |j |t 	|j
d¡¡}|j ||¡ W 5 Q R X W 5 Q R X ||fS )z9
    Create a Python list from a native set's items.
    TrÍ   r   rt   )Úusedr   rç   r   r   r   r~   rx   r   r   r   Z_iterater0   ÚentryÚkeyr%   r�   rÃ   rZ   r   rì   r€   r.   )r   Úpayloadr   rœ   r   rH   rê   rï   rÕ   rÖ   rð   r   r   r   Ú_native_set_to_python_listš  s     ÿ
"r,  c                 C   sò   t  |j|j| |¡}|j}t |j|¡}|j t |j|¡¡�Ž\}}|� |j	 
|¡ W 5 Q R X |�^ |j}t| ||ƒ\}	}
|jj|	dd��, |j	 |
¡}|j	 |
¡ |j ||¡ W 5 Q R X W 5 Q R X W 5 Q R X |jj |j| |¡ |j |¡S )z3
    Convert native set *val* to a set object.
    TrÍ   )r   r"  r%   r   rÂ   r   rx   r¢   r   r   rÃ   r+  r,  r~   Zset_newr-   r.   r�   r0   )r   r   r   r%  r"   rÊ   rî   r¥   r+  rH   r   r   r   r   Úbox_set°  s    ,r-  c              
   C   s¨   | j s
dS t |j|j| |¡}|j}|jj|jdd��h |j}|j	 
|¡ t| ||ƒ\}}|jj|dd��  |j	 ||¡ |j	 |¡ W 5 Q R X | d¡ W 5 Q R X dS )zC
    Reflect the native set's contents into the Python object.
    NFrÍ   T)r  r   r"  r%   r   r+  r~   r  rÂ   r   Z	set_clearr,  Z
set_updater-   r  )r   r   r   r%  r+  r"   rH   r   r   r   r   Úreflect_setÍ  s    r.  c                 C   s   |j  || |jj¡S r   )r   Zfrom_native_generatorrh   Zenv_ptrr   r   r   r   Úbox_generatorê  s    r/  c                 C   s   |j  || ¡S r   )r   Zto_native_generatorr½   r   r   r   Úunbox_generatorî  s    r0  c                 C   s    t  | j¡}|j |j |¡¡S r   ©r   rÁ   rZ   r   r[   r\   ©r   r   r   rÆ   r   r   r   Ú	box_dtypeó  s    r3  c                 C   s   t |j ¡ ƒS r   rM   r   r   r   r   Úunbox_dtypeø  s    r4  c                 C   s    t  | j¡}|j |j |¡¡S r   r1  r2  r   r   r   Úbox_number_classý  s    r5  c                 C   s   t |j ¡ ƒS r   rM   r   r   r   r   Úunbox_number_class  s    r6  c                 C   s   |S r   r   r   r   r   r   Úbox_pyobject  s    r7  c                 C   s   t |ƒS r   ©r   r½   r   r   r   Úunbox_pyobject  s    r9  c           	   
   C   s   | j d krt| ƒ‚|j | ¡}tj|jt |d ¡dd�}|j	 
| j ¡}|j	 |¡}t |jt |j|¡¡�v |j	 ||f¡}|j	 |¡ t |jt |j|¡¡�6 |j	 |¡}|j	 |¡ |j |j ||¡|¡ W 5 Q R X W 5 Q R X t|j |¡|j	 ¡ d�S )NZfnptr)Únamer   )Úget_pointerÚNotImplementedErrorr%   Zget_function_pointer_typer   rx   r   r   r   r   r\   r[   rŒ   r   r^   r-   Zlong_as_voidptrr.   rg   r   r0   r!   )	r   r"   r   Zptrtyr—   Zserr;  Zintobjrj   r   r   r   Úunbox_funcptr  s*    

þÿÿ,r=  c                 C   s(   |j j|  ¡ |j |dg¡|jd�}|S )Nr   )rh   )r   Zfrom_native_valueÚgetr   rÔ   rh   )r   r   r   Úoutr   r   r   Úbox_deferred)  s
    þr@  c                 C   sF   |j  |  ¡ |¡}|jj|  }| |j| ¡ |j¡}t	||j
|jd�S )Nr©   )r   Zto_native_valuer>  r%   Zdata_model_managerÚsetr   Zmake_uninitializedr<   r   r   ro   )r   r"   r   Znative_valueÚmodelrÊ   r   r   r   Úunbox_deferred1  s    ÿrC  c                 C   s   t |ƒS r   r8  r½   r   r   r   Úunbox_dispatcher:  s    rD  c                 C   s   |j  |¡ |S r   )r   rÃ   r   r   r   r   r7  @  s    c                 C   s.   |j  dd | ¡¡ |j | ¡}t|tjd�S )NrD   zcan't unbox {!r} typer   )r   rF   r  r%   Zget_constant_nullr   r   rß   )r   r"   r   rÊ   r   r   r   Úunbox_unsupportedF  s
    ÿrE  c                 C   s&   d| f }|j  d|¡ |j  ¡ }|S )Nz)cannot convert native %s to Python objectrD   )r   rF   Zget_null_object)r   r   r   r  rÊ   r   r   r   Úbox_unsupportedM  s    

rF  c                 C   s   | j }|j |j |¡¡S r   )r±   r   r[   r\   )r   r   r   Úretvalr   r   r   Úbox_literalT  s    rH  c                 C   s   |j  |¡S r   )r   Znrt_meminfo_as_pyobjectr   r   r   r   Úbox_meminfo_pointer]  s    rI  c                 C   s&   |j  |¡}t |j|¡}t||d�S r*   )r   Znrt_meminfo_from_pyobjectr   rr   r   r   )r   r"   r   rÊ   Zerroredr   r   r   Úunbox_meminfo_pointerb  s    rJ  c                 C   s   t |j ¡ tjd�S r*   )r   r%   rN   r   rª   r   r   r   r   Úunbox_typerefh  s    rK  c                 C   s   t | ||ƒS r   )rF  r   r   r   r   Úbox_LiteralStrKeyDictm  s    rL  c           	   
      sB  t  ˆ jt j¡‰g ‰‡ ‡fdd„‰‡ ‡‡fdd„‰tƒ ��ê‰	‡ ‡fdd„‰t  | ¡ˆ jˆ jƒ‰
|ˆ
_ˆ|dƒ‰t  ˆ jˆ	ˆ¡� ˆƒ  W 5 Q R X ˆˆdƒ}t  ˆ jˆ	|¡� ˆƒ  W 5 Q R X t	ˆ
dˆ  
tj|¡jƒ ˆˆd	ƒ}t  ˆ jˆ	|¡� ˆƒ  W 5 Q R X ˆ|d
ƒ}t  ˆ jˆ	|¡� ˆƒ  W 5 Q R X t	ˆ
d	ˆ  
tj|¡jƒ ˆ j ˆ jjd¡}ˆ j |¡}ˆ |¡ t  ˆ jˆ	|¡� ˆƒ  W 5 Q R X ˆ|dƒ‰t  ˆ jˆ	ˆ¡� ˆƒ  W 5 Q R X ˆ|dƒ‰t  ˆ jˆ	ˆ¡� ˆƒ  W 5 Q R X ‡ ‡‡‡‡‡‡‡	‡
f	dd„}|dƒ |dƒ |dƒ ˆƒ  W 5 Q R X tˆ
 ¡ ˆ j ˆ¡d�S )ar  
    The bit_generator instance has a `.ctypes` attr which is a namedtuple
    with the following members (types):
    * state_address (Python int)
    * state (ctypes.c_void_p)
    * next_uint64 (ctypes.CFunctionType instance)
    * next_uint32 (ctypes.CFunctionType instance)
    * next_double (ctypes.CFunctionType instance)
    * bit_generator (ctypes.c_void_p)
    c                     s   ˆD ]} ˆ j  | ¡ qd S r   )r   r-   )Z_ref©r   Ú
extra_refsr   r   Úclear_extra_refsƒ  s    z9unbox_numpy_random_bitgenerator.<locals>.clear_extra_refsc                      s   ˆ j  tjˆ¡ ˆƒ  d S r   )r   r.   r   rß   r   )r   rO  rã   r   r   Úhandle_failure‡  s    z7unbox_numpy_random_bitgenerator.<locals>.handle_failurec                    s   ˆ j  | |¡}ˆ |¡ |S r   )r   rb   rà   )r"   ÚattrZattr_objrM  r   r   Úobject_getattr_safely�  s    
z>unbox_numpy_random_bitgenerator.<locals>.object_getattr_safelyÚctypesZstate_addressÚstater<   r&   Zc_void_pc              	      sÜ   ˆ j  ˆ| ¡}ˆ |¡ t ˆ jˆ|¡� ˆƒ  W 5 Q R X ˆ ˆ¡ ˆ j  |ˆg¡}t ˆ jˆ|¡� ˆƒ  W 5 Q R X ˆ ˆ¡ ˆ j  ˆ|¡}ˆ|dƒ}t ˆ jˆ|¡� ˆƒ  W 5 Q R X tˆd| › �ˆ  	t
j|¡jƒ d S )Nr<   Zfnptr_)r   rb   rà   r   Úearly_exit_if_nullr   Z
tuple_packr¸   Úsetattrr   r   rW   r<   )r:  Zinterface_next_fnr»   Zinterface_next_fn_castedZinterface_next_fn_casted_value)	r   Úct_castÚct_voidptr_tyÚctypes_bindingrN  rP  rR  ÚstackÚ
struct_ptrr   r   Úwire_in_fnptrsÆ  s,     ÿ


 ÿÿz7unbox_numpy_random_bitgenerator.<locals>.wire_in_fnptrsZnext_doubleZnext_uint64Znext_uint32r   )r   rx   r   rª   r   Úcreate_struct_proxyr%   rÂ   rU  rV  r   r   rW   r<   rõ   rö   r   r÷   rà   r   rG   r0   )	r   r"   r   Zinterface_state_addressZinterface_stateZinterface_state_valueZctypes_nameZctypes_moduler\  r   )r   rO  rW  rX  rY  rN  rP  rã   rR  rZ  r[  r   Úunbox_numpy_random_bitgenerators  sl    

 ÿÿ
 ÿþý


 r^  Úbit_generatorc           	   
   C   sÈ   t  |jt j¡}tƒ �”}t  | ¡|j|jƒ}|j |d¡}t  	|j||¡� |j 
t j|¡ W 5 Q R X | t|¡j}||_||_t  d¡}|j ||¡|_|j |¡ W 5 Q R X t| ¡ |j |¡d�S )a   
    Here we're creating a NumPyRandomGeneratorType StructModel with following fields:
    * ('bit_generator', _bit_gen_type): The unboxed BitGenerator associated with
                                        this Generator object instance.
    * ('parent', types.pyobject): Pointer to the original Generator PyObject.
    * ('meminfo', types.MemInfoPointer(types.voidptr)): The information about the memory
        stored at the pointer (to the original Generator PyObject). This is useful for
        keeping track of reference counts within the Python runtime. Helps prevent cases
        where deletion happens in Python runtime without NRT being awareness of it. 
    r_  Nr   )r   rx   r   rª   r   r]  r%   r   rb   rU  r.   rß   r   Ú_bit_gen_typer<   r_  rÂ   Z	voidptr_tZnrt_meminfo_new_from_pyobjectr  r-   r   rG   r0   )	r   r"   r   rã   rZ  r[  Zbit_gen_instZunboxedZNULLr   r   r   Úunbox_numpy_random_generatorð  s     
þra  c                 C   sR   |j  |j| |¡}|j}t |j|¡}|j |¡ |j j 	|j| |¡ |j 
|¡S r   )r%   r™   r   rÂ   r   rx   r   rÃ   r�   r-   r0   )r   r   r   r%  r"   rÊ   r   r   r   Úbox_numpy_random_generator  s    rb  N)‰rÿ   Zllvmliter   Z
numba.corer   r   Znumba.core.pythonapir   r   r   r   Znumba.core.errorsr	   Znumba.core.typing.typeofr
   r   r­   r   r   Znumba.npr   Ú
contextlibr   r   ÚBooleanr   r$   ZIntegerLiteralZBooleanLiteralr'   ÚIntegerr)   r1   ÚFloatr8   r9   ÚComplexrC   rJ   ZNoneTyperL   ZEllipsisTyperO   Z
NPDatetimerQ   rS   ZNPTimedeltarT   rU   Z
RawPointerrY   Z
EnumMemberra   rc   ZRecordrk   rs   ZUnicodeCharSeqrŠ   r˜   ÚBytesrž   ZCharSeqrŸ   r    ÚOptionalr¦   r«   Z	SliceTyper°   ZSliceLiteralr¼   ZStringLiteralr¾   ZArrayrÇ   ÚBufferrÌ   rÑ   ÚTupleZUniTupler×   Ú
NamedTupleZNamedUniTuplerØ   Z	BaseTuplerå   ÚListrñ   Úobjectrò   r  r  r!  r&  ÚSetr'  r,  r-  r.  Ú	Generatorr/  r0  ZDTyper3  r4  ZNumberClassr5  r6  ZPyObjectZObjectr7  r9  ZExternalFunctionPointerr=  ZDeferredTyper@  rC  Z
DispatcherrD  rE  rF  ÚLiteralrH  ZMemInfoPointerrI  rJ  ZTypeRefrK  ZLiteralStrKeyDictrL  ZNumPyRandomBitGeneratorTyper^  r`  ZNumPyRandomGeneratorTypera  rb  r   r   r   r   Ú<module>   s&  













	











!





/
1
!&F
&
2;
%


















z

 