U
    ,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d0ddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zd1ddZd2ddZdd Zdd Zdd Zdd Zdd  Zd!d" Zd3d$d%Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ ZdS )4	BaseLowerz
    Lower IR to LLVM
    Nc                 C   s   || _ || _t|j | _|| _|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#|d| _| $  d S )N)environmentfndesc)modulefilepathZcgctx)%libraryr$   r   Z	SortedMapblocksitemsfunc_ir	call_conv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filenameinit)selfr7   r'   r$   r*   r-   Zdibuildercls r>   7/tmp/pip-unpacked-wheel-eu7e0c37/numba/core/lowering.py__init__   s8    

zBaseLower.__init__c                 C   s   d S Nr>   r=   r>   r>   r?   r<   J   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envargrB   r>   r>   r?   
init_pyapiM   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   s4   d| _ | jj| jj| jj| jj| jj| j	j
d dS )z4
        Called before lowering all blocks.
        N)functionqualnameargnamesargtypesrH   )rC   r   Zmark_subprogramrD   rP   r$   rQ   argsrS   r:   rH   rB   r>   r>   r?   	pre_lowern   s    zBaseLower.pre_lowerc                 C   s   | j   dS )z5
        Called after all blocks are lowered
        N)r   finalizerB   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>   rX   r>   r>   r?   
post_block   s    zBaseLower.post_blockc                 C   s"   | j j| j|||| jjjd dS )z+Propagate exception to the caller.
        r6   	func_nameN)r+   Zreturn_user_excrD   r*   rI   r]   r=   	exc_classexc_argsr6   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.
        r\   N)r+   Zset_static_user_excrD   r*   rI   r]   r^   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 %sP   -r   )	highlight)	LlvmLexer)Terminal256Formatter)by_colorscheme)stylez0Please install pygments to see highlighted dumpszP================================================================================)r7   r$   )$rd   r,   genlowerlower_normal_functionr$   GeneratorLowergentypeZlower_init_funcZlower_next_funcZhas_finalizerZlower_finalize_funcr   Z	DUMP_LLVMprintcenterZHIGHLIGHT_DUMPSZpygmentsrg   Zpygments.lexersrh   Zpygments.formattersri   Znumba.misc.dump_stylerj   r%   __repr__ImportError
ValueErrorr7   
enable_nrtr   Zremove_unnecessary_nrt_usagerP   Zpost_loweringr'   Zadd_ir_module)r=   rg   lexerri   rj   rO   r>   r>   r?   lower   sF    



zBaseLower.lowerc                 C   s    | j | j| jj| j| _| jS rA   )r+   Zdecode_argumentsrD   r$   rS   rP   fnargsrB   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_functionry   lower_function_bodyr   suspend_emissionrD   position_at_endbranchr1   r5   )r=   r$   entry_block_tailr>   r>   r?   rm      s    
zBaseLower.lower_normal_functionc                 C   s   | j D ]}d| }| j|| j|< q|   | jj}| d| j	j
 t| j  D ](\}}| j| }| j| | | qX|   |S )zP
        Lower the current function's body, and return the entry block.
        zB%sz# function begin: {0})r(   rP   append_basic_blockr1   rU   rD   Zbasic_blockdebug_printformatr$   r/   sortedr)   r}   lower_blockrW   )r=   rN   Zbnamer   rY   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)rZ   bodyr6   r   r   r   
lower_instr[   )r=   rY   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)rl   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)rl   r   r7   create_cfunc_wrapperr'   r$   r0   r   rB   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 )NZalwaysinlineZoptnoneZnoinlineentry)r7   Zdeclare_functionr%   rP   r.   Zdbg_optnone
attributesaddr   Zentry_blockr   rD   r+   Zinit_call_helperr   )r=   r$   Zattrsetr>   r>   r?   rz   "  s    

