U
    hâËdËû  ã                   @   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éÿÿÿÿ)ÚenvironmentÚfndesc)ÚmoduleÚfilepathZcgctxÚdirectives_only)%Úlibraryr$   r   Z	SortedMapÚblocksÚitemsÚfunc_irÚgenerator_infoÚmetadatar   ZConfigStackZ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_debuginfoZ	DIBuilderr   ZDummyDIBuilderÚ_compute_def_locationÚdefn_locÚdbg_directives_onlyÚfilenameÚinit)Úselfr7   r(   r$   r+   r-   Zdibuilderclsr'   © r?   úL/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/core/lowering.pyÚ__init__   s:    ÿÿ
þ
ýzBaseLower.__init__c                 C   s   | j jS ©N)r7   Ú	call_conv©r>   r?   r?   r@   rC   K   s    zBaseLower.call_convc                 C   s   d S rB   r?   rD   r?   r?   r@   r=   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)	Úpyapir7   Zget_python_apiÚbuilderZget_env_managerÚenv_managerZenv_bodyZenv_ptrZenvargrD   r?   r?   r@   Ú
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+   r6   Zwith_linenoÚliner7   r8   Úfunc_idÚfuncr   ÚwarningsÚwarnr   )r>   r:   ÚfnZoptional_lnoÚoffsetÚmsgr?   r?   r@   r9   `   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ÚargtypesrJ   ÚalwaysinlineÚnoinline)rE   r   Zmark_subprogramrF   rR   r$   rS   ÚargsrU   r:   rJ   Ú
attributesr.   r;   Úadd)r>   rY   Z
full_debugr?   r?   r@   Ú	pre_lowers   s    ü	
zBaseLower.pre_lowerc                 C   s   | j  ¡  dS )z5
        Called after all blocks are lowered
        N)r   ÚfinalizerD   r?   r?   r@   Ú
post_lower‰   s    zBaseLower.post_lowerc                 C   s   dS )z1
        Called before lowering a block.
        Nr?   ©r>   Úblockr?   r?   r@   Ú	pre_block�   s    zBaseLower.pre_blockc                 C   s   dS )z0
        Called after lowering a block.
        Nr?   r^   r?   r?   r@   Ú
post_block”   s    zBaseLower.post_blockc                 C   s$   | j j| j||||| jjjd� d S )N©r6   Ú	func_name)rC   Zreturn_dynamic_user_excrF   r+   rK   rc   )r>   Ú	exc_classÚexc_argsÚnb_typesr6   r?   r?   r@   Ú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.
        rb   N)rC   Zreturn_user_excrF   r+   rK   rc   ©r>   rd   re   r6   r?   r?   r@   Ú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.
        rb   N)rC   Zset_static_user_excrF   r+   rK   rc   rh   r?   r?   r@   Úset_exception§   s       þzBaseLower.set_exceptionc                 C   s"   | j  | j¡}| j  | j|¡ dS )z7Emit a pointer to hold the Environment object.
        N)r7   Zget_env_namer$   Zdeclare_env_globalr%   )r>   Úenvnamer?   r?   r@   Ú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================================================================================)r7   r$   )$rl   r,   ÚgenlowerÚlower_normal_functionr$   ÚGeneratorLowerÚgentypeZlower_init_funcZlower_next_funcZhas_finalizerZlower_finalize_funcr   Z	DUMP_LLVMÚprintÚcenterZHIGHLIGHT_DUMPSÚpygmentsro   Zpygments.lexersrp   Zpygments.formattersrq   Znumba.misc.dump_stylerr   r%   Ú__repr__ÚImportErrorÚ
ValueErrorr7   Ú
enable_nrtr   Zremove_unnecessary_nrt_usagerR   Zpost_loweringr(   Zadd_ir_module)r>   ro   Úlexerrq   rr   rQ   r?   r?   r@   Úlower¶   sF    

ÿÿ

þzBaseLower.lowerc                 C   s    | j  | j| jj| j¡| _| jS rB   )rC   Zdecode_argumentsrF   r$   rU   rR   ÚfnargsrD   r?   r?   r@   Ú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_emissionrF   Úposition_at_endÚbranchr1   r5   )r>   r$   Úentry_block_tailr?   r?   r@   ru   é   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)   rR   Úappend_basic_blockr1   r[   rF   Zbasic_blockÚdebug_printÚformatr$   r/   Úsortedr*   r†   Úlower_blockr]   )r>   rP   Zbnamerˆ   r_   Úbbr?   r?   r@   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.
        ©r6   zlowering "{inst}" at {loc})Úinstr6   Zerrcls_N)r`   Úbodyr6   r   r   r   Ú
