U
    9%e                     @   s  d dl mZmZ d dlZd dlZd dlmZ d dlZd dlm	Z	m
Z
 d dlmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZ d dlm Z  d dl!m"Z" d d	l#m$Z$m%Z% d d
l&m'Z' eddZ(G dd de)Z*G dd de*Z+dd Z,dS )    )
namedtupledefaultdictN)partial)Constant	IRBuilder)typingutilstypesir	debuginfofuncdesc
generatorsconfigir_utilscgutilsremoverefctpasstargetconfig)LoweringErrornew_error_contextTypingErrorLiteralTypingErrorUnsupportedErrorNumbaDebugInfoWarning)default_mangler)Environment)compute_use_defsmust_use_alloca)get_func_body_first_lineno_VarArgItem)varargindexc                   @   s   e Zd ZdZd4ddZedd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zd5ddZd6ddZd7ddZdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd8d(d)Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 ZdS )9	BaseLowerz
    Lower IR to LLVM
    Nc                 C   s   || _ || _t|j | _|| _|j| _|| _t	j
 | _| j | jj| _t| j| _i | _i | _i | _t| j | _d| _|j| j| jd| _| jjr| jjntj}|   | _!| jj"}|| j|jj#||d| _| $  d S )N)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?   R/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/core/lowering.py__init__   s:    

zBaseLower.__init__c                 C   s   | j jS N)r7   	call_convr>   r?   r?   r@   rC   K   s    zBaseLower.call_convc                 C   s   d S rB   r?   rD   r?   r?   r@   r=   O   s    zBaseLower.initc                 C   sF   | j dk	rdS | j| j| _ | j| j| _| jj| _| jj| _dS )ze
        Init the Python API and Environment Manager for the function being
        lowered.
        N)	pyapir7   Zget_python_apibuilderZget_env_managerenv_managerZenv_bodyZenv_ptrZenvargrD   r?   r?   r@   
init_pyapiR   s    

