B
      ›\´–  ã               @   s¶  d Z ddlmZ ddlmZ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 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ƒ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-ƒd-d.„ ƒZ.e	ej-ƒd/d0„ ƒZ/eej0ƒd1d2„ ƒZ1e	ej0ƒd3d4„ ƒZ2eej3ƒd5d6„ ƒZ4e	ej3ƒd7d8„ ƒZ5e	ej6ƒd9d:„ ƒZ7eej8ƒd;d<„ ƒZ9eej:ƒd=d>„ ƒZ;e	ej<ƒd?d@„ ƒZ=e	ej8ƒdAdB„ ƒZ>e	ej:ƒdCdD„ ƒZ?e
ej:ƒdEdF„ ƒZ@eejAƒeejBƒdGdH„ ƒƒZCeejDƒeejEƒdIdJ„ ƒƒZFe	ejGƒdKdL„ ƒZHeejIƒdMdN„ ƒZJG dOdP„ dPeKƒZLdQdR„ ZMe	ejIƒdSdT„ ƒZNe
ejIƒdUdV„ ƒZOdWdX„ ZPe	ejQƒdYdZ„ ƒZRd[d\„ ZSeejQƒd]d^„ ƒZTe
ejQƒd_d`„ ƒZUeejVƒdadb„ ƒZWe	ejVƒdcdd„ ƒZXeejYƒdedf„ ƒZZe	ejYƒdgdh„ ƒZ[eej\ƒdidj„ ƒZ]e	ej\ƒdkdl„ ƒZ^eej_ƒeej`ƒdmdn„ ƒƒZae	ej_ƒe	ej`ƒdodp„ ƒƒZbe	ejcƒdqdr„ ƒZdeejeƒdsdt„ ƒZfe	ejeƒdudv„ ƒZge	ejhƒdwdx„ ƒZidydz„ Zjd{d|„ Zkeejlƒd}d~„ ƒZmeejnƒdd€„ ƒZoe	ejnƒdd‚„ ƒZpe	ejqƒdƒd„„ ƒZrd…S )†zG
Boxing and unboxing of native Numba values to / from CPython objects.
é    )Úiré   )ÚcgutilsÚnumpy_supportÚtypes)ÚboxÚunboxÚreflectÚNativeValueé   )ÚlistobjÚsetobj)ÚIS_PY3c             C   s   |j  ||jj¡}|j |¡S )N)ÚbuilderÚzextÚpyapiZlongZbool_from_long)ÚtypÚvalÚcZlongval© r   ú3lib/python3.7/site-packages/numba/targets/boxing.pyÚbox_bool   s    r   c             C   s<   |j  |¡}t |jd¡}|j d||¡}t||j  ¡ dS )Nr   z!=)Úis_error)	r   Zobject_istruer   ÚConstantÚtyper   Ú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 )N)ÚcontextÚcastr   Zliteral_typer   )r   r   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 )N)	Úsignedr   Zsextr   ZlonglongZlong_from_longlongr   Z	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 d Q R X t|j |¡|j ¡ dS )N)r   )r    Úget_argument_typer   Úalloca_oncer   r   Znumber_longZif_object_okr#   Zlong_as_longlongZlong_as_ulonglongÚdecrefÚstoreZtruncr
   Úloadr   )r   r   r   Zll_typer   ZlongobjZllvalr   r   r   Úunbox_integer.   s    "r*   c             C   s<   | t jkr|j ||jj¡}n| t jks,t‚|}|j |¡S )N)	r   Úfloat32r   Úfpextr   ÚdoubleÚfloat64ÚAssertionErrorZfloat_from_double)r   r   r   Údbvalr   r   r   Ú	box_float>   s
    
r1   c             C   sj   |j  |¡}|j  |¡}|j  |¡ | tjkrF|j ||j 	| ¡¡}n| tj
ksTt‚|}t||j  ¡ dS )N)r   )r   Znumber_floatZfloat_as_doubler'   r   r+   r   Zfptruncr    r%   r.   r/   r
   r   )r   r   r   Zfobjr0   r   r   r   r   Úunbox_floatG   s    
r2   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   Ú	complex64r,   Úrealr   r-   ÚimagÚ
complex128r/   Zcomplex_from_doubles)r   r   r   ZcvalZfrealZfimagr   r   r   Úbox_complexU   s    
r9   c          	   C   sÖ   |j  |jtj¡}|j || ¡ ¡}t 	|j|¡}t 
|j|¡ |j dd| f ¡ W d 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 failed)r   )r    r4   r   r   r8   r   Zcomplex_adaptorÚ_getpointerr   Zis_falseZif_unlikelyÚerr_set_stringr5   r!   r6   r.   r+   r7   r/   r
   Ú	_getvalue)r   r   r   Zc128ÚokÚfailedZcplxr   r   r   Úunbox_complexa   s    
r@   c             C   s
   |j  ¡ S )N)r   Z	make_none)r   r   r   r   r   r   Úbox_noney   s    rA   c             C   s   t |j ¡ ƒS )N)r
   r    Úget_dummy_value)r   r   r   r   r   r   Ú
unbox_none}   s    rC   c             C   s   |j  || j¡S )N)r   Zcreate_np_datetimeÚ	unit_code)r   r   r   r   r   r   Úbox_npdatetimeƒ   s    rE   c             C   s   |j  |¡}t||j  ¡ dS )N)r   )r   Zextract_np_datetimer
   r   )r   r   r   r   r   r   r   Úunbox_npdatetime‡   s    rF   c             C   s   |j  || j¡S )N)r   Zcreate_np_timedeltarD   )r   r   r   r   r   r   Úbox_nptimedelta   s    rG   c             C   s   |j  |¡}t||j  ¡ dS )N)r   )r   Zextract_np_timedeltar
   r   )r   r   r   r   r   r   r   Úunbox_nptimedelta‘   s    rH   c             C   s*   |j  tj¡}|j ||¡}| tj|¡S )z0
    Convert a raw pointer to a Python int.
    )r    Úget_value_typer   Zuintpr   Zptrtointr   )r   r   r   Zll_intpZaddrr   r   r   Úbox_raw_pointer—   s    rJ   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    rR   c             C   s   |j  |d¡}| | j|¡S )z=
    Convert an enum member's value to its native value.
    r3   )r   Úobject_getattr_stringr   rK   )r   r   r   rP   r   r   r   Ú
unbox_enum«   s    rT   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_recordrK   Úenv_manager)r   r   r   ÚsizeÚptrr   r   r   Ú
box_record¸   s    r\   c                s\   ˆj  ¡ ‰ ˆj  |ˆ ¡}t ˆj|¡}ˆj | ¡}ˆj ||¡}‡ ‡fdd„}t	|||dS )Nc                  s   ˆj  ˆ ¡ d S )N)r   Úrelease_bufferr   )Úbufr   r   r   ÚcleanupÉ   s    zunbox_record.<locals>.cleanup)r_   r   )
r   Úalloca_bufferZextract_record_datar   Úis_nullr   r    rI   rX   r
   )r   r   r   r[   r   Zltypr   r_   r   )r^   r   r   Úunbox_recordÀ   s    
rb   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 d Q R X W d Q R X |j |¡}|j ||¡S )N)r3   r   r   )r   Úalloca_once_valuer   rX   r   Zcstringr    Zget_constantr   ZintprW   r   Z	loop_nestr)   ZgepÚif_thenÚis_not_nullr(   ÚaddZbytes_from_string_and_size)r   r   r   ZrawptrZstrptrZfullsizer   ZonerW   ÚidxZchZstrlenr   r   r   Úbox_charseqÎ   s    

,rh   c          	   C   sÀ   |j  | ¡}|j |¡\}}}t |j|¡n t |j	| j
¡}|j d||¡}|j |||¡}t |d ¡}	t |j|	¡}
t |j|j |
|j	¡||¡ W d Q R X |j |
¡}t||j |¡dS )Nz<=)r   )r    rI   r   Zstring_as_string_and_sizer   Ú	if_likelyr   r   r   r   rW   Úicmp_unsignedZselectrc   ZmemcpyrX   r)   r
   Únot_)r   r   r   Últyr>   ÚbufferrZ   Zstorage_sizeZ	size_fitsZnull_stringZoutspaceÚretr   r   r   Úunbox_charseqä   s    ro   c          	   C   sj   |j  |j| |¡}t |j|j ¡ ¡}|j |j¡$ | 	| j
|j¡}|j ||¡ W d Q R X |j |¡S )N)r    Úmake_helperr   r   rc   r   Úborrow_nonerd   Zvalidr   r   Údatar(   r)   )r   r   r   Zoptvalrn   Zvalidresr   r   r   Úbox_optional  s    rs   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 dQ R X | ˆ j ||¡ W dQ R X W d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.
    z!=Nc            	      s$   ˆ j  ˆ¡ ˆ ¡  W d Q R X d S )N)r   rd   r_   r   )r   Úis_not_noneÚnativer   r   r_   "  s    zunbox_optional.<locals>.cleanup)r   r_   )r    Zmake_optional_noner   r   r   r   rq   r   r&   rc   Ú	false_bitÚif_elser   Zmake_optional_valuer3   r(   r   r_   r)   r
   )r   r   r   ZnonevalZretptrZerrptrZthenZorelseZjustr_   rn   r   )r   rt   ru   r   Úunbox_optional  s&    
"
rx   c       	      C   sZ   ddl m} |j |¡\}}}}|j |j| ¡}||_||_||_	t
| ¡ |j |¡dS )z;
    Convert object *obj* to a native slice structure.
    r   )Úslicing)r   )Ú ry   r   Zslice_as_intsr    rp   r   ÚstartÚstopÚstepr
   r=   rk   )	r   r   r   ry   r>   r{   r|   r}   Zslir   r   r   Úunbox_slice-  s    r~   c       	      C   st   |j  | ¡}||j |j|d}|j jrZt | j¡}|j |j 	|¡¡}|j
 | ||¡}|S |j}|j
 |¡ |S d S )N)r3   )r    Ú
make_arrayr   Ú
enable_nrtr   Úas_dtyperK   rY   Z
read_constZ	add_constr   Znrt_adapt_ndarray_to_pythonÚparentÚincref)	r   r   r   ÚnativearyclsÚ	nativearyÚnp_dtypeZdtypeptrZnewaryr‚   r   r   r   Ú	box_arrayB  s    r‡   c             C   s  |j j|j| |d}|j}t |j|¡}|j t |j|¡¡>\}}|¢ |j 	|¡ |j 
d¡}|j |d|g¡}	|j t |j|	¡¡J\}
}|
 |j |	¡ W d Q R X | |j |j ¡ |¡ W d Q R X W d Q R X |j |¡ W d Q R X |~ |j |j | j¡¡}| | j|j¡}|j tj¡}|j |||f¡}|j |¡ |j |¡ |j |¡ |j ||¡ W d Q R X W d Q R X |j |¡S )N)r3   ÚhostÚmark_changed)r    rp   r   r‚   r   rc   rw   re   r   rƒ   Ústring_from_constant_stringÚcall_methodr'   r(   Úget_null_objectrL   rM   Zpyclassr   Úas_arrayrr   Zbool_from_boolrv   rO   r)   )r   r3   r   Úar   ÚresÚ
has_parentÚ	otherwiserˆ   ÚretnÚsuccessÚfailureZclassobjZarrayobjZfalser   r   r   Úbox_smart_arrayQ  s0    ("r•   c       
   	      sÆ   ˆj  ¡ ‰ ˆj  |ˆ ¡}t ˆj|¡}ˆj | ¡}|ˆjˆjƒ}| ¡ }t 	ˆjˆj 
|¡¡> ˆj |ˆj j¡}ˆjjrŠˆj  ˆ |¡ nˆj  ˆ |¡ W dQ R X ‡ ‡fdd„}	tˆj |¡||	dS )zK
    Convert a Py_buffer-providing object to a native array structure.
    Nc                  s   ˆj  ˆ ¡ d S )N)r   r]   r   )r^   r   r   r   r_   †  s    zunbox_buffer.<locals>.cleanup)r   r_   )r   r`   Z