lower_instra   )r>   r_   r�   Zdefaulterrclsr?   r?   r@   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)rt   r7   Úcreate_cpython_wrapperr(   Zgendescr0   Úcall_helperr$   )r>   r“   r?   r?   r@   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)rt   r   r7   Úcreate_cfunc_wrapperr(   r$   r0   r•   rD   r?   r?   r@   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 )NrV   ZoptnonerW   Úentry)r7   Zdeclare_functionr%   rR   r.   Zdbg_optnonerY   rZ   r‰   Zentry_blockr   rF   rC   Zinit_call_helperr•   )r>   r$   Zattrsetr?   r?   r@   rƒ   6  s    

zBaseLower.setup_functionc                 C   s   | j j| S rB   )r$   Útypemap)r>   Úvarnamer?   r?   r@   ÚtypeofB  s    zBaseLower.typeofc                 C   s*   t jr&| j | jd| jj› d|› �¡ d S )Nz
DEBUGJIT [z]: )r   Z	DEBUG_JITr7   rŠ   rF   r$   rS   )r>   rQ   r?   r?   r@   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˜   r7   Úget_dummy_valueÚloadvarr   Ú	signatureÚnoneÚget_functionrx   rF   )r>   rQ   r™   ZargtysrX   ÚsigÚimplr?   r?   r@   Úprint_variableJ  s    
þþzBaseLower.print_variable)N)N)NN)NN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rA   ÚpropertyrC   r=   rH   r9   r[   r]   r`   ra   rg   ri   rj   rl   r€   r‚   ru   r„   r�   r”   r–   rƒ   rš   rŠ   r£   r?   r?   r?   r@   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 rB   )Úsuperr=   Ú_find_singly_assigned_variablerD   ©Ú	__class__r?   r@   r=   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)r.   r   r;   rD   r?   r?   r@   Ú_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 )NrI   r   c                    s   g | ]}|j jˆ kr|‘qS r?   )ÚtargetÚname)Ú.0Ústmt©Úvarr?   r@   Ú
<listcomp>”  s    ÿz8Lower._find_singly_assigned_variable.<locals>.<listcomp>)r+   r)   ÚsetrK   Zis_generatorr   r   r   Zdefmapr*   rZ   ZusemapÚlenÚ
find_instsr
   ÚAssignÚ_singly_assigned_varsÚ_blk_local_varmap)r>   r+   r)   ZsavZuse_defsZalloca_varsZvar_assign_mapZblkZvlZvar_use_mapZdefblkZassign_stmtsZassignsr?   r³   r@   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¯   )!Znumba.core.unsafer¼   rª   r©   r`   Z_cur_ir_blockr5   r1   rF   r†   r¶   r)   Úvaluesr¸   r
   ÚDelÚvaluerZ   rš   Ú_alloca_varZ
