o
    8ήc                     @   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d1ddZdd Zdd Zdd Zdd Zdd  Zd!d" Zd2d$d%Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ ZdS )3	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rY| jjntj }| ! | _"|| j|jj#|d| _| $  d S )N)environmentfndesc)modulefilepathcgctx)%libraryr$   r   	SortedMapblocksitemsfunc_ir	call_convgenerator_infometadatar   ConfigStacktop_or_noneflagscreate_ir_moduleunique_namer%   r   from_fndescenvblkmappending_phisvarmapminkeysfirstblkloc	subtargetcontextenable_debuginfo	DIBuilderr   DummyDIBuilder_compute_def_locationdefn_locfilenameinit)selfr?   r(   r$   r,   r/   dibuildercls rI   :/tmp/pip-target-vg8gfxp4/lib/python/numba/core/lowering.py__init__   s8   

zBaseLower.__init__c                 C   s   d S NrI   rG   rI   rI   rJ   rF   J   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)	pyapir?   get_python_apibuilderget_env_managerenv_managerenv_bodyenv_ptrenvargrM   rI   rI   rJ   
init_pyapiM   s   

zBaseLower.init_pyapic                 C   sx   | j j| j jjd }| jjr:| j jj}t|}|d ur*|d }| j j|}|S d| j jj d}t	
t| |S )N   z$Could not find source for function: z+. Debug line information may be inaccurate.)r,   r=   with_linenoliner?   r@   func_idfuncr   warningswarnr   )rG   rD   fnoptional_lnooffsetmsgrI   rI   rJ   rC   [   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argtypesrY   )rN   r   mark_subprogramrP   rb   r$   rc   argsre   rD   rY   rM   rI   rI   rJ   	pre_lowern   s   
zBaseLower.pre_lowerc                 C   s   | j   dS )z5
        Called after all blocks are lowered
        N)r   finalizerM   rI   rI   rJ   
post_lower|   s   zBaseLower.post_lowerc                 C      dS )z1
        Called before lowering a block.
        NrI   rG   blockrI   rI   rJ   	pre_block       zBaseLower.pre_blockc                 C   rk   )z0
        Called after lowering a block.
        NrI   rl   rI   rI   rJ   
post_block   ro   zBaseLower.post_blockc                 C   "   | j j| j|||| jjjd dS )z+Propagate exception to the caller.
        r=   	func_nameN)r-   return_user_excrP   r,   rZ   rs   rG   	exc_classexc_argsr=   rI   rI   rJ   return_exception      

zBaseLower.return_exceptionc                 C   rq   )z5Set exception state in the current function.
        rr   N)r-   set_static_user_excrP   r,   rZ   rs   ru   rI   rI   rJ   set_exception   ry   zBaseLower.set_exceptionc                 C   s"   | j | j}| j | j| dS )z7Emit a pointer to hold the Environment object.
        N)r?   get_env_namer$   declare_env_globalr%   )rG   envnamerI   rI   rJ   emit_environment_object   s   z!BaseLower.emit_environment_objectc                 C   sX  |    | jd u rd | _| | j n!| | | _| jj| _| j|  | j|  | jj	r4| j
|  tjrtd| j dd tjr}z*ddlm} ddlm} ddlm} ddlm} t|| j | || d	 W n ty|   d
}t|w t| j td | jjr| jd u rt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================================================================================)r?   r$   )$r   r.   genlowerlower_normal_functionr$   GeneratorLowergentypelower_init_funclower_next_funchas_finalizerlower_finalize_funcr   	DUMP_LLVMprintcenterHIGHLIGHT_DUMPSpygmentsr   pygments.lexersr   pygments.formattersr   numba.misc.dump_styler   r%   __repr__ImportError
ValueErrorr?   
enable_nrtr   remove_unnecessary_nrt_usagerb   post_loweringr(   add_ir_module)rG   r   lexerr   r   ra   rI   rI   rJ   lower   sH   



zBaseLower.lowerc                 C   s    | j | j| jj| j| _| jS rL   )r-   decode_argumentsrP   r$   re   rb   fnargsrM   rI   rI   rJ   extract_function_arguments   s
   