get_bufferr   re   r   r    r   r;   ri   rk   rX   Úvoidptrr€   Znrt_adapt_buffer_from_pythonZnumba_buffer_adaptorr
   r)   )
r   r   r   r   r   r„   r…   Úaryptrr[   r_   r   )r^   r   r   Úunbox_bufferr  s    
r˜   c          	   C   sü   |j  | ¡}||j |jƒ}| ¡ }|j ||jj¡}|j jrL|j ||¡}n|j 	||¡}y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 dQ R X t|j |¡|
dS )zC
    Convert a Numpy array object to a native array structure.
    z!=F)Úlikelyr:   zXcan't unbox array from PyObject into native value.  The object maybe of a different typeN)r   )r    r   r   r;   rX   r   r–   r€   Znrt_adapt_ndarray_from_pythonZnumba_array_adaptorr   r   rK   ÚitemsizeÚNotImplementedErrorr   rv   r   rj   Úor_re   rd   r<   r
   r)   )r   r   r   r„   r…   r—   r[   ZerrcodeZexpected_itemsizeZitemsize_mismatchr?   r   r   r   Úunbox_arrayŒ  s.    
r   c          
   C   sº   |j  |j| ¡}|j d¡}|j |d|g¡}|j t |j|¡¡X\}}|* | 	| j
