a
    
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?   \/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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u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 u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|v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   sh  |    | jd u 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y   d
}t|Y n0 n
t| j td | jjrD| jd u rDt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$   )$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_DUMPSZ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   sj   |  | |   |  }t| j0 | j| | j| j| j	  W d   n1 s\0    Y  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   sv   |  | |jD ]V}|j| _tt| jd}td|| j|d | | W d   q1 s\0    Y  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|v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   s\   t || jj| f}| j | |f}tjt j	g|R  }| 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_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u 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 ] |	  
| qqt|D ]p  |vrt|  dkrt|	  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|vrd||j qdqT|D ]}| |}| || q|jddD ]f}ttj| j|j}	|	d urt|	tjr|	j|ju rt|jtjr| j|jj }
d|
i| j_  qqd 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   Z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`     s0    


zLower.pre_blockc                 C   s"   z
| j `W n ty   Y n0 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 nt|tjr | |jj}| j|j }| j|j }| 
|jj}| j| j||tj}	|	jtjdksJ d|	j | j |	|| nZt|tj!rJ| j|j }
| j"|
 n0t|tj#r| j$rp| j%&|  d S | |jj}| 
|jj}| j'j(}t|tj)r| j*+| j||| d S ||ksJ d,||| j-| j||}| j*.| j| nt|tj/rnnt|tj0r| j'j1| }|d us4J z| j2d|}W n* t3yp   | 4|j|j5|j| Y S 0 | |jj}
| |jj}| 
|jj}| j| j|||j6d }|| j|
|j|fS nt|tj7r| 8| nt|tj9r(| j'j1| }|d usJ | 4|j|j|j|S t|tj:rf| j'j1| }|d usPJ | 4|j;|j<|j|S t|tj=r:| |jj}
| |jj}| 
|jj}| 
|jj}| j'j1| }|d usJ t>j?}| jj@A|}|B| jj@|j6i }| j2||}||j6d ksJ | j| j|||j6d }|| j|
|fS t|tjCrX| D|j n"t|tjEr| |jj}
| |jj}| j'j1| }| 
|jj}| 
|jj}|d usJ |j6d |ksJ | jF|jG|}| j| j|||j6d }|| j|
|fS t|tjHr | I| nZt|tjJr:| K| n@t|tjLrT| M| n&t|tjNrn| O| nt3t|d S )NrI   )argidxzcond is not i1: %sz)type '{}' does not match return type '{}'Zstatic_setitem   r   )Pr   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IntTypeZ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sJ | 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   	unliteral)r>   Z
target_varr   Z	value_varr   r   r   r    r   r   r   r   r   r   r   ulr?   r?   r@   r   T  s2    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 u 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 u 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rlt| j | d|j }t|tjr|j }| jj}	|	|}
| j| j|
|}| j| j||
|}n | j|j }| j| j|||}| 	|| |W  d    S 1 s`0    Y  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     sF    
&zLower.lower_assignc           
      C   s   | j j|j }|j|u sJ 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   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 ur|
|S |t||	f||f}|d ur|
|S ||t|f||f}|d u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 z8t tjr8 jj| i }ntjj	g| R  }W n t
yb   Y d S 0 zj |}|j|W S  ty   Y d S 0 d S )Nc                 s   s   | ]}|t ju V  qd S rB   )r
   	UNDEFINEDr   ar?   r?   r@   	<genexpr>      z=Lower.lower_binop.<locals>.try_static_impl.<locals>.<genexpr>)anyr   r	   Z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+  s,    


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 J |fddtt|D  }j}|d u 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    r/  defaultr0  r?   r@   default_handlerd  s    z-Lower.fold_call_args.<locals>.default_handlerc                    sD   j |  }t|tjsJ | fddt||D }t j|S )Nc                    s   g | ]\}}  ||qS r?   r-  r.  rD   r?   r@   r   k  s   zALower.fold_call_args.<locals>.stararg_handler.<locals>.<listcomp>)rX   r   r	   	BaseTupler%  r   Zmake_anonymous_structrF   )r    r/  varsZ
stararg_tyr   r0  r?   r@   stararg_handlerh  s    

z-Lower.fold_call_args.<locals>.stararg_handler)r   r   r   r	   r4  ranger   pysigr   r%  rX   r   Zfold_argumentsdict)r>   fntyr   pos_argsr   Zkw_argsZ	tp_varargr8  r&  r1  r3  r6  r?   )r>   r   r   r@   fold_call_argsO  s2    


zLower.fold_call_argsc                 C   s   | j j| }|jtjksJ | jjt}t	|j
}t	|j
}tt|D ]0}||jv rJ|j| }t|trJt|||< qJtj|jg|R  }|j|jd}| ||||ji }	| jt|}
|
| j|	 dS )z$
        Lower a ir.Print()
        )r8  N)r$   r   r  r	   r   r7   r   r   rx   listrX   r7  r   Zconstsr   r   r   r   r   replacer8  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 u 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  s8    

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|<\}}|@ |D ]} j| qֈ j|  j j W d    n1 s0    Y  |  j|jj|}|j} j| |D ]} j| qPt|jrx|   j|  j|j  j j W d    n1 s0    Y  |W  d    W  d    S 1 s0    Y  W d    n1 s
0    Y  d S )Nr   )ObjModeUtilsc                 S   s   g | ]
}|j qS r?   r   r  r?   r?   r@   r     r  z7Lower._lower_call_ObjModeDispatcher.<locals>.<listcomp>c                    s   g | ]}  |qS r?   )r   r  rD   r?   r@   r     r  c                    s   g | ]}  |qS r?   )r   r  rD   r?   r@   r     r  c                    s"   g | ]\}} j || jqS r?   )rE   from_native_valuerG   )r   atypavalrD   r?   r@   r     s   
)Znumba.core.pythonapirI  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   rI  	gil_staterT   rU   Z	argvaluesvr   ZargobjsZcalleeZret_objhas_exceptionthenorelseobjZnativeoutputr?   rD   r@   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<  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@   rA    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   rN  r%  r   r	   Zffi_forced_objectr   rK  rG   r   r7   Zcall_function_pointerrF   cconvrQ  rR  )r>   r:  r  r   r&  pointerrW  Z
newargvalsZpyvalsZexptypZgottyprM  r\  r	  r?   r?   r@   rB    s>    



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$   rb  rS   rc  rF   rR   r   
startswithZcall_internalZcall_unresolved)
r>   r:  r  r   r&  Zrec_ovrd  rb  Zmangled_namer	  r?   r?   r@   rC  8  s"    

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   Zcheck_signaturer   rD  ftyper<  rX   r   r^  _Lower__get_function_pointerrL   r   rF   r   r`  )	r>   r:  r  r   r   rf  r&  Zfunc_ptrr	  r?   r?   r@   rE  M  s"    


