U
    ÷¾|eËû  ã                   @   s  d dl mZm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
 d dlmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZ d dlm Z  d dl!m"Z" d d	l#m$Z$m%Z% d d
l&m'Z' eddƒZ(G dd„ de)ƒZ*G dd„ de*ƒZ+dd„ Z,dS )é    )Ú
namedtupleÚdefaultdictN)Úpartial)ÚConstantÚ	IRBuilder)ÚtypingÚutilsÚtypesÚirÚ	debuginfoÚfuncdescÚ
generatorsÚconfigÚir_utilsÚcgutilsÚremoverefctpassÚtargetconfig)ÚLoweringErrorÚnew_error_contextÚTypingErrorÚLiteralTypingErrorÚUnsupportedErrorÚNumbaDebugInfoWarning)Údefault_mangler)ÚEnvironment)Úcompute_use_defsÚmust_use_alloca)Úget_func_body_first_linenoÚ_VarArgItem)ÚvarargÚindexc                   @   sÞ   e Zd ZdZd4dd„Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zd5dd„Zd6dd„Zd7dd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd8d(d)„Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ ZdS )9Ú	BaseLowerz
    Lower IR to LLVM
    Nc                 C   sæ   || _ || _t |j ¡ ¡| _|| _|j| _|| _t	j
 ¡ | _| j  | jj¡| _t | j¡| _i | _i | _i | _t| j ¡ ƒ| _d| _|j| j| jd�| _| jjrª| jjntj}|   ¡ | _!| jj"}|| j|jj#||d�| _|  $¡  d S )Néÿÿÿÿ)ZenvironmentÚfndesc)ÚmoduleÚfilepathÚcgctxÚdirectives_only)%Úlibraryr#   r   Ú	SortedMapÚblocksÚitemsÚfunc_irÚgenerator_infoÚmetadatar   ÚConfigStackÚtop_or_noneÚflagsZcreate_ir_moduleÚunique_namer$   r   Zfrom_fndescÚenvÚblkmapZpending_phisÚvarmapÚminÚkeysÚfirstblkÚlocZ	subtargetÚcontextÚenable_debuginfoÚ	DIBuilderr   ÚDummyDIBuilderÚ_compute_def_locationÚdefn_locÚdbg_directives_onlyÚfilenameÚinit)Úselfr:   r(   r#   r,   r.   Zdibuilderclsr'   © rD   úP/var/www/website-v5/atlas_env/lib/python3.8/site-packages/numba/core/lowering.pyÚ__init__   s:    ÿÿ
þ
ýzBaseLower.__init__c                 C   s   | j jS ©N)r:   Ú	call_conv©rC   rD   rD   rE   rH   K   s    zBaseLower.call_convc                 C   s   d S rG   rD   rI   rD   rD   rE   rB   O   s    zBaseLower.initc                 C   sF   | j dk	rdS | j | j¡| _ | j | j¡| _| jj| _| jj| _dS )ze
        Init the Python API and Environment Manager for the function being
        lowered.
        N)	Úpyapir:   Zget_python_apiÚbuilderÚget_env_managerÚenv_managerÚenv_bodyÚenv_ptrZenvargrI   rD   rD   rE   Ú
init_pyapiR   s    