z$BaseLower.extract_function_argumentsc                 C   sl   |  | |   |  }t| j | j| | j| j| j	  W d   dS 1 s/w   Y  dS )z/
        Lower non-generator *fndesc*.
        N)
setup_functionr   lower_function_bodyr   suspend_emissionrP   position_at_endbranchr7   r<   )rG   r$   entry_block_tailrI   rI   rJ   r      s   
"zBaseLower.lower_normal_functionc                 C   s   | j D ]}d| }| j|| j|< q|   | jj}| d| j	j
 t| j  D ]\}}| j| }| j| | | q,|   |S )zP
        Lower the current function's body, and return the entry block.
        zB%sz# function begin: {0})r*   rb   append_basic_blockr7   rh   rP   basic_blockdebug_printformatr$   r4   sortedr+   r   lower_blockrj   )rG   r`   bnamer   rm   bbrI   rI   rJ   r      s   

zBaseLower.lower_function_bodyc              	   C   sv   |  | |jD ]+}|j| _tt| jd}td|| j|d | | W d   n1 s.w   Y  q| | dS )z(
        Lower the given block.
        r=   zlowering "{inst}" at {loc})instr=   errcls_N)rn   bodyr=   r   r   r   
lower_instrp   )rG   rm   r   defaulterrclsrI   rI   rJ   r      s   

zBaseLower.lower_blockFc                 C   sH   | j r| jj| j| j j| j| j|d | jj| j| j| j| j|d dS )zP
        Create CPython wrapper(s) around this function (or generator).
        )release_gilN)r   r?   create_cpython_wrapperr(   gendescr6   call_helperr$   )rG   r   rI   rI   rJ   r     s   

z BaseLower.create_cpython_wrapperc                 C   s,   | j rtd| j| j| j| j| j dS )z8
        Create C wrapper around this function.
        z(generator as a first-class function typeN)r   r   r?   create_cfunc_wrapperr(   r$   r6   r   rM   rI   rI   rJ   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 )Nalwaysinlineoptnonenoinlineentry)r?   declare_functionr%   rb   r2   dbg_optnone
attributesaddr   entry_blockr   rP   r-   init_call_helperr   )rG   r$   attrsetrI   rI   rJ   r   "  s   

zBaseLower.setup_functionc                 C   s   | j j| S rL   )r$   typemap)rG   varnamerI   rI   rJ   typeof.  s   zBaseLower.typeofc                 C   s$   t jr| j| jd| d S d S )NzDEBUGJIT: {0})r   	DEBUG_JITr?   r   rP   r   )rG   ra   rI   rI   rJ   r   1  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   r?   get_dummy_valueloadvarr   	signaturenoneget_functionr   rP   )rG   ra   r   argtysrg   sigimplrI   rI   rJ   print_variable5  s   
zBaseLower.print_variablerL   )NN)F)__name__
__module____qualname____doc__rK   rF   rV   rC   rh   rj   rn   rp   rx   r{   r   r   r   r   r   r   r   r   r   r   r   r   rI   rI   rI   rJ   r!      s0    
-

-
	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!dFd:d;Z"d<d= Z#d>d? Z$dFd@dAZ%dBdC Z&dDdE Z'  Z(S )GLowerc                    s   t    |   d S rL   )superrF   _find_singly_assigned_variablerM   	__class__rI   rJ   rF   P  s   
z
Lower.initc                 C   s   | j du 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)r2   r   rM   rI   rI   rJ   _disable_sroa_like_optU  s   zLower._disable_sroa_like_optc                    s  | j }|j}t }| j jjst|}t|}tt}|j	 D ]\}}|D ]	 |  
| q%qtt}	|j	 D ]\}}|D ]	 |	  
| q?q9|D ]8  |vrt|  dkrt|	  dkr|  \}
| j|
 tj} fdd|D }t|dkr|
  qL|| _i | _d S )NrW   r   c                    s   g | ]
}|j j kr|qS rI   )targetname).0stmtvarrI   rJ   
<listcomp>|  s    

z8Lower._find_singly_assigned_variable.<locals>.<listcomp>)r,   r*   setrZ   is_generatorr   r   r   defmapr+   r   usemaplen
find_instsr
   Assign_singly_assigned_vars_blk_local_varmap)rG   r,   r*   savuse_defsalloca_varsvar_assign_mapblkvlvar_use_mapdefblkassign_stmtsassignsrI   r   rJ   r   ]  s6   