|¡j|_||_|j |¡ W d Q R X | |j ¡  W d Q R X W d Q R X |j |¡ t| ¡ ƒS )Nrˆ   Úget)r    rp   r   r   rŠ   r‹   rw   r   re   r   r   r3   rr   r‚   r'   Úraise_objectr
   r=   )r   r   r   rŽ   rˆ   Úarrr“   r”   r   r   r   Úunbox_smart_array¼  s    r¡   c       	   
   C   s¢   |j  |j| |¡}|j}|j d¡}|j |d|g¡}|j t 	|j|¡¡@\}}| |j 
|¡ W d Q R X | |j ¡  W d Q R X W d Q R X |j 
|¡ d S )Nrˆ   r‰   )r    rp   r   r‚   r   rŠ   r‹   rw   r   re   r'   rŸ   )	r   r3   r   rŽ   r    rˆ   r’   r“   r”   r   r   r   Úreflect_smart_arrayÍ  s    r¢   c             C   sR   |j  | j¡}x>t| ƒD ]2\}}|j ||¡}| ||¡}|j  |||¡ qW |S )zD
    Convert native array or structure *val* to a tuple object.
    )r   Ú	tuple_newrW   Ú	enumerater   Úextract_valuer   Ztuple_setitem)r   r   r   Z	tuple_valÚirK   Ú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   rL   rM   rN   r¨   Zcallr'   )r   r   r   rQ   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 dQ R X x~t| ƒD ]r\}
}|j ||
¡}| ||¡}| |j¡ |jj|jdd |j tj|¡ W dQ R X |jdk	r´ˆ  |j¡ q´W |j |j| |¡}|j ||¡ ˆ rz|jj|	dd ‡ fdd	„}W dQ R X nd}t|j |¡||j |¡d
S )zN
    Convert tuple *obj* to a native array (if homogeneous) or structure.
    z==F)r™   ZPyExc_ValueErrorz<size mismatch for tuple, expected %d element(s) but got %%zdNTc                 s   xt ˆ ƒD ]
} | ƒ  q
W d S )N)Úreversed)Úfunc)Úcleanupsr   r   r_      s    zunbox_tuple.<locals>.cleanup)r_   r   )Úlenr    rI   r   rc   r   rv   r&   r   Z
tuple_sizerj   r   r   r   rd   rk   Ú
err_formatr(   Útrue_bitr¤   Ztuple_getitemr   Úappendr3   r   r_   Z
make_tupler
   r)   )r   r   r   ÚnÚvaluesrl   Zis_error_ptrZ	value_ptrZactual_sizeZsize_matchesr¦   ZeltypeÚelemru   r3   r_   r   )r¬   r   Úunbox_tupleø  s>    