zBaseLower.setup_functionc                 C   s   | j j| S rA   )r$   typemap)r=   varnamer>   r>   r?   typeof.  s    zBaseLower.typeofc                 C   s    t jr| j| jd| d S )NzDEBUGJIT: {0})r   Z	DEBUG_JITr7   r   rD   r   )r=   rO   r>   r>   r?   r   1  s    zBaseLower.debug_printc                 C   sZ   t || jj| f}| j | |f}tjt j	f| }| j
t|}|| j| dS )zHelper 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_functionrp   rD   )r=   rO   r   ZargtysrT   sigimplr>   r>   r?   print_variable5  s    
zBaseLower.print_variable)N)NN)NN)F)__name__
__module____qualname____doc__r@   r<   rF   r9   rU   rW   rZ   r[   ra   rb   rd   rw   ry   rm   r{   r   r   r   rz   r   r   r   r>   r>   r>   r?   r!      s.   
-

-
	r!   c                       s8  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dFd.d/Zd0d1 Zd2d3 Zd4d5 Zd6d7 Z d8d9 Z!dGd:d;Z"d<d= Z#d>d? Z$dHd@dAZ%dBdC Z&dDdE Z'  Z(S )ILowerc                    s   t    |   d S rA   )superr<   _find_singly_assigned_variablerB   	__class__r>   r?   r<   P  s    
z
Lower.initc                 C   s   | j dkrdS | 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   rB   r>   r>   r?   _disable_sroa_like_optU  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 ] |	  
| qqt|D ]p  |krt|  dkrt|	  dkr|  \}
| j|
 tj} fdd|D }t|dkr|
  q|| _i | _d S )NrG   r   c                    s   g | ]}|j j kr|qS r>   )targetname).0Zstmtvarr>   r?   
<listcomp>|  s    z8Lower._find_singly_assigned_variable.<locals>.<listcomp>)r*   r(   setrI   Zis_generatorr   r   r   Zdefmapr)   r   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   ]  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	rt|	tjr|	j|jkrt|jtjr| j|jj }
d|
i| j_  qqd S )Nr   )ehcall)opr   )!Znumba.core.unsafer   r   r   rZ   Z_cur_ir_blockr5   r1   rD   r}   r   r(   valuesr   r
   Delvaluer   r   _alloca_varZ
find_exprsr   ZguardZget_definitionr*   rJ   
isinstanceGlobalZexception_check
terminatorBranchtruebr_in_try_block)r=   rY   r   r   Z	all_namesxr   fetyper   ZdefnZ	targetblkr   r>   r?   rZ     s4    


  zLower.pre_blockc                 C   s$   z