zLower._lower_call_FunctionTypeNc              
   C   s  ddl m} | j|}| |}| jj|dd| d}tj| j|d| d}| jj	t
| j|ddF\}	}
|	 |   | j }| jj|dd	| d}|| j| j||d
d}| jjt
| j|dd* | jt| df| jd W d    n1 s0    Y  | j|}| j| j||| | j| | j| W d    n1 sZ0    Y  |
( | j| j||| W d    n1 s0    Y  W d    n1 s0    Y  | j|S )Nr   )lower_get_wrapper_addressz
addr_of_%srJ  z
fptr_of_%sF)ZlikelyrI   zpyaddr_of_%signore)Zfailure_modez function address is null)re   r6   )Z numba.experimental.function_typerh  r7   get_value_typer   rF   r)  r   alloca_oncerP  rO  rH   rE   rN  rV  ri   RuntimeErrorr6   Zlong_as_voidptrstoreZbitcastrQ  rR  load)r>   rf  fnamer   rh  ZlltyZfstructaddrZfptrrZ  r[  rW  ZpyaddrZaddr1Zaddr2r?   r?   r@   Z__get_function_pointer]  sP    




$,XzLower.__get_function_pointerc                 C   s   |  d| |  d| t|tjr6|jj}n| |||j|j|j	}|j
}|d u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	   r?  rL   rX   r<  r   r^  r   Znumba.core.target_extensionrq  ZtargetdescrZtarget_contextr   r7   Zrecvrr   r   r=  rF   r6   )r>   r:  r  r   r&  Ztnamerq  ZdispZhw_ctxr   Zthe_selfr	  r?   r?   r@   rF    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v 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sJ |
| |S |
jj}j
 }t |tj!}t"#|