z$Lower._find_singly_assigned_variablec                    s  ddl m} tt| | || _|| jkrQ| j| j }| j	| t
 }| j D ]}|tjD ]}|j|vr?||j q2q*|D ]}| |}| || qC|jddD ]3}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_  d S qWd S )Nr   )ehcall)opr   )!numba.core.unsafer   r   r   rn   _cur_ir_blockr<   r7   rP   r   r   r*   valuesr   r
   Delvaluer   r   _alloca_var
find_exprsr   guardget_definitionr,   r[   
isinstanceGlobalexception_check
terminatorBranchtruebr_in_try_block)rG   rm   r   r   	all_namesxr   fetyper   defn	targetblkr   rI   rJ   rn     s8   


zLower.pre_blockc                 C   s"   z| j `W d S  ty   Y d S w rL   )rP   r  AttributeErrorrl   rI   rI   rJ   rp     s
   zLower.post_blockc              	   C   sx  | j | j| jj | t| t|tj	rI| 
|jj}| ||}d }t|jtjr=| j | j| jj |jjd }| j||jj|d d S t|tjr| |jj}| j|j }| j|j }| 
|jj}| j| j||tj}	|	jtjdksJ d|	j | j |	|| d S t|tj!r| j|j }
| j"|
 d S t|tj#r| j$r| j%&|  d S | |jj}| 
|jj}| j'j(}t|tj)r| j*+| j||| d S ||ksJ d,||| j-| j||}| j*.| j| d S t|tj/rd S t|tj0r]| j'j1| }|d usJ z	| j2d|}W n t3y0   | 4|j|j5|j| Y S w | |jj}
| |jj}| 
|jj}| j| j|||j6d }|| j|
|j|fS t|tj7rk| 8| d S t|tj9r| j'j1| }|d usJ | 4|j|j|j|S t|tj:r| j'j1| }|d usJ | 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sJ | j| j|||j6d }|| j|
|fS t|tjCr"| D|j d S t|tjEry| |jj}
| |jj}| j'j1| }| 
|jj}| 
|jj}|d usRJ |j6d |ks\J | jF|jG|}| j| j|||j6d }|| j|
|fS t|tjHr| I| d S t|tjJr| K| d S tL| jdr| jjMN D ]\}}t||r|| |  d S qt3t|)	NrW   )argidxzcond is not i1: %sz)type '{}' does not match return type '{}'static_setitem   r   lower_extensions)Or   mark_locationrP   r=   rY   r   strr  r
   r   r   r   r   lower_assignr   ArgrD   r    storevarr	  r   condr7   r
  falsebrr?   castr	   booleantypellvmliteIntTypecbranchJumpr   Returnr.   r   return_from_generatorr$   restypeOptionalr-   return_optional_valuer   get_return_valuereturn_valuePopBlockStaticSetItem	calltypesr   NotImplementedErrorlower_setitem	index_varrg   Printlower_printSetItemStoreMapdctkeyDelItemoperatordelitemtyping_contextresolve_value_typeget_call_typer   delvarSetAttrget_setattrattrStaticRaiselower_static_raiseStaticTryRaiselower_static_try_raisehasattrr  r+   )rG   r   tyvalr  r  trflcondtypredr   otyretvalr   r   r   valuetyr    targettyindextyr   fnopcallsig_classr[   rI   rI   rJ   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rQ| j| j|||j}ntj}||||j	d ksaJ | j| j||
|j	d }| j| j||	|j	d }|| j|||fS )Nr   rW   r  )r   r   r   r8  setitemr?   r:  r;  r<  rg   r   r  r	   r'  r  rP   r  	unliteral)rG   
target_varr0  	value_varr   r   r   r    rO  rN  rP  r   rQ  rR  r   ulrI   rI   rJ   r/  ;  s2   zLower.lower_setitemc                 C   8   |j d u r| jd | jd d S | j|j |j| jd d S Nr   )rv   rx   r=   rw   rG   r   rI   rI   rJ   rB  Z     
zLower.lower_static_raisec                 C   rY  rZ  )rv   r{   r=   rw   r[  rI   rI   rJ   rD  a  r\  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
r,| ||S t|tjrP| |j}| |j}| j| j|||}| 	|| |S t|tjrt| jN | d|j }t|tjr|j }| jj}	|	|}
| j| j|
|}| j| j||
|}n| j|j }| j| j|||}| 	|| |W  d    S 1 sw   Y  nt|tjr| ||}| 	|| |S tt||)Nzarg.)r   r  r
   Constr  FreeVarr?   get_constant_genericrP   increfExpr