| j `W n tk
r   Y nX d S rA   )rD   r   AttributeErrorrX   r>   r>   r?   r[     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 nt|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!|	|| njt|tj"rJ| j|j }
| j#|
 n@t|tj$r| j%rp| j&'|  d S | |jj}| 
|jj}| j(j)}t|tj*r| j+,| j||| d S ||kst d-||| j.| j||}| j+/| j| nt|tj0rn~t|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 nt|tj8r| 9| nt|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	st t?j@}| jjAB|}|C| jjA|j7i }| j3||}||j7d kst | j| j|||j7d }|| j|
|fS t|tjDrZ| E|j n0t|tjFr| |jj}
| |jj}| j(j2| }| 
|jj}| 
|jj}|d k	st |j7d |kst | jG|jH|}| j| j|||j7d }|| j|
|fS t|tjIr"| J| nht|tjKr<| L| nNtM| jdr~| jjNO D ]&\}}t||rV|| |  d S qVt4t|d S )	NrG   )argidxzcond is not i1: %sz)type '{}' does not match return type '{}'Zstatic_setitem   r   lower_extensions)Pr   Zmark_locationrD   r6   rH   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~   ZReturnr,   rl   Zreturn_from_generatorr$   restypeOptionalr+   Zreturn_optional_valuer   get_return_valuereturn_valueZPopBlockZStaticSetItem	calltypesr   NotImplementedErrorlower_setitem	index_varrT   ZPrintlower_printZSetItemZStoreMapdctkeyZDelItemoperatordelitemtyping_contextresolve_value_typeget_call_typer   delvarZSetAttrZget_setattrattrZStaticRaiselower_static_raiseZStaticTryRaiselower_static_try_raisehasattrr   r)   )r=   r   tyvalr   r   trflZcondtypredr   otyretvalr   r   r   valuetyr    targettyindextyr   fnopcallsig_classrJ   r>   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st| j| j||
|j	d }| j| j||	|j	d }|| j|||fS )Nr   rG   r   )r   r   r   r   setitemr7   r   r   r   rT   r   r   r	   r   r   rD   r   	unliteralr   )r=   Z
target_varr   Z	value_varr   r   r   r    r   r   r   r   r   r   r   ulr>   r>   r?   r   ;  s6      zLower.lower_setitemc                 C   s6   |j d kr| jd | jd n| j|j |j| jd d S Nr   )r_   ra   r6   r`   r=   r   r>   r>   r?   r   Z  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   )r_   rb   r6   r`   r   r>   r>   r?   r   a  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_genericrD   increfZExpr
lower_exprZVarr   r   r   r   r   r   r|   r	   Omittedr   Z!resolve_value_type_prefer_literalrx   r    ZYieldlower_yieldr   r   )r=   r   r   r   resr   r   ZargtypyvalZtyctxZvaltyconstr>   r>   r?   r   h  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 rA   )r,   Zyield_pointsr    r   r   r   Z
LowerYieldZ	live_varsZlower_yield_suspendr   r   r   r   ro   
yield_typer7   r   rD   r   r+   r   Zlower_yield_resumer   )
r=   Zrettyr   Zypyr   typZ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   rG   c                    s   j j| j S rA   )r7   r   rD   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 rA   )r
   	UNDEFINEDr   ar>   r>   r?   	<genexpr>  s     z=Lower.lower_binop.<locals>.try_static_impl.<locals>.<genexpr>)anyr   r	   ZFunctionr   r7   r   r   r   r  r   r   rD   r   )ZtysrT   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   rD   rT   _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   rD   )r   avatftrB   r>   r?   r     s   z'Lower.lower_getitem.<locals>.<listcomp>)r   r   r   getitemr7   r   r   r   rT   r   r   ziprD   r   r  )r=   r  r  r   r    r   ZbasevalZindexvalr   r   r   r   argvalsZargtypscastvalsr   r>   rB   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    rD   extract_valuer   r7   r   )r=   r   r   Zvartyr   r>   r>   r?   	_cast_var  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   $  s   z(Lower.fold_call_args.<locals>.<listcomp>z-unsupported keyword arguments when calling %sc                    s   g | ]\}}  ||qS r>   r  r   r   ZsigtyrB   r>   r?   r   -  s   c                    s     |j|  S rA   )r  rT   )r    paramr   r=   r   r>   r?   normal_handler0  s    z,Lower.fold_call_args.<locals>.normal_handlerc                    s    j  jj|  |S rA   )r7   r   rD   rT   )r    r"  defaultr#  r>   r?   default_handler3  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   r!  rB   r>   r?   r   :  s   zALower.fold_call_args.<locals>.stararg_handler.<locals>.<listcomp>)	rT   r   r	   	BaseTupler   r  r   Zmake_anonymous_structrD   )r    r"  varsZ
stararg_tyr   r#  r>   r?   stararg_handler7  s    

z-Lower.fold_call_args.<locals>.stararg_handler)r   r   r   r	   r'  r   ranger   pysigr   r  rT   r   Zfold_argumentsdict)r=   fntyr   pos_argsr   Zkw_argsZ	tp_varargr+  r  r$  r&  r)  r>   )r=   r   r   r?   fold_call_args  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   rp   listrT   r*  r   Zconstsr   r   r   r   r   replacer+  r/  r   r   rD   )r=   r   r   r-  Zpos_tysr.  r  r   Z	fixed_sigr  r   r>   r>   r?   r   E  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)rO   r6   )r$   r   r   r   r   r  r	   ZPhantomr7   r   r   rJ   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   rD   )r=   r  r  r   r-  r   r>   r>   r?   
lower_callb  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  rB   r>   r?   r     s     c                    s   g | ]}  |qS r>   )r   r  rB   r>   r?   r     s     c                    s"   g | ]\}} j || jqS r>   )rC   from_native_valuerE   )r   ZatypavalrB   r>   r?   r     s   
)Znumba.core.pythonapir<  rF   rC   
gil_ensurerT   r  r   Zload_dispatcherZcall_function_objargsr   is_nullrD   if_elsedecrefgil_releaser+   Z
return_excZto_native_value
dispatcherZoutput_typesr   callablecleanupif_thenZis_error)r=   r-  r  r   r<  	gil_staterR   rS   Z	argvaluesvr   ZargobjsZcalleeZret_objhas_exceptionthenorelseobjZnativeoutputr>   rB   r?   r3    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/  rT   r   kwsr   ZExternalFunctionDescriptorsymbolr   r  r7   Zdeclare_external_functionrD   r%   Zcall_external_functionrS   )r=   r-  r  r   r  r$   rJ   r>   r>   r?   r4    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/  rT   r   rP  r   rJ   r   Zrequires_gilrF   rC   r@  r  r   r	   Zffi_forced_objectr   r>  rE   appendr7   Zcall_function_pointerrD   cconvrC  rD  )r=   r-  r  r   r  pointerrI  Z
newargvalsZpyvalsZexptypZgottypr?  rN  r   r>   r>   r?   r5    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/  rT   r   rP  Zget_overloadsr7   manglerr   r$   rU  rQ   rV  rD   rP   r   
startswithZcall_internalZcall_unresolved)
r=   r-  r  r   r  Zrec_ovrW  rU  Zmangled_namer   r>   r>   r?   r6    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   )rS  )r   r	   r   Zcheck_signaturer   r7  ftyper/  rT   r   rP  _Lower__get_function_pointerrJ   r   rD   r   rS  )	r=   r-  r  r   r   rY  r  Zfunc_ptrr   r>   r>   r?   r8    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)ZlikelyrG   zpyaddr_of_%signore)Zfailure_modez function address is null)r`   r6   )Z numba.experimental.function_typer[  r7   get_value_typer   rD   r  r   alloca_oncerB  rA  rF   rC   r@  rH  ra   RuntimeErrorr6   Zlong_as_voidptrstoreZbitcastrC  rD  load)r=   rY  fnamer   r[  ZlltyZfstructaddrZfptrrL  rM  rI  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	rd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	   r2  rJ   rT   r/  r   rP  r   Znumba.core.target_extensionrd  ZtargetdescrZtarget_contextr   r7   Zrecvrr   r   r0  rD   r6   )r=   r-  r  r   r  Ztnamerd  ZdispZhw_ctxr   Zthe_selfr   r>   r>   r?   r9  T  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st|
| |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rt#$ |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rtEd#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_iterrg  rh  r   getattrZstatic_getitemZtyped_getitemr  Zbuild_tuplec                    s   g | ]}  |jqS r>   r   r   r  rB   r>   r?   r     s     z$Lower.lower_expr.<locals>.<listcomp>c                    s   g | ]}  |jqS r>   r   r   r  rB   r>   r?   r     s     c                    s&   g | ]\}}} j  j|||qS r>   r  r   r   ZtotyfromtyrB   r>   r?   r     s   
build_listc                    s   g | ]}  |jqS r>   rj  r  rB   r>   r?   r     s     c                    s   g | ]}  |jqS r>   rk  r  rB   r>   r?   r     s     c                    s&   g | ]\}}} j  j|||qS r>   r  rl  rB   r>   r?   r   !  s   c                    s&   g | ]\}}j j|| jqS r>   r7   r   rD   Zdtyper   r   rm  r  r=   r>   r?   r   *  s   	build_setr"   c                    s   g | ]}  |jqS r>   rj  r  rB   r>   r?   r   2  s     c                    s   g | ]}  |jqS r>   rk  r  rB   r>   r?   r   3  s     c                    s&   g | ]\}}j j|| jqS r>   ro  rp  rq  r>   r?   r   4  s   	build_mapr   phizPHI not strippednull)Hr   r  rM   r   r  r   ZmutableZimmutable_fnr   r   r7   r   r   r$   r   r   r   rD   rT   r  r;  re  r   rf  r   r	   r   r   r'  r   Ziterator_typer   Zget_constant_undefZPairr   r   r   r*  countr   Zif_unlikelynot_ra   rt   r6   Zinsert_valuerC  ZBoundFunctionthisZget_bound_functionZget_getattrr   Zresolve_getattrr   r  r    r   r   r  r)   r  Z
make_tupleZLiteralListTuplern  rr  rR  rs  r0  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krJ  r   ZkeytypeZvaltyper>   rq  r?   r   p  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?   getvarm  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|   rD   ra  )r=   r   r  r>   r>   r?   r   v  s    

 zLower.loadvarc              
   C   s  |  |}| || || jkr2| js2|| j|< n|dkrP| |}| || | |}|j|jj	krdj
||||d}t||dk	rt| 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sizerH   	datamodelr   )r   r   r   r   r   r   rC  r  r   pointeer   r   r   r|   rD   r`  r:   r7   r]  get_abi_sizeofdata_model_managermark_variablerH   )r=   r   r   r   r   oldr  rO   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   rC  r  rD   ra  r`  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   r]  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  rH   r  )rX  r   r^  rD   r*   r  r7   r  r   r  r6   rH   )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 rA   )r7   ru   nrtr   rD   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 rA   )r7   ru   r   r|   rD   r  rC  r  r>   r>   r?   rC    s    zLower.decref)N)N)N))r   r   r   r   rn   r<   propertyr   r   rZ   r[   r   r   r   r   r   r   r  r  r  r/  r   r;  r3  r4  r5  r6  r8  rZ  r9  r   r   r  r   r   r   r~  r  r   rC  __classcell__r>   r>   r   r?   r   M  sL   
'& 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   rK   	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 
  7         5