j|
}j
d
|}t"#||
j}j
d|}|j|f}t$|j%D ]}|j|f}j
j||}t&'jj(|  j)t*j+d W d    n1 sx0    Y  j
j||}j,|||}q|j|f}j
j||}t&'j|  j)t*j+d W d    n1 s0    Y  -|
j| |S |j dkr|j	j}|j	j}
t tj.rj
j||
 j/}j
0j| j/}	 |	 |	S j
1|
|j2}j
j3|
|j2}|d u rj
4 S |j
j|
||j2}	j
j|	| }	|	S n|j dkrt"# |j	jt5|j6}z,j
d|}|j|j	j|j6fW S  t7y   |j8d u rf jj| }9 ||j	|j8| Y S 0 nz|j dkrt"# |j	j|j6j}j
d|}|j|j	j|j6jfS |j dkr jj| }9 ||j	|j6|S |j dkrfdd|j:D }fdd|j:D }fddt;| |D }j
<j |} | |S |j dkrH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
@j |S |j d krj|j:}g g  }} g g  }!}"|D ]b\}#}$|#j}%|#j}&|$j}|$j}'|A|% | A| |!A|& |"A|' qވj
Bj tCt;|!|"tCt;|| S |j d!kr|j	j}|j	j}
j
j||
 } | |S |j d"krtDd#n@|j d$krj
E S |j j
jFv 	rj
jF|j  |}	|	S t7|d S )%N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  r  z$Lower.lower_expr.<locals>.<listcomp>c                    s   g | ]}  |jqS r?   r   r   r+  rD   r?   r@   r   G  r  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  r  c                    s   g | ]}  |jqS r?   ry  r+  rD   r?   r@   r   P  r  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  r  c                    s   g | ]}  |jqS r?   ry  r+  rD   r?   r@   r   d  r  c                    s&   g | ]\}}j j|| jqS r?   r}  r~  r  r?   r@   r   e  s   	build_mapr   phizPHI not strippednull)Gr   r  rO   r   r  r   ZmutableZimmutable_fnr   r   r7   r   r   r$   r   r   r   rF   rX   r  rH  rs  r   rt  r   r	   r   r   r4  Ziterator_typer  Zget_constant_undefZPairr   r   r   r7  countr   Zif_unlikelynot_ri   r|   r6   Zinsert_valuerQ  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krX  r   ZkeytypeZvaltyper?   r  r@   r    s   




0

0













zLower.lower_exprc                 C   s8   || j v rdS || jv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vsJ || jvs"J | j| S )z=
        Get a pointer to the given variable's slot.
        )r   r   r   r2   )r>   r   r?   r?   r@   getvar  s    zLower.getvarc                 C   sz   || j v r| js| j | S | |}|| jjv rjt| j | j|W  d   S 1 s^0    Y  n| j|S dS )z2
        Load the given variable's value.
        N)	r   r   r  r+   	arg_namesr   r   rF   rn  )r>   r   r  r?   r?   r@   r     s    

,zLower.loadvarc              
   C   s$  |  |}| || || jv r2| js2|| j|< n|du rP| |}| || | |}|j|jj	krdj
||||d}t||durt| j | j|| W d   n1 s0    Y  | 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   rQ  r  r   pointeer   AssertionErrorr   r   rF   rm  r:   r7   rj  get_abi_sizeofdata_model_managermark_variablerJ   )r>   r   r   r   r   oldr  rQ   r6   r  sizeofr  r?   r?   r@   r     s>    




,zLower.storevarc                 C   s   |  |}|| jvr0| js0|| jv r0| j| | || || jv rd| jsd| j| }| || n6| |}| || j	| | j
t|jjd| dS )z,
        Delete the given variable.
        N)r   r   r   r   discardr   rQ  r  rF   rn  rm  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   rj  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vr\| j|}| jj	| j||||| j
j|d |S )N$F)r   zfill)r   r  r  rJ   r  )re  r   rk  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   sP   | j jsd S t| j$ | j j| j|| W d    n1 sB0    Y  d S rB   )r7   r}   r   r   rF   r  rQ  r  r?   r?   r@   rQ    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   rH  r@  rA  rB  rC  rE  rg  rF  r  r   r  r   r   r   r  r  r   rQ  __classcell__r?   r?   r   r@   r   b  sP   

'& 2F'*@-
( n	
.
r   c                 C   s.   zt | W S  ty(   t |  Y S 0 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