zBaseLower.init_pyapic                 C   sv   | j j | j jjd ¡}| jjrr| j jj}t|ƒ}|d k	rR|d }| j j |¡}n d| j jj› d�}t	 
t|ƒ¡ |S )Né   z$Could not find source for function: z+. Debug line information may be inaccurate.)r,   r9   Úwith_linenoÚliner:   r;   Úfunc_idÚfuncr   ÚwarningsÚwarnr   )rC   r?   ÚfnZoptional_lnoÚoffsetÚmsgrD   rD   rE   r>   `   s    
zBaseLower._compute_def_locationc                 C   sf   d| _ | jj| jj| jj| jj| jj| j	j
d� | jjj}| jjoJ| jj }|rbd|krb| d¡ dS )z4
        Called before lowering all blocks.
        N)ÚfunctionÚqualnameÚargnamesÚargtypesrS   ÚalwaysinlineÚnoinline)rJ   r   Úmark_subprogramrK   r[   r#   r\   Úargsr^   r?   rS   Ú
attributesr1   r@   Úadd)rC   rc   Z
full_debugrD   rD   rE   Ú	pre_lowers   s    ü	
zBaseLower.pre_lowerc                 C   s   | j  ¡  dS )z5
        Called after all blocks are lowered
        N)r   ÚfinalizerI   rD   rD   rE   Ú
post_lower‰   s    zBaseLower.post_lowerc                 C   s   dS )z1
        Called before lowering a block.
        NrD   ©rC   ÚblockrD   rD   rE   Ú	pre_block�   s    zBaseLower.pre_blockc                 C   s   dS )z0
        Called after lowering a block.
        NrD   rh   rD   rD   rE   Ú
post_block”   s    zBaseLower.post_blockc                 C   s$   | j j| j||||| jjjd� d S )N©r9   Ú	func_name)rH   Zreturn_dynamic_user_excrK   r,   rT   rm   )rC   Ú	exc_classÚexc_argsÚnb_typesr9   rD   rD   rE   Úreturn_dynamic_exception™   s        þz"BaseLower.return_dynamic_exceptionc                 C   s"   | j j| j|||| jjjd� dS )z+Propagate exception to the caller.
        rl   N)rH   Úreturn_user_excrK   r,   rT   rm   ©rC   rn   ro   r9   rD   rD   rE   Úreturn_exceptionŸ   s       þzBaseLower.return_exceptionc                 C   s"   | j j| j|||| jjjd� dS )z5Set exception state in the current function.
        rl   N)rH   Zset_static_user_excrK   r,   rT   rm   rs   rD   rD   rE   Úset_exception§   s       þzBaseLower.set_exceptionc                 C   s"   | j  | j¡}| j  | j|¡ dS )z7Emit a pointer to hold the Environment object.
        N)r:   Zget_env_namer#   Zdeclare_env_globalr$   )rC   ÚenvnamerD   rD   rE   Úemit_environment_object¯   s    z!BaseLower.emit_environment_objectc                 C   sj  |   ¡  | jd kr&d | _|  | j¡ nB|  | ¡| _| jj| _| j | ¡ | j | ¡ | jj	rh| j 
| ¡ tj�rtd| j  dd¡ƒ tj�rzTddlm} ddlm} ddlm} ddlm} t|| j ¡ |ƒ ||ƒ d	�ƒƒ W n" tk
�r   d
}t|ƒ‚Y nX n
t| jƒ tdƒ | jj�rF| jd k�rFtj| j | j| jd� | j !| j| j"¡ | j" #| j¡ d S )NzLLVM DUMP %séP   ú-r   )Ú	highlight)Ú	LlvmLexer)ÚTerminal256Formatter)Úby_colorscheme)Ústylez0Please install pygments to see highlighted dumpszP================================================================================)r:   r#   )$rw   r-   ÚgenlowerÚlower_normal_functionr#   ÚGeneratorLowerÚgentypeZlower_init_funcZlower_next_funcÚhas_finalizerZlower_finalize_funcr   Ú	DUMP_LLVMÚprintÚcenterÚHIGHLIGHT_DUMPSÚpygmentsrz   Zpygments.lexersr{   Úpygments.formattersr|   Únumba.misc.dump_styler}   r$   Ú__repr__ÚImportErrorÚ
ValueErrorr:   Ú
enable_nrtr   Zremove_unnecessary_nrt_usager[   Zpost_loweringr(   Zadd_ir_module)rC   rz   Úlexerr|   r}   rZ   rD   rD   rE   Úlower¶   sF    

ÿÿ

þzBaseLower.lowerc                 C   s    | j  | j| jj| j¡| _| jS rG   )rH   Zdecode_argumentsrK   r#   r^   r[   ÚfnargsrI   rD   rD   rE   Úextract_function_argumentsã   s
    
þz$BaseLower.extract_function_argumentsc              	   C   sV   |   |¡ |  ¡  |  ¡ }t | j¡�& | j |¡ | j | j| j	 ¡ W 5 Q R X dS )z/
        Lower non-generator *fndesc*.
        N)
Úsetup_functionr’   Úlower_function_bodyr   Úsuspend_emissionrK   Úposition_at_endÚbranchr4   r8   )rC   r#   Úentry_block_tailrD   rD   rE   r€   é   s    
zBaseLower.lower_normal_functionc                 C   sž   | j D ]}d| }| j |¡| j|< q|  ¡  | jj}|  d | j	j
¡¡ t| j  ¡ ƒD ]8\}}| j| }| j |¡ |  d|› �¡ |  |¡ qX|  ¡  |S )zP
        Lower the current function's body, and return the entry block.
        zB%sz# function begin: {0}z# lower block: )r*   r[   Úappend_basic_blockr4   re   rK   Úbasic_blockÚdebug_printÚformatr#   r2   Úsortedr+   r–   Úlower_blockrg   )rC   rY   Zbnamer˜   ri   ÚbbrD   rD   rE   r”   ú   s    
ÿ
zBaseLower.lower_function_bodyc              
   C   sb   |   |¡ |jD ]B}|j| _tt| jd�}td|| j|d�� |  |¡ W 5 Q R X q|  |¡ dS )z(
        Lower the given block.
        ©r9   zlowering "{inst}" at {loc})Úinstr9   Úerrcls_N)rj   Úbodyr9   r   r   r   Ú
lower_instrk   )rC   ri   r¡   ZdefaulterrclsrD   rD   rE   rž     s    

 ÿzBaseLower.lower_blockFc                 C   sH   | j r&| jj| j| j j| j| j|d� | jj| j| j| j| j|d� dS )zP
        Create CPython wrapper(s) around this function (or generator).
        )Úrelease_gilN)r   r:   Úcreate_cpython_wrapperr(   Úgendescr3   Úcall_helperr#   )rC   r¥   rD   rD   rE   r¦      s    
 ý þz BaseLower.create_cpython_wrapperc                 C   s,   | j rtdƒ‚| j | j| j| j| j¡ dS )z8
        Create C wrapper around this function.
        z(generator as a first-class function typeN)r   r   r:   Úcreate_cfunc_wrapperr(   r#   r3   r¨   rI   rD   rD   rE   r©   -  s     ÿzBaseLower.create_cfunc_wrapperc                 C   sl   | j  | j|¡| _| jjr>| jj}d|kr>| d¡ | d¡ | j d¡| _	t
| j	ƒ| _| j | j¡| _d S )Nr_   Úoptnoner`   Úentry)r:   Údeclare_functionr$   r[   r1   Zdbg_optnonerc   rd   r™   Zentry_blockr   rK   rH   Zinit_call_helperr¨   )rC   r#   ZattrsetrD   rD   rE   r“   6  s    

zBaseLower.setup_functionc                 C   s   | j j| S rG   )r#   Útypemap)rC   ÚvarnamerD   rD   rE   ÚtypeofB  s    zBaseLower.typeofc                 C   s*   t jr&| j | jd| jj› d|› �¡ d S )Nz
DEBUGJIT [z]: )r   Ú	DEBUG_JITr:   r›   rK   r#   r\   )rC   rZ   rD   rD   rE   r›   E  s
     ÿzBaseLower.debug_printc                 C   sZ   t  |¡| jj| f}| j ¡ |  |¡f}tjt j	f|žŽ }| j 
t|¡}|| j|ƒ dS )zðHelper to emit ``print(msg, varname)`` for debugging.

        Parameters
        ----------
        msg : str
            Literal string to be printed.
        varname : str
            A variable name whose value will be printed.
        N)r	   Úliteralr#   r­   r:   Úget_dummy_valueÚloadvarr   Ú	signatureÚnoneÚget_functionr…   rK   )rC   rZ   r®   Úargtysrb   ÚsigÚimplrD   rD   rE   Úprint_variableJ  s    
þþzBaseLower.print_variable)N)N)NN)NN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rF   ÚpropertyrH   rB   rP   r>   re   rg   rj   rk   rq   rt   ru   rw   r�   r’   r€   r”   rž   r¦   r©   r“   r¯   r›   rº   rD   rD   rD   rE   r!      s4   
.



-
	r!   c                       sH  e Zd ZejZ‡ fdd„Zedd„ ƒZdd„ Z‡ fdd„Z	d	d
„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ ZdJd2d3„Zd4d5„ Zd6d7„ Z d8d9„ Z!d:d;„ Z"d<d=„ Z#dKd>d?„Z$d@dA„ Z%dBdC„ Z&dLdDdE„Z'dFdG„ Z(dHdI„ Z)‡  Z*S )MÚLowerc                    s   t ƒ  ¡  |  ¡  d S rG   )ÚsuperrB   Ú_find_singly_assigned_variablerI   ©Ú	__class__rD   rE   rB   e  s    
z
Lower.initc                 C   s    | j dkrdS | j jo| j j S )a  Flags that the SROA like optimisation that Numba performs (which
        prevent alloca and subsequent load/store for locals) should be disabled.
        Currently, this is conditional solely on the presence of a request for
        the emission of debug information.NF)r1   r   r@   rI   rD   rD   rE   Ú_disable_sroa_like_optj  s    