lower_exprVarr   r   r   r  r  r   r   r	   Omittedr:  !resolve_value_type_prefer_literalr   r    Yieldlower_yieldr.  r  )rG   rF  r   r   resrG  rL  argtypyvaltyctxvaltyconstrI   rI   rJ   r  h  sH   
"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 rL   )r.   yield_pointsr    r   r   
LowerYield	live_varslower_yield_suspendr   r   r   r   r   
yield_typer?   r  rP   r)  r-   r*  lower_yield_resumer_  )
rG   rettyr   ypyrG  typactual_rettypyretrM  rI   rI   rJ   rg    s   zLower.lower_yieldc                    sf  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rp|
|S |t||	f||f}|d ur|
|S ||t|f||f}|d ur|
|S  j jji }j  |}|j||f}|
|S )Nr   rW   c                    s   j j| j S rL   )r?   r  rP   return_type)rh  )restyrG   r   rI   rJ   cast_result  s   z&Lower.lower_binop.<locals>.cast_resultc                    s   t dd |D rd S zt tjr jj| i }n
tjj	g| R  }W n
 t
y1   Y d S w zj |}|j|W S  tyJ   Y d S w )Nc                 s   s    | ]}|t ju V  qd S rL   )r
   	UNDEFINEDr   arI   rI   rJ   	<genexpr>  s    z=Lower.lower_binop.<locals>.try_static_impl.<locals>.<genexpr>)anyr  r	   Functionr<  r?   r:  r   r   rz  r   r   rP   r.  )tysrg   
static_sigstatic_impl)r   rG   r   rI   rJ   try_static_impl  s$   
z*Lower.lower_binop.<locals>.try_static_impl)r?   r:  r;  lhsrhs
static_lhs
static_rhsr   r   r   r$   r-  r  rP   rg   _lit_or_omittedr<  r   )rG   r{  exprr   r  r  r  r  ltyrtyr|  r  rh  r   r   rI   )r   r{  rG   r   rJ   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 rI   r?   r  rP   )r   avatftrM   rI   rJ   r         z'Lower.lower_getitem.<locals>.<listcomp>)r   r   r8  getitemr?   r:  r;  r<  rg   r   r   ziprP   r  rz  )rG   r{  r  r   r    r   basevalindexvalr   rQ  rR  r   argvalsargtypscastvalsrh  rI   rM   rJ   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    rP   extract_valuer   r?   r  )rG   r   rF  vartyrG  rI   rI   rJ   	_cast_var  s   
zLower._cast_varc                    s   r  j}t|tjsJ |fddtt|D  }j}|d u r>|r/td|f  fddt	|j
D }|S  fdd}	 fdd}
 fd	d
}t||t||	|
|}|S )Nc                    s   g | ]}t  |qS rI   )r   r   i)r   rI   rJ   r   $  s    z(Lower.fold_call_args.<locals>.<listcomp>z-unsupported keyword arguments when calling %sc                       g | ]
\}}  ||qS rI   r  r   r   sigtyrM   rI   rJ   r   -      c                    s     |j|  S rL   )r  rg   )r    paramr   rG   r   rI   rJ   normal_handler0  s   z,Lower.fold_call_args.<locals>.normal_handlerc                    s    j  jj|  |S rL   )r?   r_  rP   rg   )r    r  defaultr  rI   rJ   default_handler3  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                    r  rI   r  r  rM   rI   rJ   r   :  r  zALower.fold_call_args.<locals>.stararg_handler.<locals>.<listcomp>)rg   r  r	   	BaseTupler  r   make_anonymous_structrP   )r    r  vars
stararg_tyr   r  rI   rJ   stararg_handler7  s   