r´   c             C   s0  t  |j|j| |¡}|j}t |j|¡}|j t |j|¡¡Ì\}}| |j	 
|¡ W dQ R X |œ |j}|j	 |¡}|jjt |j|¡ddV t |j|¡<}	| |	j¡}
| |
¡ | | j|
¡}|j	 ||	j|¡ W dQ R X W dQ R X |j ||¡ W dQ R X W dQ R X |jj |j| |¡ |j |¡S )z5
    Convert native list *val* to a list object.
    NT)r™   )r   ÚListInstancer    r   r‚   r   rc   rw   re   r   rƒ   rZ   Úlist_newrd   Ú	for_rangeÚgetitemÚindexÚincref_valuer   rK   Úlist_setitemr(   Únrtr'   r)   )r   r   r   Úlistr   r   r   r‘   ÚnitemsÚloopr§   Úitemobjr   r   r   Úbox_list*  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 )N)r   )Úselfr   r   r   r   Ú__init__]  s    z_NumbaTypeHelper.__init__c             C   sH   | j }|j |jjd¡}|j |¡}|j |d¡}|| _|j 	|¡ | S )NZnumbaÚtypeof)
r   r    Zinsert_const_stringr   Úmoduler   Zimport_module_noblockrS   Ú	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 )N)r   r   r'   rÇ   )rÃ   ÚargsÚkwargsr   r   r   r   Ú__exit__i  s    z_NumbaTypeHelper.__exit__c             C   s   | j j | j|g¡}|S )N)r   r   rO   rÇ   )rÃ   r   r   r   r   r   rÅ   m  s    z_NumbaTypeHelper.typeofN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rÄ   rÈ   rË   rÅ   r   r   r   r   rÂ   L  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 dQ R X |jˆj|jdd	 W dQ R X ˆ j |¡ W dQ R X W dQ R X | jrV||_ˆ jj
ˆ j ˆ j ˆ¡¡dd ˆ j  ||j!¡ W dQ R X | "d¡ ˆ j |j|¡ W dQ R X |
 ˆ j tjˆ¡ W dQ R X W dQ R X ˆ j 