zLower._disable_sroa_like_optc                    s  | j }|j}tƒ }| j jj�st|ƒ}t|ƒ}ttƒ}|j 	¡ D ] \}}|D ]‰ |ˆ   
|¡ qLq@ttƒ}	|j 	¡ D ] \}}|D ]‰ |	ˆ   
|¡ q€qt|D ]p‰ ˆ |kršt|ˆ  ƒdkršt|	ˆ  ƒdkrš|ˆ  \}
| j|
  tj¡}‡ fdd„|D ƒ}t|ƒdkrš| 
ˆ ¡ qš|| _i | _d S )NrQ   r   c                    s   g | ]}|j jˆ kr|‘qS rD   )ÚtargetÚname)Ú.0Ústmt©ÚvarrD   rE   Ú
<listcomp>”  s    ÿz8Lower._find_singly_assigned_variable.<locals>.<listcomp>)r,   r*   ÚsetrT   Úis_generatorr   r   r   Údefmapr+   rd   ÚusemapÚlenÚ
find_instsr
   ÚAssignÚ_singly_assigned_varsÚ_blk_local_varmap)rC   r,   r*   ZsavZuse_defsZalloca_varsZvar_assign_mapÚblkÚvlZvar_use_mapZdefblkZassign_stmtsZassignsrD   rÊ   rE   rÂ   u  s0    
z$Lower._find_singly_assigned_variablec                    s  ddl m} tt| ƒ |¡ || _|| jkr¢| j| j }| j 	|¡ t
ƒ }| j ¡ D ],}| tj¡D ]}|j|krd| |j¡ qdqT|D ]}|  |¡}|  ||¡ q†|jdd�D ]f}t tj| j|j¡}	|	d k	r®t|	tjƒr®|	j|jkr®t|jtjƒr®| j|jj }
d|
i| j_  �qq®d S )Nr   )ÚehÚcall)ÚoprÆ   )!Únumba.core.unsaferØ   rÁ   rÀ   rj   Z_cur_ir_blockr8   r4   rK   r–   rÍ   r*   ÚvaluesrÒ   r
   ÚDelÚvaluerd   r¯   Ú_alloca_varÚ
find_exprsr   ÚguardÚget_definitionr,   rU   Ú
isinstanceÚGlobalZexception_checkÚ
terminatorÚBranchÚtruebrÚ_in_try_block)rC   ri   rØ   rŸ   Ú	all_namesÚxrÇ   ÚfetyperÙ   ÚdefnZ	targetblkrÃ   rD   rE   rj   œ  s4    


  ÿzLower.pre_blockc                 C   s$   z