zBaseLower.init_pyapic                 C   sv   | j j| j jjd }| jjrr| j jj}t|}|d k	rR|d }| j j|}n d| j jj d}t	
t| |S )N   z$Could not find source for function: z+. Debug line information may be inaccurate.)r+   r6   Zwith_linenoliner7   r8   func_idfuncr   warningswarnr   )r>   r:   fnZoptional_lnooffsetmsgr?   r?   r@   r9   `   s    
zBaseLower._compute_def_locationc                 C   sf   d| _ | jj| jj| jj| jj| jj| j	j
d | jjj}| jjoJ| jj }|rbd|krb|d dS )z4
        Called before lowering all blocks.
        N)functionqualnameargnamesargtypesrJ   alwaysinlinenoinline)rE   r   Zmark_subprogramrF   rR   r$   rS   argsrU   r:   rJ   
attributesr.   r;   add)r>   rY   Z
full_debugr?   r?   r@   	pre_lowers   s    	
zBaseLower.pre_lowerc                 C   s   | j   dS )z5
        Called after all blocks are lowered
        N)r   finalizerD   r?   r?   r@   
post_lower   s    zBaseLower.post_lowerc                 C   s   dS )z1
        Called before lowering a block.
        Nr?   r>   blockr?   r?   r@   	pre_block   s    zBaseLower.pre_blockc                 C   s   dS )z0
        Called after lowering a block.
        Nr?   r^   r?   r?   r@   
post_block   s    zBaseLower.post_blockc                 C   s$   | j j| j||||| jjjd d S )Nr6   	func_name)rC   Zreturn_dynamic_user_excrF   r+   rK   rc   )r>   	exc_classexc_argsnb_typesr6   r?   r?   r@   return_dynamic_exception   s        z"BaseLower.return_dynamic_exceptionc                 C   s"   | j j| j|||| jjjd dS )z+Propagate exception to the caller.
        rb   N)rC   Zreturn_user_excrF   r+   rK   rc   r>   rd   re   r6   r?   r?   r@   return_exception   s       zBaseLower.return_exceptionc                 C   s"   | j j| j|||| jjjd dS )z5Set exception state in the current function.
        rb   N)rC   Zset_static_user_excrF   r+   rK   rc   rh   r?   r?   r@   set_exception   s       zBaseLower.set_exceptionc                 C   s"   | j | j}| j | j| dS )z7Emit a pointer to hold the Environment object.
        N)r7   Zget_env_namer$   Zdeclare_env_globalr%   )r>   envnamer?   r?   r@   emit_environment_object   s    z!BaseLower.emit_environment_objectc                 C   sj  |    | jd kr&d | _| | j nB| | | _| jj| _| j|  | j|  | jj	rh| j
|  tjrtd| j dd tjrzTddlm} ddlm} ddlm} ddlm} t|| j | || d	 W n" tk
r   d
}t|Y nX n
t| j td | jjrF| jd krFtj| j | j| jd | j!| j| j" | j"#| j d S )NzLLVM DUMP %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_DUMPSpygmentsro   Zpygments.lexersrp   Zpygments.formattersrq   Znumba.misc.dump_stylerr   r%   __repr__ImportError
ValueErrorr7   
enable_nrtr   Zremove_unnecessary_nrt_usagerR   Zpost_loweringr(   Zadd_ir_module)r>   ro   lexerrq   rr   rQ   r?   r?   r@   lower   sF    



zBaseLower.lowerc                 C   s    | j | j| jj| j| _| jS rB   )rC   Zdecode_argumentsrF   r$   rU   rR   fnargsrD   r?   r?   r@   extract_function_arguments   s
    
z$BaseLower.extract_function_argumentsc              	   C   sV   |  | |   |  }t| j& | j| | j| j| j	  W 5 Q R X dS )z/
        Lower non-generator *fndesc*.
        N)
setup_functionr   lower_function_bodyr   suspend_emissionrF   position_at_endbranchr1   r5   )r>   r$   entry_block_tailr?   r?   r@   ru      s    
zBaseLower.lower_normal_functionc                 C   s   | j D ]}d| }| j|| j|< q|   | jj}| d| j	j
 t| j  D ]8\}}| j| }| j| | d|  | | qX|   |S )zP
        Lower the current function's body, and return the entry block.
        zB%sz# function begin: {0}z# lower block: )r)   rR   append_basic_blockr1   r[   rF   Zbasic_blockdebug_printformatr$   r/   sortedr*   r   lower_blockr]   )r>   rP   Zbnamer   r_   bbr?   r?   r@   r      s    

zBaseLower.lower_function_bodyc              
   C   sb   |  | |jD ]B}|j| _tt| jd}td|| j|d | | W 5 Q R X q| | dS )z(
        Lower the given block.
        r6   zlowering "{inst}" at {loc})instr6   Zerrcls_N)r`   bodyr6   r   r   r   
lower_instra   )r>   r_   r   Zdefaulterrclsr?   r?   r@   r     s    

 zBaseLower.lower_blockFc                 C   sH   | j r&| jj| j| j j| j| j|d | jj| j| j| j| j|d dS )zP
        Create CPython wrapper(s) around this function (or generator).
        )release_gilN)rt   r7   create_cpython_wrapperr(   Zgendescr0   call_helperr$   )r>   r   r?   r?   r@   r      s    
  z BaseLower.create_cpython_wrapperc                 C   s,   | j rtd| j| j| j| j| j dS )z8
        Create C wrapper around this function.
        z(generator as a first-class function typeN)rt   r   r7   create_cfunc_wrapperr(   r$   r0   r   rD   r?   r?   r@   r   -  s     zBaseLower.create_cfunc_wrapperc                 C   sl   | j | j|| _| jjr>| jj}d|kr>|d |d | jd| _	t
| j	| _| j| j| _d S )NrV   ZoptnonerW   entry)r7   Zdeclare_functionr%   rR   r.   Zdbg_optnonerY   rZ   r   Zentry_blockr   rF   rC   Zinit_call_helperr   )r>   r$   Zattrsetr?   r?   r@   r   6  s    