ˆ j ˆ¡¡ ˆ jj# ˆ j| |j¡ W d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 d Q R X ˆ j d||¡}ˆ jj|ddP ˆ j tjˆ¡ t	r’ˆ j
 dd||¡ nˆ j
 dd¡ ˆ j
 |¡ ˆ ¡  W d Q R X ˆ j
 |¡ d S )NF)r™   z!=r:   z(can't unbox heterogeneous list: %S != %Szcan't unbox heterogeneous list)rÅ   r   rd   r   ra   r(   r¯   Údo_breakr   r   r   r®   r<   r'   )ÚnthrÀ   Úexpected_typobjÚtypobjÚtype_mismatch)r   Úerrorptrr¿   r   r   Úcheck_element_typev  s(    


z2_python_list_to_native.<locals>.check_element_typeT)r™   r   ú>FN)rƒ   )$r   rµ   Úallocate_exr    r   rw   rZ   r   r   r   rd   r   rÂ   rÅ   r   Zlist_getitemr   r·   r¹   r   rK   r   r(   r¯   rÐ   Úsetitemr3   r'   Ú	reflectedr‚   rk   r)   Úobject_set_private_dataÚmeminfoÚ	set_dirtyr¼   )r   r   r   rZ   ÚlistptrrÕ   rÖ   r>   r½   Úif_okÚ	if_not_okr   rÑ   rÒ   rÀ   ru   r   )r   rÕ   r¿   r   Ú_python_list_to_nativer  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 dQ R X | t| ˆˆ |||ƒ W dQ R X W d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.
    Nc                  s   ˆ j  ˆ¡ d S )N)r   Úobject_reset_private_datar   )r   r   r   r   r_   Ý  s    zunbox_list.<locals>.cleanup)r   r_   )r   Ú	list_sizer   rc   r   rv   r&   r    rI   Úobject_get_private_datarw   re   r   rµ   Úfrom_meminforZ   rÚ   r‚   r(   r3   rá   r
   r)   )r   r   r   rZ   rÕ   rÞ   r[   Úhas_meminfor‘   r½   r_   r   )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 dQ R X t |j|¡R}|j ||j¡}| |¡}| |¡ | | j|¡}|j ||¡ |j |¡ W dQ R X W dQ R X |h |j |||d¡ t |j|¡<}| |j¡}| |¡ | | j|¡}|j ||j|¡ W dQ R X W dQ R X W dQ R X | d¡ W dQ R X dS )zD
    Reflect the native list's contents into the Python object.
    Nz2cannot reflect element of reflected container: {}
F)r™   z>=r   ) rÚ   rK   ÚformatÚ	TypeErrorr   rµ   r    r   rd   Údirtyr‚   r   rã   rZ   Úsubr   r   r   r   rw   r   r·   r¸   r¹   rº   r   r»   rf   Zlist_appendr'   Zlist_setslicerÝ   )r   r   r   Úmsgr½   r   rZ   Znew_sizeZdiffZ	diff_gt_0Zif_growZ	if_shrinkr¿   r§   rÀ   rg   r   r   r   Úreflect_listæ  sF    




 
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 dQ R X |X |j d||¡}|jj|dd, |j tj|¡ |j
 dd¡ | ¡  W dQ R X W dQ R X W dQ R X | | j|¡}|jj|jdd |j tj|¡ W dQ R X |j|j