| j `W n tk
r   Y nX d S rG   )rK   rè   ÚAttributeErrorrh   rD   rD   rE   rk   Â  s    
zLower.post_blockc              	   C   s€  | j  | j| jj¡ |  t|ƒ¡ t|tj	ƒr’|  
|jj¡}|  ||¡}d }t|jtjƒrz| j  | j| jj¡ |jjd }| j||jj|d� �nêt|tjƒ�r |  |jj¡}| j|j }| j|j }|  
|jj¡}| j | j||tj¡}	|	jtj d¡k�st d|	j ƒ‚| j !|	||¡ �n\t|tj"ƒ�rJ| j|j }
| j #|
¡ �n2t|tj$ƒ�rú| j%�rp| j& '| ¡ d S |  |jj¡}|  
|jj¡}| j(j)}t|tj*ƒ�rº| j+ ,| j|||¡ d S ||k�sÔt d -||¡ƒ‚| j .| j||¡}| j+ /| j|¡ �n‚t|tj0ƒ�r�npt|tj1ƒ�rÐ| j(j2| }|d k	�s4t ‚z| j 3d|¡}W n, t4k
�rr   |  5|j|j6|j|¡ Y S X |  |jj¡}
|  |jj¡}|  
|jj¡}| j | j|||j7d ¡}|| j|
|j|fƒS �n¬t|tj8ƒ�rì|  9|¡ �n�t|tj:ƒ�r*| j(j2| }|d k	�st ‚|  5|j|j|j|¡S t|tj;ƒ�rh| j(j2| }|d k	�sRt ‚|  5|j<|j=|j|¡S t|tj>ƒ�r<|  |jj¡}
|  |jj¡}|  
|jj¡}|  
|jj¡}| j(j2| }|d k	�sÈt ‚t?j@}| jjA B|¡}| C| jjA|j7i ¡}| j 3||¡}||j7d k�st ‚| j | j|||j7d ¡}|| j|
|fƒS t|tjDƒ�rZ|  E|j¡ �n"t|tjFƒ�r|  |jj¡}
|  |jj¡}| j(j2| }|  
|jj¡}|  
|jj¡}|d k	�sºt ‚|j7d |k�sÎt ‚| j G|jH|¡}| j | j|||j7d ¡}|| j|
|fƒS t|tjIƒ�r"|  J|¡ nZt|tjKƒ�r<|  L|¡ n@t|tjMƒ�rV|  N|¡ n&t|tjOƒ�rp|  P|¡ nt4t|ƒƒ‚d S )NrQ   )Úargidxzcond is not i1: %sz)type '{}' does not match return type '{}'Ústatic_setitemé   r   )Qr   Úmark_locationrK   r9   rS   r›   Ústrrã   r
   rÓ   r¯   rÆ   rÇ   Úlower_assignrÞ   ÚArgr?   r    Ústorevarræ   r³   Úcondr4   rç   Úfalsebrr:   Úcastr	   ÚbooleanÚtypeÚllvmliteÚIntTypeÚAssertionErrorÚcbranchÚJumpr—   ÚReturnr-   r   Zreturn_from_generatorr#   ÚrestypeÚOptionalrH   Zreturn_optional_valuerœ   Úget_return_valueÚreturn_valueÚPopBlockÚStaticSetItemÚ	calltypesr¶   ÚNotImplementedErrorÚlower_setitemÚ	index_varrb   ÚPrintÚlower_printÚSetItemÚStoreMapÚdctÚkeyÚDelItemÚoperatorÚdelitemÚtyping_contextÚresolve_value_typeÚget_call_typerÝ   ÚdelvarÚSetAttrZget_setattrÚattrÚDynamicRaiseÚlower_dynamic_raiseÚDynamicTryRaiseÚlower_try_dynamic_raiseÚStaticRaiseÚlower_static_raiseÚStaticTryRaiseÚlower_static_try_raise)rC   r¡   ÚtyÚvalrî   rö   ÚtrZflZcondtyÚpredrÆ   ÚotyÚretvalr´   r¹   rÞ   Úvaluetyr    ÚtargettyÚindextyrÚ   ÚfnopÚcallsigrD   rD   rE   r¤   É  sâ    ÿ
ÿ ÿ
ÿÿ  ÿÿÿzLower.lower_instc                 C   s  |   |j¡}|   |j¡}|   |j¡}|  |j¡}|  |j¡}	|  |j¡}
tj}| jj |¡}| | jj|j	i ¡}| j 
||¡}t|tjƒr¢| j | j|||j¡}n tj}||ƒ||j	d ƒksÂt‚| j | j||
|j	d ¡}| j | j||	|j	d ¡}|| j|||fƒS )Nr   rQ   rð   )r³   rÇ   r¯   r  Úsetitemr:   r  r  r  rb   r¶   rã   r	   r  rø   rK   rú   Ú	unliteralrý   )rC   Ú
target_varr
  Z	value_varr´   rÆ   rÞ   r    r)  r(  r*  rÚ   r+  r,  r¹   ÚulrD   rD   rE   r	  T  s6      ÿÿÿÿzLower.lower_setitemc                 C   s   |   |¡ d S rG   )r!  ©rC   r¡   rD   rD   rE   r  s  s    zLower.lower_try_dynamic_raisec                 C   sˆ   |j }g }g }|D ]R}t|tjƒrH|  |j¡}|  |j¡}|  ||¡ nd }|}| |¡ | |¡ q| j	|j
t|ƒt|ƒ| jd� d S ©Nr    )ro   rã   r
   ÚVarr¯   rÇ   r³   ÚincrefÚappendrq   rn   Útupler9   )rC   r¡   ro   rb   rp   Zexc_argÚtypr#  rD   rD   rE   r  x  s     
 ÿzLower.lower_dynamic_raisec                 C   s6   |j d kr| jd | jd� n| j|j |j| jd� d S r2  )rn   rt   r9   ro   r1  rD   rD   rE   r  ‹  s    
zLower.lower_static_raisec                 C   s6   |j d kr| jd | jd� n| j|j |j| jd� d S r2  )rn   ru   r9   ro   r1  rD   rD   rE   r!  ’  s    
zLower.lower_static_try_raisec              
   C   sš  |j }t|tjtjtjfƒr@| j | j||j ¡}|  	||¡ |S t|tj
ƒrX|  ||¡S t|tjƒr |  |j¡}|  |j¡}| j | j|||¡}|  	||¡ |S t|tjƒ�r^t | j¡�œ |  d|j ¡}t|tjƒ�r|j }| jj}	|	 |¡}
| j | j|
|¡}| j | j||
|¡}n | j|j }| j | j|||¡}|  	||¡ |W  5 Q R £ S Q R X n*t|tjƒ�rˆ|  ||¡}|  	||¡ |S tt|ƒ|ƒ‚d S )Nzarg.)rÞ   rã   r
   ÚConsträ   ÚFreeVarr:   Úget_constant_genericrK   r4  ÚExprÚ
lower_exprr3  r³   rÇ   r¯   rø   rô   r   r•   r	   ÚOmittedr  Ú!resolve_value_type_prefer_literalr‘   r    ÚYieldÚlower_yieldr  rú   )rC   r"  r¡   rÞ   Úresr#  r&  ZargtyÚpyvalÚtyctxÚvaltyÚconstrD   rD   rE   ró   ™  sJ    ÿ
  ÿzLower.lower_assignc           
      C   s¨   | j j|j }|j|kst‚t | ||j¡}| ¡  |  	|j
j¡}|  |j
j¡}| jj}| j | j|||¡}| j | j||¡}	| j | j|	¡ | ¡  | j | j|d ¡S rG   )r-   Úyield_pointsr    r¡   rý   r   Z
LowerYieldÚ	live_varsZlower_yield_suspendr³   rÞ   rÇ   r¯   r‚   Ú
yield_typer:   rø   rK   r  rH   r  Zlower_yield_resumer:  )
rC   Úrettyr¡   ÚypÚyr#  r7  Zactual_rettypZyretr'  rD   rD   rE   r@  Ë  s       ÿzLower.lower_yieldc                    sj  ˆj j ˆ ¡‰ |j}|j}|j}|j}ˆ |j¡}ˆ |j¡}	ˆ 	|j¡}ˆ 	|j¡}ˆj
j| ‰ˆj  ˆj||ˆjd ¡}ˆj  ˆj||	ˆjd ¡}‡‡‡fdd„}
‡ ‡‡fdd„}|t|ƒt|ƒf||fƒ}|d k	rà|
|ƒS |t|ƒ|	f||fƒ}|d k	�r|
|ƒS ||t|ƒf||fƒ}|d k	�r0|
|ƒS ˆ  ˆj jˆji ¡}ˆj  ˆ |¡}|ˆj||fƒ}|
|ƒS )Nr   rQ   c                    s   ˆj  ˆj| ˆjˆ ¡S rG   )r:   rø   rK   Úreturn_type)rA  )ÚrestyrC   r´   rD   rE   Úcast_resultù  s     ÿz&Lower.lower_binop.<locals>.cast_resultc                    sœ   t dd„ |D ƒƒrd S z6tˆ tjƒr8ˆ  ˆjj| i ¡}ntjˆj	f| žŽ }W n t
k
rb   Y d S X zˆj ˆ |¡}|ˆj|ƒW S  tk
r–   Y d S X d S )Nc                 s   s   | ]}|t jkV  qd S rG   )r
   Ú	UNDEFINED©rÈ   ÚarD   rD   rE   Ú	<genexpr>ÿ  s     z=Lower.lower_binop.<locals>.try_static_impl.<locals>.<genexpr>)Úanyrã   r	   ÚFunctionr  r:   r  r   r´   rL  r   r¶   rK   r  )Útysrb   Z
static_sigZstatic_impl)rÚ   rC   r´   rD   rE   Útry_static_implþ  s     
 ÿz*Lower.lower_binop.<locals>.try_static_impl)r:   r  r  ÚlhsÚrhsÚ
static_lhsÚ
static_rhsr¯   rÇ   r³   r#   r  rø   rK   rb   Ú_lit_or_omittedr  r¶   )rC   rM  ÚexprrÚ   rW  rX  rY  rZ  ÚltyZrtyrN  rV  rA  r¸   r¹   rD   )rÚ   rM  rC   r´   rE   Úlower_binopå  sH    þ
þ

þ
zLower.lower_binopc                    s¬   ˆ   |j¡}ˆ   |j¡}tj}ˆ jj |¡}	|	 ˆ jj|ji ¡}
ˆ j 	|	|
¡}||f}ˆ  
|j¡ˆ  
|j¡f}‡ fdd„t|||jƒD ƒ}|ˆ j|ƒ}ˆ j ˆ j||j|¡S )Nc                    s&   g | ]\}}}ˆ j  ˆ j|||¡‘qS rD   ©r:   rø   rK   )rÈ   ÚavÚatÚftrI   rD   rE   rÌ   9  s   ÿz'Lower.lower_getitem.<locals>.<listcomp>)r³   rÇ   r  Úgetitemr:   r  r  r  rb   r¶   r¯   ÚziprK   rø   rL  )rC   rM  r\  rÞ   r    r´   ZbasevalZindexvalrÚ   r+  r,  r¹   ÚargvalsÚargtypsÚcastvalsrA  rD   rI   rE   Úlower_getitem+  s0      ÿ

ÿ
ÿÿþzLower.lower_getitemc                 C   sf   t |tƒr:|  |jj¡|j }| j |  |jj¡|j¡}n|  |j¡}|  |j¡}| j	 
| j|||¡S )zh
        Cast a Numba IR variable to the given Numba type, returning a
        low-level value.
        )rã   r   r¯   r   rÇ   r    rK   Úextract_valuer³   r:   rø   )rC   rË   r"  Zvartyr#  rD   rD   rE   Ú	_cast_varA  s    
ÿzLower._cast_varc                    sÀ   ˆr>ˆ   ˆj¡}t|tjƒs t‚|‡fdd„tt|ƒƒD ƒ }ˆj}|d krz|r^t	d|f ƒ‚‡ fdd„t
|ˆjƒD ƒ}nB‡ ‡fdd„}	‡ ‡fdd„}
‡ ‡fd	d
„}t ||t|ƒ|	|
|¡}|S )Nc                    s   g | ]}t ˆ |ƒ‘qS rD   )r   ©rÈ   Úi)r   rD   rE   rÌ   U  s   ÿz(Lower.fold_call_args.<locals>.<listcomp>z-unsupported keyword arguments when calling %sc                    s   g | ]\}}ˆ   ||¡‘qS rD   ©rj  ©rÈ   rË   ZsigtyrI   rD   rE   rÌ   ^  s   ÿc                    s   ˆ   |ˆj|  ¡S rG   )rj  rb   )r    ÚparamrË   ©rC   r´   rD   rE   Únormal_handlera  s    z,Lower.fold_call_args.<locals>.normal_handlerc                    s   ˆ j  ˆ jˆj|  |¡S rG   )r:   r:  rK   rb   )r    ro  Údefaultrp  rD   rE   Údefault_handlerd  s
      ÿz-Lower.fold_call_args.<locals>.default_handlerc                    sD   ˆj |  }t|tjƒst|ƒ‚‡ fdd„t||ƒD ƒ}t ˆ j|¡S )Nc                    s   g | ]\}}ˆ   ||¡‘qS rD   rm  rn  rI   rD   rE   rÌ   k  s   ÿzALower.fold_call_args.<locals>.stararg_handler.<locals>.<listcomp>)	rb   rã   r	   Ú	BaseTuplerý   rd  r   Úmake_anonymous_structrK   )r    ro  ÚvarsZ
stararg_tyrÜ   rp  rD   rE   Ústararg_handlerh  s    

ÿz-Lower.fold_call_args.<locals>.stararg_handler)r¯   rÇ   rã   r	   rt  rý   ÚrangerÑ   Úpysigr  rd  rb   r   Úfold_argumentsÚdict)rC   Úfntyr´   Úpos_argsr   Úkw_argsZ	tp_varargry  re  rq  rs  rw  rD   )rC   r´   r   rE   Úfold_call_argsO  s4    
ÿÿ

ÿ üzLower.fold_call_argsc                 C   sÎ   | j j| }|jtjkst‚| jj t	¡}t
|jƒ}t
|jƒ}tt|ƒƒD ]0}||jkrJ|j| }t|tƒrJt |¡||< qJtj|jf|žŽ }|j|jd�}|  ||||ji ¡}	| j t	|¡}
|
| j|	ƒ dS )z$
        Lower a ir.Print()
        )ry  N)r#   r  rL  r	   rµ   rý   r:   r  r  r…   Úlistrb   rx  rÑ   Úconstsrã   rò   r±   r   r´   Úreplacery  r  r   r¶   rK   )rC   r¡   r¸   r|  Zpos_tysr}  rl  rB  Z	fixed_sigre  r¹   rD   rD   rE   r  v  s    




zLower.lower_printc                 C   s"  | j j| }|  d |¡¡ t|jtjƒr4| j 	¡ S |  
|jj¡}t|tjƒr^|  |||¡}n~t|tjƒrz|  |||¡}nbt|tjƒr–|  |||¡}nFt|tjƒr²|  |||¡}n*t|tjƒrÎ|  |||¡}n|  |||¡}|d k�r|jtjkrþ| j 	¡ }ntd| jd�‚| j | j||j|¡S )Nz# lower_call: expr = {0}z2non-void function returns None from implementation)rZ   r9   )r#   r  r›   rœ   rã   rL  r	   ÚPhantomr:   r²   r¯   rU   rÇ   ÚObjModeDispatcherÚ_lower_call_ObjModeDispatcherÚExternalFunctionÚ_lower_call_ExternalFunctionÚExternalFunctionPointerÚ#_lower_call_ExternalFunctionPointerÚRecursiveCallÚ_lower_call_RecursiveCallÚFunctionTypeÚ_lower_call_FunctionTypeÚ_lower_call_normalÚvoidr   r9   rø   rK   )rC   rM  r\  r´   r|  rA  rD   rD   rE   Ú
lower_call“  s<    
  ÿ
þÿzLower.lower_callc                    sÄ  ddl m} ˆ  ¡  ˆ j ¡ }dd„ |jD ƒ}‡ fdd„|D ƒ}‡ fdd„|D ƒ}t||ƒD ]\}	}
ˆ  |
|	¡ q\‡ fdd„t||ƒD ƒ}|ˆ jƒ ||¡}ˆ j 	||¡}t
 ˆ j|¡}ˆ j |¡�ö\}}|�6 |D ]}ˆ j |¡ qÔˆ j |¡ ˆ j ˆ j¡ W 5 Q R X |�¢ ˆ j |jj|¡}|j}ˆ j |¡ |D ]}ˆ j |¡ �q8t|jƒ�r`| ¡  ˆ j |¡ ˆ j |j¡� ˆ j ˆ j¡ W 5 Q R X |W  5 Q R £ W  5 Q R £ S Q R X W 5 Q R X d S )Nr   )ÚObjModeUtilsc                 S   s   g | ]
}|j ‘qS rD   ©rÇ   rP  rD   rD   rE   rÌ   Ä  s     z7Lower._lower_call_ObjModeDispatcher.<locals>.<listcomp>c                    s   g | ]}ˆ   |¡‘qS rD   )r¯   rP  rI   rD   rE   rÌ   Å  s     c                    s   g | ]}ˆ   |¡‘qS rD   )r³   rP  rI   rD   rE   rÌ   Æ  s     c                    s"   g | ]\}}ˆ j  ||ˆ j¡‘qS rD   )rJ   Úfrom_native_valuerM   )rÈ   ZatypÚavalrI   rD   rE   rÌ   Ë  s   þ
ÿ)Únumba.core.pythonapir‘  rP   rJ   Ú
gil_ensurerb   rd  r4  Úload_dispatcherÚcall_function_objargsr   Úis_nullrK   Úif_elseÚdecrefÚgil_releaserH   Z
return_excÚto_native_valueÚ
dispatcherÚoutput_typesrÞ   ÚcallableÚcleanupÚif_thenÚis_error)rC   r|  r\  r´   r‘  Ú	gil_stater]   r^   Z	argvaluesÚvr"  ZargobjsÚcalleeZret_objZhas_exceptionÚthenÚorelseÚobjÚnativeÚoutputrD   rI   rE   r…  ½  sF    