zBaseLower.setup_functionc                 C   s   | j j| S rB   )r$   typemap)r>   varnamer?   r?   r@   typeofB  s    zBaseLower.typeofc                 C   s*   t jr&| j| jd| jj d|  d S )Nz
DEBUGJIT [z]: )r   Z	DEBUG_JITr7   r   rF   r$   rS   )r>   rQ   r?   r?   r@   r   E  s
     zBaseLower.debug_printc                 C   sZ   t || jj| f}| j | |f}tjt j	f| }| j
t|}|| j| dS )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krdS | j jo| j j S )a  Flags that the SROA like optimisation that Numba performs (which
        prevent alloca and subsequent load/store for locals) should be disabled.
        Currently, this is conditional solely on the presence of a request for
        the emission of debug information.NF)r.   r   r;   rD   r?   r?   r@   _disable_sroa_like_optj  s    
zLower._disable_sroa_like_optc                    s  | j }|j}t }| j jjst|}t|}tt}|j	 D ] \}}|D ] |  
| qLq@tt}	|j	 D ] \}}|D ] |	  
| 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 )NrI   r   c                    s   g | ]}|j j kr|qS r?   )targetname).0stmtvarr?   r@   
<listcomp>  s    z8Lower._find_singly_assigned_variable.<locals>.<listcomp>)r+   r)   setrK   Zis_generatorr   r   r   Zdefmapr*   rZ   Zusemaplen
find_instsr
   Assign_singly_assigned_vars_blk_local_varmap)r>   r+   r)   ZsavZuse_defsZalloca_varsZvar_assign_mapZblkZvlZvar_use_mapZdefblkZassign_stmtsZassignsr?   r   r@   r   u  s0    
z$Lower._find_singly_assigned_variablec                    s  ddl m} tt| | || _|| jkr| j| j }| j	| t
 }| j D ],}|tjD ]}|j|krd||j qdqT|D ]}| |}| || q|jddD ]f}ttj| j|j}	|	d k	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   r`   Z_cur_ir_blockr5   r1   rF   r   r   r)   valuesr   r
   DelvaluerZ   r   _alloca_varZ
find_exprsr   guardZget_definitionr+   rL   
isinstanceGlobalZexception_check
terminatorBranchtruebr_in_try_block)r>   r_   r   r   Z	all_namesxr   fetyper   ZdefnZ	targetblkr   r?   r@   r`     s4    


  zLower.pre_blockc                 C   s$   z