find_exprsr   ÚguardZget_definitionr+   rL   Ú
isinstanceÚGlobalZexception_checkÚ
terminatorÚBranchÚtruebrÚ_in_try_block)r>   r_   r¼   rŽ   Z	all_namesÚxr°   Úfetyper½   ZdefnZ	targetblkr¬   r?   r@   r`   œ  s4    


  ÿzLower.pre_blockc                 C   s$   z
| j `W n tk
r   Y nX d S rB   )rF   rÉ   ÚAttributeErrorr^   r?   r?   r@   ra   Â  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 )NrI   )Úargidxzcond is not i1: %sz)type '{}' does not match return type '{}'Zstatic_setitemé   r   )Qr   Zmark_locationrF   r6   rJ   rŠ   ÚstrrÄ   r
   r¹   rš   r¯   r°   Úlower_assignrÁ   ÚArgr:   r    ÚstorevarrÇ   r�   Úcondr1   rÈ   Zfalsebrr7   Úcastr	   ÚbooleanÚtypeÚllvmliteZIntTypeÚAssertionErrorZcbranchZJumpr‡   ÚReturnr,   rt   Zreturn_from_generatorr$   ÚrestypeÚOptionalrC   Zreturn_optional_valuer‹   Úget_return_valueÚreturn_valueZPopBlockZStaticSetItemÚ	calltypesr    ÚNotImplementedErrorÚlower_setitemÚ	index_varrX   ZPrintÚlower_printZSetItemZStoreMapÚdctÚkeyZDelItemÚoperatorÚdelitemÚtyping_contextÚresolve_value_typeÚget_call_typerÀ   ÚdelvarZSetAttrZget_setattrÚattrZDynamicRaiseÚlower_dynamic_raiseZDynamicTryRaiseÚlower_try_dynamic_raiseZStaticRaiseÚlower_static_raiseZStaticTryRaiseÚlower_static_try_raise)r>   r�   ÚtyÚvalrÍ   rÓ   ÚtrÚflZcondtyÚpredr¯   ÚotyÚretvalrž   r¢   rÁ   Úvaluetyr    ÚtargettyÚindextyr¾   ÚfnopÚcallsigr?   r?   r@   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   rI   rÎ   )r�   r°   rš   rå   Úsetitemr7   rç   rè   ré   rX   r    rÄ   r	   rÛ   rÔ   rF   rÖ   Ú	unliteralrØ   )r>   Z
target_varrá   Z	value_varrž   r¯   rÁ   r    rø   r÷   rù   r¾   rú   rû   r¢   Zulr?   r?   r@   rà   T  s6      ÿÿÿÿzLower.lower_setitemc                 C   s   |   |¡ d S rB   )rï   ©r>   r�   r?   r?   r@   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�   )re   rÄ   r
   ÚVarrš   r°   r�   ÚincrefÚappendrg   rd   Útupler6   )r>   r�   re   rX   rf   Zexc_argÚtyprñ   r?   r?   r@   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 rÿ   )rd   ri   r6   re   rþ   r?   r?   r@   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 rÿ   )rd   rj   r6   re   rþ   r?   r?   r@   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
   ZConstrÅ   ZFreeVarr7   Úget_constant_genericrF   r  ÚExprÚ
lower_exprr   r�   r°   rš   rÔ   rÑ   r   r…   r	   ÚOmittedrç   Z!resolve_value_type_prefer_literalr�   r    ÚYieldÚlower_yieldrß   rÖ   )r>   rð   r�   rÁ   Úresrñ   rõ   ZargtyÚpyvalZtyctxZvaltyÚconstr?   r?   r@   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 rB   )r,   Zyield_pointsr    r�   rØ   r   Z
LowerYieldZ	live_varsZlower_yield_suspendr�   rÁ   r°   rš   rw   Ú
yield_typer7   rÔ   rF   rÜ   rC   rÝ   Zlower_yield_resumer  )
r>   Zrettyr�   ZypÚyrñ   r  Zactual_rettypZyretrö   r?   r?   r@   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   rI   c                    s   ˆj  ˆj| ˆjˆ ¡S rB   )r7   rÔ   rF   Úreturn_type)r  )Úrestyr>   rž   r?   r@   Ú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 rB   )r
   Ú	UNDEFINED©r±   Úar?   r?   r@   Ú	<genexpr>ÿ  s     z=Lower.lower_binop.<locals>.try_static_impl.<locals>.<genexpr>)ÚanyrÄ   r	   ÚFunctionré   r7   rç   r   rž   r  r   r    rF   rß   )ZtysrX   Z
static_sigZstatic_impl)r¾   r>   rž   r?   r@   Útry_static_implþ  s     
 ÿz*Lower.lower_binop.<locals>.try_static_impl)r7   rç   rè   ÚlhsÚrhsÚ