z-Lower.fold_call_args.<locals>.stararg_handler)r   r   r  r	   r  ranger   pysigr.  r  rg   r   fold_argumentsdict)rG   fntyr   pos_argsr   kw_args	tp_varargr  r  r  r  r  rI   )rG   r   r   rJ   fold_call_args  s4   


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 ]}||jv r=|j| }t|tr=t|||< q%tj|jg|R  }|j|jd}| ||||ji }	| jt|}
|
| j|	 dS )z$
        Lower a ir.Print()
        )r  N)r$   r-  rz  r	   r   r?   r:  r;  r   listrg   r  r   constsr  r  r   r   r   replacer  r  r   r   rP   )rG   r   r   r  pos_tysr  r  rj  	fixed_sigr  r   rI   rI   rJ   r2  E  s    




zLower.lower_printc                 C   s   | j j| }| d| t|jtjr| j	 S | 
|jj}t|tjr/| |||}n?t|tjr=| |||}n1t|tjrK| |||}n#t|tjrY| |||}nt|tjrg| |||}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)ra   r=   )r$   r-  r   r   r  rz  r	   Phantomr?   r   r   r[   r   ObjModeDispatcher_lower_call_ObjModeDispatcherExternalFunction_lower_call_ExternalFunctionExternalFunctionPointer#_lower_call_ExternalFunctionPointerRecursiveCall_lower_call_RecursiveCallFunctionType_lower_call_FunctionType_lower_call_normalvoidr   r=   r  rP   )rG   r{  r  r   r  rh  rI   rI   rJ   
lower_callb  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| qj j|  j j W d    n1 sw   Y  |[  j|jj|}|j} j| |D ]} j| qt|jr|   j|  j|j  j j W d    n1 sw   Y  |W  d    W  d    S 1 sw   Y  W d    d S 1 sw   Y  d S )Nr   )ObjModeUtilsc                 S   s   g | ]}|j qS rI   r   r~  rI   rI   rJ   r     s    z7Lower._lower_call_ObjModeDispatcher.<locals>.<listcomp>c                       g | ]}  |qS rI   )r   r~  rM   rI   rJ   r         c                    r  rI   )r   r~  rM   rI   rJ   r     r  c                    s"   g | ]\}} j || jqS rI   )rN   from_native_valuerR   )r   atypavalrM   rI   rJ   r     s
    
)numba.core.pythonapir  rV   rN   
gil_ensurerg   r  r`  load_dispatchercall_function_objargsr   is_nullrP   if_elsedecrefgil_releaser-   
return_excto_native_value
dispatcheroutput_typesr   callablecleanupif_thenis_error)rG   r  r  r   r  	gil_staterd   re   	argvaluesvrF  argobjscalleeret_objhas_exceptionthenorelseobjnativeoutputrI   rM   rJ   r    sR   


"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  rg   r   kwsr   ExternalFunctionDescriptorsymbolr   rz  r?   declare_external_functionrP   r%   call_external_functionre   )rG   r  r  r   r  r$   r[   rI   rI   rJ   r    s   
z"Lower._lower_call_ExternalFunctionc                 C   s  |  d | |||j|j|j}| |jj}|jry| 	  | j
 }g }g }t|jj|j|D ])\}	}
}|	tjkrU| |
| | j
|
|| j}|| || q1|| q1| j| j|||j}|D ]}| j
| qh| j
| |S | j| j|||j}|S )Nz## calling external function pointer)r   r  rg   r   r  r   r[   r   requires_gilrV   rN   r  r  r   r	   ffi_forced_objectr`  r  rR   appendr?   call_function_pointerrP   cconvr  r  )rG   r  r  r   r  pointerr  
newargvalspyvalsexptypgottypr  r  rh  rI   rI   rJ   r    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|r<| j| j| j||}	|	S | j| j|||}	|	S )N)abi_tagsuid)r  rg   r   r  get_overloadsr?   manglerr   r$   r  rc   r   rP   rb   r   
startswithcall_internalcall_unresolved)
rG   r  r  r   r  rec_ovr  r  mangled_namerh  rI   rI   rJ   r    s$   