| j `W n tk
r   Y nX d S rB   )rF   r   AttributeErrorr^   r?   r?   r@   ra     s    
zLower.post_blockc              	   C   s  | j | j| jj | t| t|tj	r| 
|jj}| ||}d }t|jtjrz| j | j| jj |jjd }| j||jj|d 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!|	|| n\t|tj"rJ| j|j }
| j#|
 n2t|tj$r| j%rp| j&'|  d S | |jj}| 
|jj}| j(j)}t|tj*r| j+,| j||| d S ||kst d-||| j.| j||}| j+/| j| nt|tj0rnpt|tj1r| j(j2| }|d k	s4t z| j3d|}W n, t4k
rr   | 5|j|j6|j| Y S X | |jj}
| |jj}| 
|jj}| j| j|||j7d }|| j|
|j|fS 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 n"t|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| nZt|tjKr<| L| n@t|tjMrV| N| n&t|tjOrp| P| nt4t|d S )NrI   )argidxzcond is not i1: %sz)type '{}' does not match return type '{}'Zstatic_setitem   r   )Qr   Zmark_locationrF   r6   rJ   r   strr   r
   r   r   r   r   lower_assignr   Argr:   r    storevarr   r   condr1   r   Zfalsebrr7   castr	   booleantypellvmliteZIntTypeAssertionErrorZcbranchZJumpr   Returnr,   rt   Zreturn_from_generatorr$   restypeOptionalrC   Zreturn_optional_valuer   get_return_valuereturn_valueZPopBlockZStaticSetItem	calltypesr   NotImplementedErrorlower_setitem	index_varrX   ZPrintlower_printZSetItemZStoreMapdctkeyZDelItemoperatordelitemtyping_contextresolve_value_typeget_call_typer   delvarZSetAttrZget_setattrattrZDynamicRaiselower_dynamic_raiseZDynamicTryRaiselower_try_dynamic_raiseZStaticRaiselower_static_raiseZStaticTryRaiselower_static_try_raise)r>   r   tyvalr   r   trflZcondtypredr   otyretvalr   r   r   valuetyr    targettyindextyr   fnopcallsigr?   r?   r@   r     s    
 
  zLower.lower_instc                 C   s  |  |j}|  |j}|  |j}| |j}| |j}	| |j}
tj}| jj|}|| jj|j	i }| j
||}t|tjr| j| j|||j}n tj}||||j	d kst| j| j||
|j	d }| j| j||	|j	d }|| j|||fS )Nr   rI   r   )r   r   r   r   setitemr7   r   r   r   rX   r   r   r	   r   r   rF   r   	unliteralr   )r>   Z
target_varr   Z	value_varr   r   r   r    r   r   r   r   r   r   r   Zulr?   r?   r@   r   T  s6      zLower.lower_setitemc                 C   s   |  | d S rB   )r   r>   r   r?   r?   r@   r   s  s    zLower.lower_try_dynamic_raisec                 C   s   |j }g }g }|D ]R}t|tjrH| |j}| |j}| || nd }|}|| || q| j	|j
t|t|| jd d S Nr   )re   r   r
   Varr   r   r   increfappendrg   rd   tupler6   )r>   r   re   rX   rf   Zexc_argtypr   r?   r?   r@   r   x  s     
 zLower.lower_dynamic_raisec                 C   s6   |j d kr| jd | jd n| j|j |j| jd d S r   )rd   ri   r6   re   r   r?   r?   r@   r     s    
zLower.lower_static_raisec                 C   s6   |j d kr| jd | jd n| j|j |j| jd d S r   )rd   rj   r6   re   r   r?   r?   r@   r     s    
zLower.lower_static_try_raisec              
   C   s  |j }t|tjtjtjfr@| j| j||j }| 	|| |S t|tj
rX| ||S t|tjr| |j}| |j}| j| j|||}| 	|| |S t|tjr^t| j | d|j }t|tjr|j }| jj}	|	|}
| j| j|
|}| j| j||
|}n | j|j }| j| j|||}| 	|| |W  5 Q R  S Q R X n*t|tjr| ||}| 	|| |S tt||d S )Nzarg.)r   r   r
   ZConstr   ZFreeVarr7   get_constant_genericrF   r  Expr
lower_exprr   r   r   r   r   r   r   r   r	   Omittedr   Z!resolve_value_type_prefer_literalr   r    Yieldlower_yieldr   r   )r>   r   r   r   resr   r   ZargtypyvalZtyctxZvaltyconstr?   r?   r@   r     sJ    
  zLower.lower_assignc           
      C   s   | j j|j }|j|kstt| ||j}|  | 	|j
j}| |j
j}| jj}| j| j|||}| j| j||}	| j| j|	 |  | j| j|d S rB   )r,   Zyield_pointsr    r   r   r   Z
LowerYieldZ	live_varsZlower_yield_suspendr   r   r   r   rw   
yield_typer7   r   rF   r   rC   r   Zlower_yield_resumer  )
r>   Zrettyr   Zypyr   r  Zactual_rettypZyretr   r?   r?   r@   r
    s       zLower.lower_yieldc                    sj  j j  |j}|j}|j}|j}|j}|j}		|j}	|j}j
j| j j||jd }j j||	jd }fdd}
 fdd}|t|t|f||f}|d k	r|
|S |t||	f||f}|d k	r|
|S ||t|f||f}|d k	r0|
|S  j jji }j  |}|j||f}|
|S )Nr   rI   c                    s   j j| j S rB   )r7   r   rF   return_type)r  )restyr>   r   r?   r@   cast_result  s     z&Lower.lower_binop.<locals>.cast_resultc                    s   t dd |D rd S z6t tjr8 jj| i }ntjj	f|  }W n t
k
rb   Y d S X zj |}|j|W S  tk
r   Y d S X d S )Nc                 s   s   | ]}|t jkV  qd S rB   )r
   	UNDEFINEDr   ar?   r?   r@   	<genexpr>  s     z=Lower.lower_binop.<locals>.try_static_impl.<locals>.<genexpr>)anyr   r	   Functionr   r7   r   r   r   r  r   r   rF   r   )ZtysrX   Z
static_sigZstatic_impl)r   r>   r   r?   r@   try_static_impl  s     
 z*Lower.lower_binop.<locals>.try_static_impl)r7   r   r   lhsrhs
static_lhs
static_rhsr   r   r   r$   r   r   rF   rX   _lit_or_omittedr   r   )r>   r  exprr   r  r  r  r  ltyZrtyr  r  r  r   r   r?   )r   r  r>   r   r@   lower_binop  sH    



zLower.lower_binopc                    s     |j}  |j}tj} jj|}	|	 jj|ji }
 j	|	|
}||f} 
|j 
|jf} fddt|||jD }| j|} j j||j|S )Nc                    s&   g | ]\}}} j  j|||qS r?   r7   r   rF   )r   avatftrD   r?   r@   r   9  s   z'Lower.lower_getitem.<locals>.<listcomp>)r   r   r   getitemr7   r   r   r   rX   r   r   ziprF   r   r  )r>   r  r  r   r    r   ZbasevalZindexvalr   r   r   r   argvalsZargtypscastvalsr  r?   rD   r@   lower_getitem+  s0      


zLower.lower_getitemc                 C   sf   t |tr:| |jj|j }| j| |jj|j}n| |j}| |j}| j	
| j|||S )zh
        Cast a Numba IR variable to the given Numba type, returning a
        low-level value.
        )r   r   r   r   r   r    rF   extract_valuer   r7   r   )r>   r   r   Zvartyr   r?   r?   r@   	_cast_varA  s    
zLower._cast_varc                    s   r>  j}t|tjs t|fddtt|D  }j}|d krz|r^t	d|f  fddt
|jD }nB fdd}	 fdd}
 fd	d
}t||t||	|
|}|S )Nc                    s   g | ]}t  |qS r?   )r   r   i)r   r?   r@   r   U  s   z(Lower.fold_call_args.<locals>.<listcomp>z-unsupported keyword arguments when calling %sc                    s   g | ]\}}  ||qS r?   r,  r   r   ZsigtyrD   r?   r@   r   ^  s   c                    s     |j|  S rB   )r,  rX   )r    paramr   r>   r   r?   r@   normal_handlera  s    z,Lower.fold_call_args.<locals>.normal_handlerc                    s    j  jj|  |S rB   )r7   r  rF   rX   )r    r1  defaultr2  r?   r@   default_handlerd  s
      z-Lower.fold_call_args.<locals>.default_handlerc                    sD   j |  }t|tjst| fddt||D }t j|S )Nc                    s   g | ]\}}  ||qS r?   r/  r0  rD   r?   r@   r   k  s   zALower.fold_call_args.<locals>.stararg_handler.<locals>.<listcomp>)	rX   r   r	   	BaseTupler   r'  r   Zmake_anonymous_structrF   )r    r1  varsZ
stararg_tyr   r2  r?   r@   stararg_handlerh  s    

z-Lower.fold_call_args.<locals>.stararg_handler)r   r   r   r	   r6  r   ranger   pysigr   r'  rX   r   Zfold_argumentsdict)r>   fntyr   pos_argsr   Zkw_argsZ	tp_varargr:  r(  r3  r5  r8  r?   )r>   r   r   r@   fold_call_argsO  s4    


 zLower.fold_call_argsc                 C   s   | j j| }|jtjkst| jjt	}t
|j}t
|j}tt|D ]0}||jkrJ|j| }t|trJt|||< qJtj|jf| }|j|jd}| ||||ji }	| jt	|}
|
| j|	 dS )z$
        Lower a ir.Print()
        )r:  N)r$   r   r  r	   r   r   r7   r   r   rx   listrX   r9  r   Zconstsr   r   r   r   r   replacer:  r>  r   r   rF   )r>   r   r   r<  Zpos_tysr=  r.  r  Z	fixed_sigr(  r   r?   r?   r@   r   v  s    




zLower.lower_printc                 C   s"  | j j| }| d| t|jtjr4| j	 S | 
|jj}t|tjr^| |||}n~t|tjrz| |||}nbt|tjr| |||}nFt|tjr| |||}n*t|tjr| |||}n| |||}|d kr|jtjkr| j	 }ntd| jd| j| j||j|S )Nz# lower_call: expr = {0}z2non-void function returns None from implementation)rQ   r6   )r$   r   r   r   r   r  r	   ZPhantomr7   r   r   rL   r   ObjModeDispatcher_lower_call_ObjModeDispatcherZExternalFunction_lower_call_ExternalFunctionZExternalFunctionPointer#_lower_call_ExternalFunctionPointerZRecursiveCall_lower_call_RecursiveCallFunctionType_lower_call_FunctionType_lower_call_normalvoidr   r6   r   rF   )r>   r  r  r   r<  r  r?   r?   r@   
lower_call  s<    
  
zLower.lower_callc                    s  ddl m}     j }dd |jD } fdd|D } fdd|D }t||D ]\}	}
 |
|	 q\ fddt||D }| j||} j	||}t
 j|} j|\}}|6 |D ]} j| qԈ j|  j j W 5 Q R X |  j|jj|}|j} j| |D ]} j| q8t|jr`|   j|  j|j  j j W 5 Q R X |W  5 Q R  W  5 Q R  S Q R X W 5 Q R X d S )Nr   )ObjModeUtilsc                 S   s   g | ]
}|j qS r?   r   r  r?   r?   r@   r     s     z7Lower._lower_call_ObjModeDispatcher.<locals>.<listcomp>c                    s   g | ]}  |qS r?   )r   r  rD   r?   r@   r     s     c                    s   g | ]}  |qS r?   )r   r  rD   r?   r@   r     s     c                    s"   g | ]\}} j || jqS r?   )rE   from_native_valuerG   )r   ZatypavalrD   r?   r@   r     s   
)Znumba.core.pythonapirK  rH   rE   
gil_ensurerX   r'  r  Zload_dispatcherZcall_function_objargsr   is_nullrF   if_elsedecrefgil_releaserC   Z
return_excZto_native_value
dispatcherZoutput_typesr   callablecleanupif_thenZis_error)r>   r<  r  r   rK  	gil_staterT   rU   Z	argvaluesvr   ZargobjsZcalleeZret_objhas_exceptionthenorelseobjnativeoutputr?   rD   r@   rB    sF    