static_lhsÚ
static_rhsrš   r°   r�   r$   rÞ   rÔ   rF   rX   Ú_lit_or_omittedré   r    )r>   r  Úexprr¾   r  r  r  r  ÚltyZrtyr  r  r  r¡   r¢   r?   )r¾   r  r>   rž   r@   Ú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 r?   ©r7   rÔ   rF   )r±   ÚavÚatÚftrD   r?   r@   rµ   9  s   ÿz'Lower.lower_getitem.<locals>.<listcomp>)r�   r°   rå   Úgetitemr7   rç   rè   ré   rX   r    rš   ÚziprF   rÔ   r  )r>   r  r  rÁ   r    rž   ZbasevalZindexvalr¾   rú   rû   r¢   ÚargvalsZargtypsÚcastvalsr  r?   rD   r@   Ú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    rF   Úextract_valuer�   r7   rÔ   )r>   r´   rð   Zvartyrñ   r?   r?   r@   Ú	_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 r?   )r   ©r±   Úi)r   r?   r@   rµ   U  s   ÿz(Lower.fold_call_args.<locals>.<listcomp>z-unsupported keyword arguments when calling %sc                    s   g | ]\}}ˆ   ||¡‘qS r?   ©r,  ©r±   r´   ZsigtyrD   r?   r@   rµ   ^  s   ÿc                    s   ˆ   |ˆj|  ¡S rB   )r,  rX   )r    Úparamr´   ©r>   rž   r?   r@   Únormal_handlera  s    z,Lower.fold_call_args.<locals>.normal_handlerc                    s   ˆ j  ˆ jˆj|  |¡S rB   )r7   r  rF   rX   )r    r1  Údefaultr2  r?   r@   Ú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 r?   r/  r0  rD   r?   r@   rµ   k  s   ÿzALower.fold_call_args.<locals>.stararg_handler.<locals>.<listcomp>)	rX   rÄ   r	   Ú	BaseTuplerØ   r'  r   Zmake_anonymous_structrF   )r    r1  ÚvarsZ
stararg_tyr¿   r2  r?   r@   Ústararg_handlerh  s    