zLower._lower_call_RecursiveCallc           	      C   s   |  d t|}||st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	   rU  check_signaturer   r  ftyper  rg   r   r  _Lower__get_function_pointerr[   r   rP   r   r  )	rG   r  r  r   r   r	  r  func_ptrrh  rI   rI   rJ   r    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\}	}
|	o |   | 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 s~w   Y  | j|}| j| j||| | j| | j| W d    n1 sw   Y  |
 | j| j||| W d    n1 sw   Y  W d    n1 sw   Y  | j|S )Nr   )lower_get_wrapper_addressz
addr_of_%sr  z
fptr_of_%sF)likelyrW   zpyaddr_of_%signore)failure_modez function address is null)rw   r=   ) numba.experimental.function_typer  r?   get_value_typer   rP   r  r   alloca_oncer  r  rV   rN   r  r  rx   RuntimeErrorr=   long_as_voidptrstorebitcastr  r  load)rG   r	  fnamer   r  lltyfstructaddrfptrr  r  r  pyaddraddr1addr2rI   rI   rJ   __get_function_pointer,  sZ   




zLower.__get_function_pointerc                 C   s   |  d| |  d| t|tjr|jj}n| |||j|j|j	}|j
}|d urCd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  r[   rg   r  r   r  r   numba.core.target_extensionr!  targetdescrtarget_contextr   r?   recvrr   r   r  rP   r=   )rG   r  r  r   r  tnamer!  disphw_ctxr   the_selfrh  rI   rI   rJ   r  T  s&   
zLower._lower_call_normalc           (   
      s  |j dkr ||jS |j dkr,|jj}|jr$ ||jS  ||jS |j dkru|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r|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r7j
j||
|
j}|
j}
t|
tjrM|
 ksEJ |
| |S |
jj}j
 }t |tj!}t"#|
j|
}j
d
|}t"#||
j}j
d|}|j|f}t$|j%D ]H}|j|f}j
j||}t&'jj(| j)t*j+d W d    n	1 sw   Y  j
j||}j,|||}q|j|f}j
j||}t&'j| j)t*j+d W d    n	1 sw   Y  -|
j| |S |j dkrr|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 |j dkrt"# |j	jt5|j6}zj
d|}|j|j	j|j6fW S  t7y   |j8d u r jj| }9 ||j	|j8| Y S w |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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 |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r*|j:}g g }} g g }!}"|D ]1\}#}$|#j}%|#j}&|$j}|$j}'|A|% | A| |!A|& |"A|' qj
Bj tCt;|!|"tCt;|| S |j d!krP|j	j}|j	j}
j
j||
 } | |S |j d"krZtDd#|j d$krfj
E S |j j
jFv rzj
jF|j  |}	|	S t7|)%Nbinopinplace_binopunaryr   r   
pair_firstpair_second)getiteriternextexhaust_iterr/  r0  r   getattrstatic_getitemtyped_getitemr  build_tuplec                       g | ]}  |jqS rI   r   r   r  rM   rI   rJ   r         z$Lower.lower_expr.<locals>.<listcomp>c                    r6  rI   r   r   r  rM   rI   rJ   r     r8  c                    &   g | ]\}}} j  j|||qS rI   r  r   rG  totyfromtyrM   rI   rJ   r     r  
build_listc                    r6  rI   r7  r  rM   rI   rJ   r     r8  c                    r6  rI   r9  r  rM   rI   rJ   r     r8  c                    r:  rI   r  r;  rM   rI   rJ   r   !  r  c                    &   g | ]\}}j j|| jqS rI   r?   r  rP   dtyper   rG  r=  r{  rG   rI   rJ   r   *  
    	build_setr"   c                    r6  rI   r7  r  rM   rI   rJ   r   2  r8  c                    r6  rI   r9  r  rM   rI   rJ   r   3  r8  c                    r?  rI   r@  rB  rC  rI   rJ   r   4  rD  	build_mapr  phizPHI not strippednull)Gr   r  r^   r   r  r   mutableimmutable_fnr   r   r?   r:  r;  r$   r-  r   r  rP   rg   rz  r  r-  r`  r.  r  r	   r'  r  r  iterator_typerr  get_constant_undefPairr  r   r   r  countr   if_unlikelynot_rx   r   r=   insert_valuer  BoundFunctionthisget_bound_functionget_getattrr@  resolve_getattrr   r  r    r.  r0  r  r+   r  
make_tupleLiteralListTupler>  rE  r  rF  r  r   get_constant_nullspecial_ops)(rG   r{  r  r  rG  rw  func_tyr   r   rh  rF  ftycastvalitemtytuppairtygetiter_siggetiter_impliternext_sigiternext_impliterobjr  pairis_validitemcastedattrtyitemvalsitemtysr  r+   r;   r   	key_typesvalue_typeskr  r6  keytypevaltyperI   rC  rJ   rb  p  s  






















zLower.lower_exprc                 C   s<   || j v rdS || jvs| jr| ||}|| j |< dS dS )zT
        Ensure the given variable has an allocated stack slot (if needed).
        N)r9   r   r   alloca)rG   r   r  ptrrI   rI   rJ   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   r9   )rG   r   rI   rI   rJ   getvarm  s   