z#Lower._lower_call_ObjModeDispatcherc                 C   sb   |  d | |||j|j|j}t|j|jj	|jj}| j
| jj|}| j
| j||j|S )Nz# external function)r   r>  rX   r   kwsr   ZExternalFunctionDescriptorsymbolr   r  r7   Zdeclare_external_functionrF   r%   Zcall_external_functionrU   )r>   r<  r  r   r(  r$   rL   r?   r?   r@   rC    s.    
          z"Lower._lower_call_ExternalFunctionc                 C   s
  |  d | |||j|j|j}| |jj}|jr| 	  | j
 }g }g }t|jj|j|D ]R\}	}
}|	tjkr| |
| | j
|
|| j}|| || qb|| qb| j| j|||j}|D ]}| j
| q| j
| n| j| j|||j}|S )Nz## calling external function pointer)r   r>  rX   r   r`  r   rL   r   Zrequires_gilrH   rE   rO  r'  r   r	   Zffi_forced_objectr  rM  rG   r  r7   Zcall_function_pointerrF   cconvrR  rS  )r>   r<  r  r   r(  ZpointerrX  Z
newargvalsZpyvalsZexptypZgottyprN  r]  r  r?   r?   r@   rD    sV    
    

  
      z)Lower._lower_call_ExternalFunctionPointerc           
      C   s   |  |||j|j|j}||j}| jjp.t}| jj	}||j