ÿz-Lower.fold_call_args.<locals>.stararg_handler)rš   r°   rÄ   r	   r6  rØ   Úranger·   Úpysigrß   r'  rX   r   Zfold_argumentsÚdict)r>   Úfntyrž   Úpos_argsr   Zkw_argsZ	tp_varargr:  r(  r3  r5  r8  r?   )r>   rž   r   r@   Ú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()
        )r:  N)r$   rÞ   r  r	   rŸ   rØ   r7   rç   rè   rx   ÚlistrX   r9  r·   ZconstsrÄ   rÏ   r›   r   rž   Úreplacer:  r>  r   r    rF   )r>   r�   r¡   r<  Zpos_tysr=  r.  r  Z	fixed_sigr(  r¢   r?   r?   r@   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)rQ   r6   )r$   rÞ   rŠ   r‹   rÄ   r  r	   ZPhantomr7   rœ   rš   rL   r°   ÚObjModeDispatcherÚ_lower_call_ObjModeDispatcherZExternalFunctionÚ_lower_call_ExternalFunctionZExternalFunctionPointerÚ#_lower_call_ExternalFunctionPointerZRecursiveCallÚ_lower_call_RecursiveCallÚFunctionTypeÚ_lower_call_FunctionTypeÚ_lower_call_normalÚvoidr   r6   rÔ   rF   )r>   r  r  rž   r<  r  r?   r?   r@   Ú
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 r?   ©r°   r  r?   r?   r@   rµ   Ä  s     z7Lower._lower_call_ObjModeDispatcher.<locals>.<listcomp>c                    s   g | ]}ˆ   |¡‘qS r?   )rš   r  rD   r?   r@   rµ   Å  s     c                    s   g | ]}ˆ   |¡‘qS r?   )r�   r  rD   r?   r@   rµ   Æ  s     c                    s"   g | ]\}}ˆ j  ||ˆ j¡‘qS r?   )rE   Úfrom_native_valuerG   )r±   ZatypÚavalrD   r?   r@   rµ   Ë  s   þ
ÿ)Znumba.core.pythonapirK  rH   rE   Ú
gil_ensurerX   r'  r  Zload_dispatcherZcall_function_objargsr   Úis_nullrF   Úif_elseÚdecrefÚgil_releaserC   Z
return_excZto_native_valueÚ
dispatcherZoutput_typesrÁ   ÚcallableÚcleanupÚif_thenZis_error)r>   r<  r  rž   rK  Ú	gil_staterT   rU   Z	argvaluesÚvrð   ZargobjsZcalleeZret_objÚhas_exceptionÚthenÚorelseÚobjÚnativeÚoutputr?   rD   r@   rB  ½  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>  rX   r   Úkwsr   ZExternalFunctionDescriptorÚsymbolr¡   r  r7   Zdeclare_external_functionrF   r%   Zcall_external_functionrU   )r>   r<  r  rž   r(  r$   rL   r?   r?   r@   rC  ý  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>  rX   r   r`  r�   rL   r°   Zrequires_gilrH   rE   rO  r'  r¡   r	   Zffi_forced_objectr  rM  rG   r  r7   Zcall_function_pointerrF   ÚcconvrR  rS  )r>   r<  r  rž   r(  ZpointerrX  Z
newargvalsZpyvalsZexptypZgottyprN  r]  r  r?   r?   r@   rD    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>  rX   r   r`  Zget_overloadsr7   Úmanglerr   r$   rc  rS   rd  rF   rR   r°   Ú
startswithZcall_internalZcall_unresolved)
r>   r<  r  rž   r(  Zrec_ovre  rc  Zmangled_namer  r?   r?   r@   rE  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¡   )rb  )rŠ   r	   rý   Zcheck_signaturer   rF  Úftyper>  rX   r   r`  Ú_Lower__get_function_pointerrL   r°   rF   r½   rb  )	r>   r<  r  rž   r¡   rg  r(  Zfunc_ptrr  r?   r?   r@   rG  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_%srL  z
fptr_of_%sF)ZlikelyrI   zpyaddr_of_%sÚignore)Zfailure_modez function address is null)re   r6   )Z numba.experimental.function_typeri  r7   Úget_value_typer�   rF   r+  r   Úalloca_oncerQ  rP  rH   rE   rO  rW  ri   ÚRuntimeErrorr6   Zlong_as_voidptrÚstoreZbitcastrR  rS  Úload)r>   rg  Úfnamer¡   ri  ZlltyZfstructÚaddrZfptrr[  r\  rX  ZpyaddrZaddr1Zaddr2r?   r?   r@   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	   rA  rL   rX   r>  r   r`  r¯   Znumba.core.target_extensionrr  ZtargetdescrZtarget_contextr    r7   Zrecvrr�   r°   r?  rF   r6   )r>   r<  r  rž   r(  Ztnamerr  ZdispZhw_ctxr¢   Zthe_selfr  r?   r?   r@   rH  …  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 )%NZbinopZinplace_binopZunaryr   r½   Ú
pair_firstÚpair_second)ÚgetiterÚiternextZexhaust_iterru  rv  r�   ÚgetattrZstatic_getitemZtyped_getitemr&  Zbuild_tuplec                    s   g | ]}ˆ   |j¡‘qS r?   ©r�   r°   r-  rD   r?   r@   rµ   F  s     z$Lower.lower_expr.<locals>.<listcomp>c                    s   g | ]}ˆ   |j¡‘qS r?   ©rš   r°   r-  rD   r?   r@   rµ   G  s     c                    s&   g | ]\}}}ˆ j  ˆ j|||¡‘qS r?   r"  ©r±   rñ   ZtotyÚfromtyrD   r?   r@   rµ   H  s   ÿÚ
build_listc                    s   g | ]}ˆ   |j¡‘qS r?   rx  r-  rD   r?   r@   rµ   O  s     c                    s   g | ]}ˆ   |j¡‘qS r?   ry  r-  rD   r?   r@   rµ   P  s     c                    s&   g | ]\}}}ˆ j  ˆ j|||¡‘qS r?   r"  rz  rD   r?   r@   rµ   R  s   ÿc                    s&   g | ]\}}ˆj  ˆj||ˆ j¡‘qS r?   ©r7   rÔ   rF   Zdtype©r±   rñ   r{  ©r  r>   r?   r@   rµ   [  s   þÿÚ	build_setr"   c                    s   g | ]}ˆ   |j¡‘qS r?   rx  r-  rD   r?   r@   rµ   c  s     c                    s   g | ]}ˆ   |j¡‘qS r?   ry  r-  rD   r?   r@   rµ   d  s     c                    s&   g | ]\}}ˆj  ˆj||ˆ j¡‘qS r?   r}  r~  r  r?   r@   rµ   e  s   þÿÚ	build_maprÔ   ÚphizPHI not strippedÚnull)Hr¾   r!  rO   rš   r  r°   ZmutableZimmutable_fnr�   rÁ   r7   rç   rè   r$   rÞ   r    rÔ   rF   rX   r  rJ  rs  r  rt  rÄ   r	   rÛ   rÖ   r6  rØ   Ziterator_typer  Zget_constant_undefZPairrÕ   r   rž   r9  Úcountr   Zif_unlikelyÚnot_ri   r}   r6   Zinsert_valuerR  ZBoundFunctionÚthisZget_bound_functionZget_getattrrë   Zresolve_getattrrœ   r  r    rß   rá   r*  r*   r'  Z
make_tupleZLiteralListÚTupler|  r€  r  r�  r?  r   Zget_constant_nullZspecial_ops)(r>   r  r  r   rñ   r  Zfunc_tyrž   r¢   r  rð   ZftyZcastvalZitemtyÚtupZpairtyZgetiter_sigZgetiter_implZiternext_sigZiternext_implZiterobjr.  ÚpairZis_validÚitemZcastedZattrtyZitemvalsZitemtysr)  r*   r4   r¿   Z	key_typesZvalue_typesÚkrY  rä   ZkeytypeZvaltyper?   r  r@   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)r2   rº   r®   Úalloca)r>   r°   rË   Úptrr?   r?   r@   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º   r2   )r>   r°   r?   r?   r@   Ú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…   rF   ro  )r>   r°   r�  r?   r?   r@   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ÚsizerJ   Ú	datamodelrÍ   )rš   rÂ   rº   r®   r»   r�   rR  rŽ  rÖ   Úpointeer‹   rØ   r   r…   rF   rn  r:   r7   rk  Úget_abi_sizeofÚdata_model_managerÚmark_variablerJ   )r>   rÁ   r°   rÍ   rË   Úoldr�  rQ   r6   r�  Úsizeofr’  r?   r?   r@   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Â   rR  rŽ  rF   ro  rn  r   rÖ   r“  )r>   r°   rË   Zllvalr�  r?   r?   r@   rê   ç  s    