zLower.getvarc                 C   sx   || j v r| js| j | S | |}|| jjv r6t| j | j|W  d   S 1 s/w   Y  dS | j|S )z2
        Load the given variable's value.
        N)	r   r   ru  r,   	arg_namesr   r   rP   r  )rG   r   rt  rI   rI   rJ   r   v  s   


$zLower.loadvarc              
   C   s&  |  |}| || || jv r| js|| j|< dS |du r)| |}| || | |}|j|jj	krBdj
||||d}t||durt| j | j|| W d   n1 s^w   Y  | j}| j|}	| j|	}
| jj| }| jj| j|||	|
|j||d dS | 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   rt  r  r   )r   lltypesizerY   	datamodelr  )r   r  r   r   r   r   r  ru  r  pointeer   AssertionErrorr   r   rP   r  rD   r?   r  get_abi_sizeofdata_model_managermark_variablerY   )rG   r   r   r  r  oldrt  ra   r=   rw  sizeofry  rI   rI   rJ   r    s@   




zLower.storevarc                 C   s   |  |}|| jvr| js|| jv r| j| | || || jv r3| js3| j| }| || dS | |}| || j	| | j
t|jjd| dS )z,
        Delete the given variable.
        N)r   r   r   r   discardr  r  ru  rP   r  r  r   r  rz  )rG   r   r  llvalrt  rI   rI   rJ   r=    s   




zLower.delvarc                 C   s(   | j |}| j j| }| j|||dS )N)ry  )r?   r  r}  alloca_lltype)rG   r   r  rw  ry  rI   rI   rJ   rs    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   rw  rx  rY   ry  )r  r   r  rP   r,   rv  r?   r|  r   r~  r=   rY   )rG   r   rw  ry  
is_uservaraptrr  rI   rI   rJ   r    s   
zLower.alloca_lltypec                 C   s$   | j jsd S | j j| j|| d S rL   )r?   r   nrtr`  rP   rG   rw  rG  rI   rI   rJ   r`    s   zLower.increfc                 C   sR   | j jsd S t| j | j j| j|| W d    d S 1 s"w   Y  d S rL   )r?   r   r   r   rP   r  r  r  rI   rI   rJ   r    s
   "zLower.decrefrL   ))r   r   r   r   r   rF   propertyr   r   rn   rp   r   r/  rB  rD  r  rg  r  r  r  r  r2  r  r  r  r  r  r  r
  r  rb  r  ru  r   r  r=  rs  r  r`  r  __classcell__rI   rI   r   rJ   r   M  sN    
'& 2F'*@-
( n	
.
r   c                 C   s*   zt | W S  ty   t |  Y S w )zjReturns a Literal instance if the type of value is supported;
    otherwise, return `Omitted(value)`.
    )r	   r   r   rd  )r   rI   rI   rJ   r    s
   r  )-collectionsr   r   r8  r\   	functoolsr   llvmlite.irr   r   r   
numba.corer   r   r	   r
   r   r   r   r   r   r   r   r   numba.core.errorsr   r   r   r   r   r   numba.core.funcdescr   numba.core.environmentr   numba.core.analysisr   r   numba.misc.firstlinefinderr   r   objectr!   r   r  rI   rI   rI   rJ   <module>   s6    8 
  7         5