|j||jd}| jjj|rv| j| j| j||}	n| j| j|||}	|	S )N)abi_tagsuid)r>  rX   r   r`  Zget_overloadsr7   manglerr   r$   rc  rS   rd  rF   rR   r   
startswithZcall_internalZcall_unresolved)
r>   r<  r  r   r(  Zrec_ovre  rc  Zmangled_namer  r?   r?   r@   rE  8  s8        
       zLower._lower_call_RecursiveCallc           	      C   s   |  d t|}||s8td| dt| |j}| |||j|j	|j
}| j||jj|d}| jj|||jd}|S )Nz## calling first-class function typez%mismatch of function types: expected z	 but got )r   )rb  )r   r	   r   Zcheck_signaturer   rF  ftyper>  rX   r   r`  _Lower__get_function_pointerrL   r   rF   r   rb  )	r>   r<  r  r   r   rg  r(  Zfunc_ptrr  r?   r?   r@   rG  M  s"    


    zLower._lower_call_FunctionTypeNc                 C   sv  ddl m} | j|}| |}| jj|dd| d}tj| j|d| d}| jj	t
| j|dd\}	}
|	 |   | j }| jj|dd	| d}|| j| j||d
d}| jjt
| j|dd  | jt| df| jd W 5 Q R X | j|}| j| j||| | j| | j| W 5 Q R X |
 | j| j||| W 5 Q R X W 5 Q R X | j|S )Nr   )lower_get_wrapper_addressz