ÿ


zLower.delvarc                 C   s(   | j  |¡}| j j| }| j|||d�S )N)r’  )r7   rk  r•  Úalloca_lltype)r>   r°   rÖ   r�  r’  r?   r?   r@   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‘  rJ   r’  )rf  r   rl  rF   r+   r�  r7   r”  r   r–  r6   rJ   )r>   r°   r�  r’  Z
is_uservarZaptrr˜  r?   r?   r@   rš    s    
 ÿ ýzLower.alloca_lltypec                 C   s$   | j jsd S | j j | j||¡ d S rB   )r7   r~   Únrtr  rF   ©r>   r  rñ   r?   r?   r@   r    s    zLower.increfc              	   C   s<   | j jsd S t | j¡� | j j | j||¡ W 5 Q R X d S rB   )r7   r~   r   r…   rF   r�  rR  rž  r?   r?   r@   rR    s    zLower.decref)N)N)N)+r¤   r¥   r¦   r   rv   r=   r¨   r®   r«   r`   ra   r’   rà   rí   rì   rî   rï   rÐ   r
  r!  r*  r,  r>  râ   rJ  rB  rC  rD  rE  rG  rh  rH  r  rÂ   rŽ  r�   rÒ   rê   rŒ  rš  r  rR  Ú__classcell__r?   r?   r¬   r@   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Á   r?   r?   r@   r  *  s    r  )-Úcollectionsr   r   rå   rM   Ú	functoolsr   Zllvmlite.irr×   r   r   Z
numba.corer   r   r	   r
   r   r   r   r   r   r   r   r   Znumba.core.errorsr   r   r   r   r   r   Znumba.core.funcdescr   Znumba.core.environmentr   Znumba.core.analysisr   r   Znumba.misc.firstlinefinderr   r   Úobjectr!   r©   r  r?   r?   r?   r@   Ú<module>   s4   8 
  L         Q