þþz#Lower._lower_call_ObjModeDispatcherc                 C   sb   |   d¡ |  |||j|j|j¡}t |j|jj	|jj¡}| j
 | jj|¡}| j
 | j||j|¡S )Nz# external function)r›   r  rb   r   Úkwsr   ZExternalFunctionDescriptorÚsymbolr¸   rL  r:   Zdeclare_external_functionrK   r$   Zcall_external_functionr^   )rC   r|  r\  r´   re  r#   rU   rD   rD   rE   r‡  ý  s.    
    ÿ  ÿ ÿ   ÿz"Lower._lower_call_ExternalFunctionc                 C   s
  |   d¡ |  |||j|j|j¡}|  |jj¡}|jrð|  	¡  | j
 ¡ }g }g }t|jj|j|ƒD ]R\}	}
}|	tjkrª|  |
|¡ | j
 |
|| j¡}| |¡ | |¡ qb| |¡ qb| j | j|||j¡}|D ]}| j
 |¡ qÐ| j
 |¡ n| j | j|||j¡}|S )Nz## calling external function pointer)r›   r  rb   r   r¬  r³   rU   rÇ   Úrequires_gilrP   rJ   r–  rd  r¸   r	   Úffi_forced_objectr4  r“  rM   r5  r:   Zcall_function_pointerrK   Úcconvr›  rœ  )rC   r|  r\  r´   re  Úpointerr¤  Z