|jdd W dQ R X | jr”||_|jj|j |j |¡¡dd |j
 ||j¡ W dQ R X |  d¡ |j |j|¡ W dQ R X |	 |j tj|¡ W dQ R X W dQ R X |j |j |¡¡ |jj! "|j| |j¡ W dQ R X dS )	z7
    Construct a new native set from a Python set.
    T)r™   NFz!=r:   zcan't unbox heterogeneous set)Z	do_resize)#r   ÚSetInstancerØ   r    r   rw   r   rc   r   r   r   ZpyobjZset_iterater3   Zget_typer)   ra   r(   r   rd   r¯   r<   rÐ   r   rK   r   Z	add_pyapirÚ   r‚   rk   rÛ   rÜ   rÝ   r¼   r'   )r   r   r   rZ   ÚsetptrrÕ   r>   Úinstrß   rà   Z	typobjptrr¿   rÀ   rÓ   rÒ   Zif_firstZif_not_firstrÔ   ru   r   r   r   Ú_python_set_to_native  sJ    
&

$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 dQ R X | t| ˆˆ |||ƒ W dQ R X W d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.
    Nc                  s   ˆ j  ˆ¡ d S )N)r   râ   r   )r   r   r   r   r_   q  s    zunbox_set.<locals>.cleanup)r   r_   )r   Zset_sizer   rc   r   rv   r&   r    rI   rä   rw   re   r   rî   rå   rÚ   r‚   r(   r3   rñ   r
   r)   )r   r   r   rZ   rÕ   rï   r[   ræ   r‘   rð   r_   r   )r   r   r   Ú	unbox_setT  s"    &
rò   c          
   C   sÈ   |j }|j |¡}t |j|¡}|jj|ddŠ t |jt 	|j
d¡¡}| ¡ ^}|j |¡}|jj}	| | j|	¡}
|j |||
¡ |j |t 	|j
d¡¡}|j ||¡ W dQ R X W dQ R X ||fS )z9
    Create a Python list from a native set's items.
    T)r™   r   r   N)Zusedr   r¶   r   re   r   rd   rc   r   r   r   Z_iterater)   ÚentryÚkeyr   rK   r»   rf   r(   )r   Úpayloadr   r¾   r   r>   r¹   r¿   r¦   r§   rÀ   r   r   r   Ú_native_set_to_python_listz  s    
"rö   c             C   sò   t  |j|j| |¡}|j}t |j|¡}|j t |j|¡¡Ž\}}| |j	 
|¡ W dQ R X |^ |j}t| ||ƒ\}	}
|jj|	dd, |j	 |
¡}|j	 |
¡ |j ||¡ W dQ R X W dQ R X W dQ R X |jj |j| |¡ |j |¡S )z3
    Convert native set *val* to a set object.
    NT)r™   )r   rî   r    r   r‚   r   rc   rw   re   r   rƒ   rõ   rö   rd   Zset_newr'   r(   r¼   r)   )r   r   r   rð   r   r   r   r‘   rõ   r>   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 dQ R X | d¡ W dQ R X dS )zC
    Reflect the native set's contents into the Python object.
    NF)r™   T)rÚ   r   rî   r    r   rõ   rd   rê   r‚   r   Z	set_clearrö   Z