addr_of_%srL  z
fptr_of_%sF)ZlikelyrI   zpyaddr_of_%signore)Zfailure_modez function address is null)re   r6   )Z numba.experimental.function_typeri  r7   get_value_typer   rF   r+  r   alloca_oncerQ  rP  rH   rE   rO  rW  ri   RuntimeErrorr6   Zlong_as_voidptrstoreZbitcastrR  rS  load)r>   rg  fnamer   ri  ZlltyZfstructaddrZfptrr[  r\  rX  ZpyaddrZaddr1Zaddr2r?   r?   r@   Z__get_function_pointer]  sZ    



     
,zLower.__get_function_pointerc                 C   s   |  d| |  d| t|tjr6|jj}n| |||j|j|j	}|j
}|d k	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	   rA  rL   rX   r>  r   r`  r   Znumba.core.target_extensionrr  ZtargetdescrZtarget_contextr   r7   Zrecvrr   r   r?  rF   r6   )r>   r<  r  r   r(  Ztnamerr  ZdispZhw_ctxr   Zthe_selfr  r?   r?   r@   rH    s.    
    zLower._lower_call_normalc           (   
      s  |j dkr ||jS |j dkr\|jj}|jrH ||jS  ||jS n|j dkr|j	j}|j	j}j
j|j}jj| }j
||}j
j|||jd }|j|g}	j
j|	|j }	|	S |j dkr
 |}	|	S |j dkrT|j	j}|j	j}
j
j||
}	 |	 |	S |j dkr|j	j}|j	j}
j
j||
}	 |	 |	S |j dkr&|j	j}|j	j}
jj| }j
|j |}|j\}j
j||
|}|j|f}	j
j|	|j }	|	S |j d	kr|j	j}|j	j}
t|
tjrxj
j||
|
j}|
j}
t|
tjr|
 k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_iterru  rv  r   getattrZstatic_getitemZtyped_getitemr&  Zbuild_tuplec                    s   g | ]}  |jqS r?   r   r   r-  rD   r?   r@   r   F  s     z$Lower.lower_expr.<locals>.<listcomp>c                    s   g | ]}  |jqS r?   r   r   r-  rD   r?   r@   r   G  s     c                    s&   g | ]\}}} j  j|||qS r?   r"  r   r   ZtotyfromtyrD   r?   r@   r   H  s   
build_listc                    s   g | ]}  |jqS r?   rx  r-  rD   r?   r@   r   O  s     c                    s   g | ]}  |jqS r?   ry  r-  rD   r?   r@   r   P  s     c                    s&   g | ]\}}} j  j|||qS r?   r"  rz  rD   r?   r@   r   R  s   c                    s&   g | ]\}}j j|| jqS r?   r7   r   rF   Zdtyper   r   r{  r  r>   r?   r@   r   [  s   	build_setr"   c                    s   g | ]}  |jqS r?   rx  r-  rD   r?   r@   r   c  s     c                    s   g | ]}  |jqS r?   ry  r-  rD   r?   r@   r   d  s     c                    s&   g | ]\}}j j|| jqS r?   r}  r~  r  r?   r@   r   e  s   	build_mapr   phizPHI not strippednull)Hr   r!  rO   r   r  r   ZmutableZimmutable_fnr   r   r7   r   r   r$   r   r   r   rF   rX   r  rJ  rs  r  rt  r   r	   r   r   r6  r   Ziterator_typer  Zget_constant_undefZPairr   r   r   r9  countr   Zif_unlikelynot_ri   r}   r6   Zinsert_valuerR  ZBoundFunctionthisZget_bound_functionZget_getattrr   Zresolve_getattrr   r  r    r   r   r*  r*   r'  Z
make_tupleZLiteralListTupler|  r  r  r  r?  r   Zget_constant_nullZspecial_ops)(r>   r  r  r   r   r  Zfunc_tyr   r   r  r   ZftyZcastvalZitemtytupZpairtyZgetiter_sigZgetiter_implZiternext_sigZiternext_implZiterobjr.  pairZis_validitemZcastedZattrtyZitemvalsZitemtysr)  r*   r4   r   Z	key_typesZvalue_typeskrY  r   ZkeytypeZvaltyper?   r  r@   r    s   


 
 

 
 


 










zLower.lower_exprc                 C   s8   || j krdS || jks| jr4| ||}|| j |< dS )zT
        Ensure the given variable has an allocated stack slot (if needed).
        N)r2   r   r   alloca)r>   r   r   ptrr?   r?   r@   r     s    

zLower._alloca_varc                 C   s,   | j s"|| jkst|| jks"t| j| S )z=
        Get a pointer to the given variable's slot.
        )r   r   r   r   r2   )r>   r   r?   r?   r@   getvar  s    zLower.getvarc              
   C   sn   || j kr| js| j | S | |}|| jjkr^t| j | j|W  5 Q R  S Q R X n| j|S dS )z2
        Load the given variable's value.
        N)	r   r   r  r+   	arg_namesr   r   rF   ro  )r>   r   r  r?   r?   r@   r     s    

 zLower.loadvarc              
   C   s  |  |}| || || jkr2| js2|| j|< n|dkrP| |}| || | |}|j|jj	k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sizerJ   	datamodelr   )r   r   r   r   r   r   rR  r  r   pointeer   r   r   r   rF   rn  r:   r7   rk  get_abi_sizeofdata_model_managermark_variablerJ   )r>   r   r   r   r   oldr  rQ   r6   r  sizeofr  r?   r?   r@   r     sB    



  zLower.storevarc                 C   s   |  |}|| jkr0| js0|| jkr0| j| | || || jkrd| jsd| j| }| || n6| |}| || j	| | j
t|jjd| dS )z,
        Delete the given variable.
        N)r   r   r   r   discardr   rR  r  rF   ro  rn  r   r   r  )r>   r   r   Zllvalr  r?   r?   r@   r     s    




zLower.delvarc                 C   s(   | j |}| j j| }| j|||dS )N)r  )r7   rk  r  alloca_lltype)r>   r   r   r  r  r?   r?   r@   r     s    zLower.allocac              	   C   s`   | d }tj| j||dd}|r\|| jjkr\| j|}| jj	| j||||| j
j|d |S )N$F)r   zfill)r   r  r  rJ   r  )rf  r   rl  rF   r+   r  r7   r  r   r  r6   rJ   )r>   r   r  r  Z
is_uservarZaptrr  r?   r?   r@   r    s    
  zLower.alloca_lltypec                 C   s$   | j jsd S | j j| j|| d S rB   )r7   r~   nrtr  rF   r>   r  r   r?   r?   r@   r    s    zLower.increfc              	   C   s<   | j jsd S t| j | j j| j|| W 5 Q R X d S rB   )r7   r~   r   r   rF   r  rR  r  r?   r?   r@   rR    s    zLower.decref)N)N)N)+r   r   r   r   rv   r=   r   r   r   r`   ra   r   r   r   r   r   r   r   r
  r!  r*  r,  r>  r   rJ  rB  rC  rD  rE  rG  rh  rH  r  r   r  r   r   r   r  r  r  rR  __classcell__r?   r?   r   r@   r   b  sP   

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