newargvalsÚpyvalsZexptypZgottypr”  r©  rA  rD   rD   rE   r‰    sV    
    ÿ
ÿ
  ÿ
   ÿ   ÿz)Lower._lower_call_ExternalFunctionPointerc           
      C   sŽ   |   |||j|j|j¡}| |j¡}| jjp.t}| jj	}||j
|j||jd�}| jjj |¡rv| j | j| j||¡}	n| j | j|||¡}	|	S )N)Úabi_tagsÚuid)r  rb   r   r¬  Úget_overloadsr:   Úmanglerr   r#   r³  r\   r´  rK   r[   rÇ   Ú
startswithÚcall_internalZcall_unresolved)
rC   r|  r\  r´   re  Zrec_ovr¶  r³  Zmangled_namerA  rD   rD   rE   r‹  8  s8        ÿ
 ÿ   ÿ   ÿzLower._lower_call_RecursiveCallc           	      C   s‚   |   d¡ t |¡}| |¡s8td|› dt |¡› �ƒ‚|j}|  |||j|j	|j
¡}| j||jj|d�}| jj|||jd�}|S )Nz## calling first-class function typez%mismatch of function types: expected z	 but got )r¸   )r°  )r›   r	   r.  Úcheck_signaturer   rŒ  Úftyper  rb   r   r¬  Ú_Lower__get_function_pointerrU   rÇ   rK   rÙ   r°  )	rC   r|  r\  r´   r¸   rº  re  Úfunc_ptrrA  rD   rD   rE   r�  M  s"    


ÿ    ÿzLower._lower_call_FunctionTypeNc                 C   sv  ddl m} | j |¡}|  |¡}| jj|dd| d�}tj| j|d| d�}| jj	t 
| j|¡dd��ü\}	}
|	�À |  ¡  | j ¡ }| jj|dd	| d�}|| j| j||d
d�}| jjt 
| j|¡dd��  | jt|› d�f| jd� W 5 Q R X | j |¡}| j | j ||¡|¡ | j |¡ | j |¡ W 5 Q R X |
� | j | j ||¡|¡ W 5 Q R X W 5 Q R X | j |¡S )Nr   )Úlower_get_wrapper_addressz
addr_of_%sr’  z
fptr_of_%sF)ÚlikelyrQ   zpyaddr_of_%sÚignore)Zfailure_modez function address is null)ro   r9   )Z numba.experimental.function_typer½  r:   Úget_value_typer³   rK   ri  r   Úalloca_oncerš  r™  rP   rJ   r–  r¢  rt   ÚRuntimeErrorr9   Úlong_as_voidptrÚstoreÚbitcastr›  rœ  Úload)rC   rº  Úfnamer¸   r½  ÚlltyZfstructÚaddrZfptrr§  r¨  r¤  ZpyaddrZaddr1Zaddr2rD   rD   rE   Z__get_function_pointer]  sZ    

ÿ
ÿþ
 þ   þ ÿ
ý,zLower.__get_function_pointerc                 C   sÊ   |   d |¡¡ |   d |¡¡ t|tjƒr6|jj}n|  |||j|j|j	¡}|j
}|d k	r†ddlm} ||ƒ}|jj}| ||¡}	n| j ||¡}	|jr¶|  |jj¡}
|
gt|ƒ }|	| j|| jƒ}|S )Nz# calling normal function: {0}z# signature: {0}r   )Úresolve_dispatcher_from_str)r›   rœ   rã   r	   r„  rU   rb   r  r   r¬  rÆ   Únumba.core.target_extensionrÊ  ÚtargetdescrÚtarget_contextr¶   r:   Úrecvrr³   rÇ   r€  rK   r9   )rC   r|  r\  r´   re  ZtnamerÊ  ÚdispZhw_ctxr¹   Zthe_selfrA  rD   rD   rE   rŽ  …  s.    
    ÿzLower._lower_call_normalc           (   
      sî  |j dkrˆ ˆ ||j¡S |j dkr\ˆ |jj¡}|jrHˆ ˆ ||j¡S ˆ ˆ ||j¡S �n†|j dkrîˆ |j	j¡}ˆ |j	j¡}ˆj