set_updater'   rÝ   )r   r   r   rð   rõ   r   r>   r   r   r   r   Úreflect_set¬  s    rø   c             C   s   |j  || |jj¡S )N)r   Zfrom_native_generatorrY   Zenv_ptr)r   r   r   r   r   r   Úbox_generatorÉ  s    rù   c             C   s   |j  || ¡S )N)r   Zto_native_generator)r   r   r   r   r   r   Úunbox_generatorÍ  s    rú   c             C   s    t  | j¡}|j |j |¡¡S )N)r   r   rK   r   rL   rM   )r   r   r   r†   r   r   r   Ú	box_dtypeÒ  s    rû   c             C   s   t |j ¡ ƒS )N)r
   r    rB   )r   r   r   r   r   r   Úunbox_dtype×  s    rü   c             C   s    t  | j¡}|j |j |¡¡S )N)r   r   rK   r   rL   rM   )r   r   r   r†   r   r   r   Úbox_number_classÜ  s    rý   c             C   s   t |j ¡ ƒS )N)r
   r    rB   )r   r   r   r   r   r   Úunbox_number_classá  s    rþ   c             C   s   |S )Nr   )r   r   r   r   r   r   Úbox_pyobjectæ  s    rÿ   c             C   s   t |ƒS )N)r
   )r   r   r   r   r   r   Úunbox_pyobjectë  s    r   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 d Q R X W d Q R X t|j |¡|j	 ¡ dS )NZfnptr)Úname)r   )Úget_pointerr›   r    Zget_function_pointer_typer   rc   r   r   r   r   rM   rL   ri   re   rO   r'   Zlong_as_voidptrr(   rX   r
   r)   r   )	r   r   r   Zptrtyrn   Zserr  Zintobjr[   r   r   r   Úunbox_funcptrñ  s$    

,r  c             C   s(   |j j|  ¡ |j |dg¡|jd}|S )Nr   )rY   )r   Zfrom_native_valuerž   r   r¥   rY   )r   r   r   Úoutr   r   r   Úbox_deferred  s    
r  c             C   sF   |j  |  ¡ |¡}|jj|  }| |j| ¡ |j¡}t	||j
|jdS )N)r   r_   )r   Zto_native_valuerž   r    Zdata_model_managerÚsetr   Zmake_uninitializedr3   r
   r   r_   )r   r   r   Znative_valueZmodelr   r   r   r   Úunbox_deferred  s
    r  c             C   s   |j  | ¡}t|ƒS )N)r    Zget_constant_undefr
   )r   r   r   r   r   r   r   Úunbox_dispatcher  s    r  c             C   s.   |j  dd | ¡¡ |j | ¡}t|tjdS )Nr:   zcan't unbox {!r} type)r   )r   r<   rè   r    Zget_constant_nullr
   r   r¯   )r   r   r   r   r   r   r   Úunbox_unsupported   s    r	  c             C   s&   d| f }|j  d|¡ |j  ¡ }|S )Nz)cannot convert native %s to Python objectr:   )r   r<   rŒ   )r   r   r   rì   r   r   r   r   Úbox_unsupported'  s    

r
  c             C   s   | j }|j |j |¡¡S )N)Zliteral_valuer   rL   rM   )r   r   r   Zretvalr   r   r   Úbox_literal.  s    r  c             C   s   |j  |¡S )N)r   Znrt_meminfo_as_pyobject)r   r   r   r   r   r   Úbox_meminfo_pointer7  s    r  c             C   s&   |j  |¡}t |j|¡}t||dS )N)r   )r   Znrt_meminfo_from_pyobjectr   ra   r   r
   )r   r   r   r   Zerroredr   r   r   Úunbox_meminfo_pointer<  s    r  c             C   s   t |j ¡ tjdS )N)r   )r
   r    rB   r   rv   )r   r   r   r   r   r   Úunbox_typerefB  s    r  N)srÏ   Zllvmliter   rz   r   r   r   Z	pythonapir   r   r	   r
   r   r   Zutilsr   ZBooleanr   r   ZIntegerLiteralr"   ZIntegerr$   r*   ZFloatr1   r2   ZComplexr9   r@   ZNoneTyperA   ZEllipsisTyperC   Z
NPDatetimerE   rF   ZNPTimedeltarG   rH   Z
RawPointerrJ   Z
EnumMemberrR   rT   ZRecordr\   rb   ZCharSeqrh   ro   ZOptionalrs   rx   Z	SliceTyper~   ZArrayr‡   ZSmartArrayTyper•   ZBufferr˜   r   r¡   r¢   ZTupleZUniTupler¨   Z
NamedTupleZNamedUniTupler©   Z	BaseTupler´   ZListrÁ   ÚobjectrÂ   rá   rç   rí   rñ   ÚSetrò   rö   r÷   rø   Ú	Generatorrù   rú   ZDTyperû   rü   ZNumberClassrý   rþ   ZPyObjectZObjectrÿ   r   ZExternalFunctionPointerr  ZDeferredTyper  r  Z
Dispatcherr  r	  r
  ZLiteralr  ZMemInfoPointerr  r  ZTypeRefr  r   r   r   r   Ú<module>   s   		


"!02"&M'3;&		