j |j¡}ˆjj| }ˆj
 ||¡}ˆj
 ˆj|||jd ¡}|ˆj|gƒ}	ˆj
 ˆj|	|jˆ ¡}	|	S |j dk�r
ˆ ˆ |¡}	|	S |j dk�rTˆ |j	j¡}ˆ |j	j¡}
ˆj
 ˆj||
¡}	ˆ ˆ |	¡ |	S |j dk�ržˆ |j	j¡}ˆ |j	j¡}
ˆj
 ˆj||
¡}	ˆ ˆ |	¡ |	S |j dk�r&ˆ |j	j¡}ˆ |j	j¡}
ˆjj| }ˆj
 |j |¡}|j\}ˆj
 ˆj||
|¡}|ˆj|fƒ}	ˆj
 ˆj|	|jˆ ¡}	|	S |j d	k�rîˆ |j	j¡}ˆ |j	j¡}
t|
tjƒ�rxˆj
 ˆj||
|
j¡}|
j}
t|
tjƒ�r¤|
ˆ k�s”t‚ˆ |
|¡ |S |
jj}ˆj
  ˆ ¡}t !|tj"¡}t# $|
j|
¡}ˆj
 d
|¡}t# $||
j¡}ˆj
 d|¡}|ˆj|fƒ}t%|j&ƒD ]z}|ˆj|fƒ}ˆj
 ˆj||¡}t' (ˆjˆj )|¡¡� ˆj*t+ˆj,d� W 5 Q R X ˆj
 ˆj||¡}ˆj -|||¡}�q|ˆj|fƒ}ˆj
 ˆj||¡}t' (ˆj|¡� ˆj*t+ˆj,d� W 5 Q R X ˆ .|
j|¡ |S |j dk�rÆˆ |j	j¡}ˆ |j	j¡}
tˆ tj/ƒ�r^ˆj
 ˆj||
ˆ j0¡}ˆj
 1ˆj|ˆ j0¡}	ˆ ˆ |	¡ |	S ˆj
 2|
|j3¡}ˆj
j 4|
|j3¡}|d k�r”ˆj
 5¡ S |ˆj
ˆj|
||j3ƒ}	ˆj
 ˆj|	|ˆ ¡}	|	S �n|j dk�rht# $ˆ ˆ |j	j¡t6|j7ƒ¡}z,ˆj
 d|¡}|ˆjˆ |j	j¡|j7fƒW S  t8k
�rb   |j9d k�r<‚ ˆjj| }ˆ :ˆ ||j	|j9|¡ Y S X �nz|j dk�rÈt# $ˆ ˆ |j	j¡ˆ |j7j¡¡}ˆj
 d|¡}|ˆjˆ |j	j¡ˆ |j7j¡fƒS |j dk�röˆjj| }ˆ :ˆ ||j	|j7|¡S |j dk�rf‡fdd„|j;D ƒ}‡fdd„|j;D ƒ}‡fdd„t<|ˆ |ƒD ƒ}ˆj
 =ˆjˆ |¡}ˆ ˆ |¡ |S |j dk�r‡fdd„|j;D ƒ}‡fdd„|j;D ƒ}tˆ tj>ƒ�rî‡fdd„t<|ˆ j|ƒD ƒ}ˆj
 =ˆjt ?ˆ j¡|¡}ˆ ˆ |¡ |S ‡ ‡fdd„t<||ƒD ƒ}ˆj
 @ˆjˆ |¡S �nÄ|j dk�rŠ|j;d d d… }‡fdd„|D ƒ}‡fdd„|D ƒ}‡ ‡fdd„t<||ƒD ƒ}ˆj
 Aˆjˆ |¡S |j d k�r@|j;}g g  }} g g  }!}"|D ]b\}#}$ˆ |#j¡}%ˆ |#j¡}&ˆ |$j¡}ˆ |$j¡}'| B|%¡ |  B|¡ |! B|&¡ |" B|'¡ �q´ˆj
 Cˆjˆ tDt<|!|"ƒƒtDt<|| ƒƒ¡S |j d!k�rŒˆ |j	j¡}ˆ |j	j¡}
ˆj
 ˆj||
ˆ ¡}ˆ ˆ |¡ |S |j d"k�r¢tEd#ƒ‚n@|j d$k�rºˆj
 Fˆ ¡S |j ˆj
jGk�râˆj
jG|j  ˆ|ƒ}	|	S t8|ƒ‚d S )%NÚbinopÚinplace_binopÚunaryr   rÙ   Ú
pair_firstÚpair_second)ÚgetiterÚiternextÚexhaust_iterrÕ  rÖ  r    ÚgetattrÚstatic_getitemÚtyped_getitemrc  Úbuild_tuplec                    s   g | ]}ˆ   |j¡‘qS rD   ©r³   rÇ   rk  rI   rD   rE   rÌ   F  s     z$Lower.lower_expr.<locals>.<listcomp>c                    s   g | ]}ˆ   |j¡‘qS rD   ©r¯   rÇ   rk  rI   rD   rE   rÌ   G  s     c                    s&   g | ]\}}}ˆ j  ˆ j|||¡‘qS rD   r_  ©rÈ   r#  ÚtotyÚfromtyrI   rD   rE   rÌ   H  s   ÿÚ
build_listc                    s   g | ]}ˆ   |j¡‘qS rD   rÜ  rk  rI   rD   rE   rÌ   O  s     c                    s   g | ]}ˆ   |j¡‘qS rD   rÝ  rk  rI   rD   rE   rÌ   P  s     c                    s&   g | ]\}}}ˆ j  ˆ j|||¡‘qS rD   r_  rÞ  rI   rD   rE   rÌ   R  s   ÿc                    s&   g | ]\}}ˆj  ˆj||ˆ j¡‘qS rD   ©r:   rø   rK   Údtype©rÈ   r#  rà  ©rM  rC   rD   rE   rÌ   [  s   þÿÚ	build_setr"   c                    s   g | ]}ˆ   |j¡‘qS rD   rÜ  rk  rI   rD   rE   rÌ   c  s     c                    s   g | ]}ˆ   |j¡‘qS rD   rÝ  rk  rI   rD   rE   rÌ   d  s     c                    s&   g | ]\}}ˆj  ˆj||ˆ j¡‘qS rD   râ  rä  rå  rD   rE   rÌ   e  s   þÿÚ	build_maprø   ÚphizPHI not strippedÚnull)HrÚ   r^  rX   r¯   rW  rÇ   ÚmutableÚimmutable_fnr³   rÞ   r:   r  r  r#   r  r¶   rø   rK   rb   rL  r�  rÓ  r4  rÔ  rã   r	   r  rú   rt  rý   Úiterator_typerH  Zget_constant_undefÚPairrù   r   r´   rx  Úcountr   Úif_unlikelyÚnot_rt   r�   r9   Úinsert_valuer›  ÚBoundFunctionÚthisZget_bound_functionZget_getattrr  Úresolve_getattrr²   r[  r    r  r
  rh  r+   rd  Z
make_tupleÚLiteralListÚTuplerá  ræ  r5  rç  r€  r   Úget_constant_nullZspecial_ops)(rC   rM  r\  r]  r#  r7  Zfunc_tyr´   r¹   rA  r"  ZftyZcastvalÚitemtyÚtupZpairtyÚgetiter_sigÚgetiter_implÚiternext_sigÚiternext_implÚiterobjrl  ÚpairÚis_validÚitemZcastedÚattrtyZitemvalsZitemtysrg  r+   r7   rÜ   Z	key_typesZvalue_typesÚkr¥  r  ZkeytypeZvaltyperD   rå  rE   r<  ¡  sª   


 ÿÿÿÿ
 ÿ
ÿ
 ÿ
 ÿÿ
ÿ

ýÿ ÿýÿÿ

ÿ
ÿÿ

þþþ




þ
zLower.lower_exprc                 C   s8   || j krdS || jks| jr4|  ||¡}|| j |< dS )zT
        Ensure the given variable has an allocated stack slot (if needed).
        N)r5   rÔ   rÅ   Úalloca)rC   rÇ   rë   ÚptrrD   rD   rE   rß   Ž  s    

ÿzLower._alloca_varc                 C   s,   | j s"|| jkst‚|| jks"t‚| j| S )z=
        Get a pointer to the given variable's slot.
        )rÅ   rÕ   rý   rÔ   r5   )rC   rÇ   rD   rD   rE   Úgetvarž  s    zLower.getvarc              
   C   sn   || j kr| js| j | S |  |¡}|| jjkr^t | j¡� | j |¡W  5 Q R £ S Q R X n| j |¡S dS )z2
        Load the given variable's value.
        N)	rÕ   rÅ   r  r,   Ú	arg_namesr   r•   rK   rÆ  )rC   rÇ   r  rD   rD   rE   r³   §  s    

 zLower.loadvarc              
   C   s  |   |¡}|  ||¡ || jkr2| js2|| j|< nØ|dkrP|  |¡}|  ||¡ |  |¡}|j|jj	kr‚dj
||||d�}t|ƒ‚|dk	rüt | j¡� | j ||¡ W 5 Q R X | j}| j |¡}	| j |	¡}
| jj| }| jj| j|||	|
|j||d� n| j ||¡ dS )z:
        Store the value into the given variable.
        NzNStoring {value.type} to ptr of {ptr.type.pointee} ('{name}'). FE type {fetype})rÞ   r  rë   rÇ   )rÇ   ÚlltypeÚsizerS   Ú	datamodelrî   )r¯   rß   rÔ   rÅ   rÕ   r³   r›  r  rú   Úpointeerœ   rý   r   r•   rK   rÄ  r?   r:   rÀ  Úget_abi_sizeofÚdata_model_managerÚmark_variablerS   )rC   rÞ   rÇ   rî   rë   Úoldr  rZ   r9   r  Úsizeofr
  rD   rD   rE   rõ   ¹  sB    

ÿ

ü  ýzLower.storevarc                 C   sž   |   |¡}|| jkr0| js0|| jkr0| j |¡ |  ||¡ || jkrd| jsd| j| }|  ||¡ n6|  |¡}|  || j 	|¡¡ | j 
t|jjdƒ|¡ dS )z,
        Delete the given variable.
        N)r¯   rÕ   rÅ   rÔ   Údiscardrß   r›  r  rK   rÆ  rÄ  r   rú   r  )rC   rÇ   rë   Zllvalr  rD   rD   rE   r  ç  s    

ÿ


zLower.delvarc                 C   s(   | j  |¡}| j j| }| j|||d�S )N)r
  )r:   rÀ  r  Úalloca_lltype)rC   rÇ   rú   r  r
  rD   rD   rE   r     s    zLower.allocac              	   C   s`   |  d¡ }tj| j||dd�}|r\|| jjkr\| j |¡}| jj	| j||||| j
j|d� |S )Nú$F)rÇ   Úzfill)rÇ   r  r	  rS   r
  )r·  r   rÁ  rK   r,   r  r:   r  r   r  r9   rS   )rC   rÇ   r  r
  Z
is_uservarZaptrr  rD   rD   rE   r    s    
 ÿ ýzLower.alloca_lltypec                 C   s$   | j jsd S | j j | j||¡ d S rG   )r:   rŽ   Únrtr4  rK   ©rC   r7  r#  rD   rD   rE   r4    s    zLower.increfc              	   C   s<   | j jsd S t | j¡� | j j | j||¡ W 5 Q R X d S rG   )r:   rŽ   r   r•   rK   r  r›  r  rD   rD   rE   r›    s    zLower.decref)N)N)N)+r»   r¼   r½   r   r�   rB   r¿   rÅ   rÂ   rj   rk   r¤   r	  r  r  r  r!  ró   r@  r^  rh  rj  r  r  r�  r…  r‡  r‰  r‹  r�  r»  rŽ  r<  rß   r  r³   rõ   r  r  r  r4  r›  Ú__classcell__rD   rD   rÃ   rE   rÀ   b  sP   

'& 2F'*@-
( n	
.
rÀ   c                 C   s0   zt  | ¡W S  tk
r*   t  | ¡ Y S X dS )zjReturns a Literal instance if the type of value is supported;
    otherwise, return `Omitted(value)`.
    N)r	   r±   r   r=  )rÞ   rD   rD   rE   r[  *  s    r[  )-Úcollectionsr   r   r  rV   Ú	functoolsr   Úllvmlite.irrû   r   r   Ú
numba.corer   r   r	   r
   r   r   r   r   r   r   r   r   Únumba.core.errorsr   r   r   r   r   r   Znumba.core.funcdescr   Znumba.core.environmentr   Únumba.core.analysisr   r   Znumba.misc.firstlinefinderr   r   Úobjectr!   rÀ   r[  rD   rD   rD   rE   Ú<module>   s4   8 
  L         Q