o
    7f~                     @  s  d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZ ddlmZmZmZmZmZ ddlmZ ddl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 m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZK dd
lLmMZM ddlNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZW dddZXd ddZYd!ddZZG dd de?d Z[dS )"z+Code generation for native function bodies.    )annotations)Final)frequently_executed_blocks)DEBUG_ERRORSEmitterTracebackAndGotoHandlerc_array_initializer)MODULE_PREFIXNATIVE_PREFIX
REG_PREFIXSTATIC_PREFIXTYPE_PREFIX)ClassIR)FUNC_CLASSMETHODFUNC_STATICMETHODFuncDeclFuncIR
all_values)1	ERR_FALSENAMESPACE_MODULENAMESPACE_STATICNAMESPACE_TYPEAssignAssignMulti
BasicBlockBoxBranchCallCallCCastComparisonOp	ControlOpDecRefExtendFloatFloatComparisonOpFloatNegFloatOpGetAttrGetElementPtrGotoIncRef
InitStaticIntegerIntOp	KeepAliveLoadAddressLoadErrorValue
LoadGlobalLoadLiteralLoadMem
LoadStatic
MethodCallOp	OpVisitorRaiseStandardErrorRegisterReturnSetAttrSetMemTruncateTupleGetTupleSetUnborrowUnboxUnreachableValue)generate_names_for_ir)	RArrayRStructRTupleRTypeis_int32_rprimitiveis_int64_rprimitiveis_int_rprimitiveis_pointer_rprimitive	is_taggedfnr   emitterr   returnstrc                   s:   d  fdd| jD pd} | j}| d| dS )N, c                 3  s    | ]	}  |jV  qd S N)ctypetype.0argrP    O/home/ertert/spirit/venv/lib/python3.10/site-packages/mypyc/codegen/emitfunc.py	<genexpr>N   s    z'native_function_type.<locals>.<genexpr>voidz (*)())joinargsrU   ret_type)rO   rP   ra   retr[   rZ   r\   native_function_typeM   s   rd   r   c                 C  s\   g }| j jD ]}|||j t |j  qdj|| j j|	| d
|p+ddS )Nz{ret_type}{name}({args})rS   r^   )rb   namera   )sigra   appendctype_spacedrV   r   re   formatrb   native_function_namer`   )rO   rP   ra   rY   r[   r[   r\   native_function_headerS   s   "rk   source_pathmodule_nameNonec              	   C  s(  t |j}t| j| j}t |j|}t||||}|t| j| d |	  t
| j| jD ]1}t|jtr>||j t|jtrEq0|| jv rKq0||j}	d}
|dj|	t|| |
d q0| j}t|D ]\}}||_qi| jD ]6}|j}t|tsJ | D ]%}|j|jd k}t|totdd | D }|r|rd| j|j _qqtt| jd	 }tt|D ]J}|| }||v|_d }|d t|k r||d  }| | ||_!|j"}||_"d	|_#|j#t|k r||j# $| | j#d7  _#|j#t|k sq|d
 |%| |%| d S )Nz { z{ctype}{prefix}{name}{init};)rU   prefixre   init   c                 s  s    | ]}t |tV  qd S rT   )
isinstancer(   rX   sr[   r[   r\   r]      s    

z+generate_native_function.<locals>.<genexpr>Tr   })&r   contextrE   arg_regsblocksFunctionEmitterVisitor	emit_linerk   declindentr   rs   rV   rH   declare_tuple_structrF   rh   ri   r   	enumeratelabel
terminatorr!   targetsr   anysources
referencedr   rangelenrare
emit_label
next_blockopsop_indexacceptemit_from_emitter)rO   rP   rl   rm   declarationsnamesbodyvisitorrrU   rq   ry   iblockr   targetis_next_blockis_problematic_opcommonr   r   r[   r[   r\   generate_native_function_   sn   






r   c                   @  s\  e Zd ZU dd	d
ZdddZdddZdddZdddZdddZdddZ	dddZ
dd!d"Zdd$d%Zdd*d+Zdd-d.Zdd0d1Zdd3d4ZeeeeeeiZd5ed6< dd8d9Zdd;d<Zdd>d?ZddBdCZddEdFZddHdIZddKdLZddNdOZ ddQdRZ!ddTdUZ"ddWdXZ#ddZd[Z$dd]d^Z%dd`daZ&ddcddZ'ddfdgZ(ddidjZ)ddldmZ*ddodpZ+ddrdsZ,ddudvZ-ddxdyZ.dd{d|Z/dd~dZ0dddZ1dddZ2dddZ3dddZ4dddZ5dddZ6dddZ7dddZ8dddZ9dddddZ:dddZ;dddZ<dddZ=dddZ>dddZ?dddZ@dddZAdddZBdS )rz   rP   r   r   rl   rR   rm   rQ   rn   c                 C  sF   || _ |j| _|| _|| _|| _|jj| _d| _d | _g | _	d| _
d S )NFr   )rP   r   r   rl   rm   rw   literalsr   r   r   r   )selfrP   r   rl   rm   r[   r[   r\   __init__   s   

zFunctionEmitterVisitor.__init__c                 C  s
   | j  S rT   )rP   	temp_namer   r[   r[   r\   r      s   
z FunctionEmitterVisitor.temp_nameopr*   c                 C  s*   |j | jur| d|  |j   d S d S )Ngoto %s;)r   r   r{   r   r   r[   r[   r\   
visit_goto   s   z!FunctionEmitterVisitor.visit_gotor   c                 C  s  |j |j}}|j}d}|| ju r |jd u r ||}}| }d}|r$dnd}d}|jtjkr;| |j	}| | }n:|jtj
krq|j	j}	|rIdnd}
t|	tr_| j|	| |j	| j|
}n| |j	 d|
 d| |	 }nJ d|jd us}|jr|sd	| d
}nd| d
}|| ju r|jd u r|| jur| d| d| | d d S d S | d| d | | | d| | d d S | d| d | | || jur| d| |  | dd| |  d S )NFT!ro   !=== zInvalid branchz	unlikely(r_   zlikely(zif (z) goto ;z) {r   rv   z} elsez    goto %s;)truefalsenegatedr   traceback_entryr   r   BOOLregvalueIS_ERRORrV   rs   rH   rP   tuple_undefined_check_condc_error_valuer   r{   r   emit_traceback
emit_lines)r   r   r   r   r   negated_rarenegcondexpr_resulttypcomparer[   r[   r\   visit_branch   sL   

$


"


z#FunctionEmitterVisitor.visit_branchr;   c                 C  s   |  |j}| d|  d S )Nz
return %s;)r   r   r{   )r   r   	value_strr[   r[   r\   visit_return   s   z#FunctionEmitterVisitor.visit_returnr@   c              
   C  sx   |  |}|j}| j| t|jdkr| | d d S t|jD ]\}}| | d| d|  | d q$d S )Nr   z.empty_struct_error_flag = 0;.f = r   )r   
tuple_typerP   r~   r   itemsr{   r   )r   r   destr   r   itemr[   r[   r\   visit_tuple_set   s   
$z&FunctionEmitterVisitor.visit_tuple_setr   c                 C  s\   |  |j}|  |j}||kr,|jjjr|jjjsd| }| | d| d d S d S )Nz(void *)r   r   )r   r   srcrV   
is_unboxedr{   r   r   r   r   r[   r[   r\   visit_assign	  s   
z#FunctionEmitterVisitor.visit_assignr   c              
     sd   |j j}t|tsJ  |j } d j|j|t	|j
t fdd|j
D ddf  d S )Nz%s%s[%d] = %s;c                      g | ]}  |qS r[   r   rt   r   r[   r\   
<listcomp>!      z=FunctionEmitterVisitor.visit_assign_multi.<locals>.<listcomp>T)indented)r   rV   rs   rF   r   r{   rP   rh   	item_typer   r   r   )r   r   r   r   r[   r   r\   visit_assign_multi  s   z)FunctionEmitterVisitor.visit_assign_multir1   c              	     s   t |jtr6 fdd|jjD }  } d |j|d|   	| d| d d S   	| d 
|j d d S )Nc                   r   r[   )c_undefined_value)rX   r   r   r[   r\   r   '  r   zAFunctionEmitterVisitor.visit_load_error_value.<locals>.<listcomp>z{} {} = {{ {} }};rS   r   r   )rs   rV   rH   typesr   r{   ri   rU   r`   r   r   )r   r   valuestmpr[   r   r\   visit_load_error_value%  s   " (z-FunctionEmitterVisitor.visit_load_error_valuer3   c                 C  s\   | j |j}t|js| jd| ||f |jd d S | jd| ||f |jd d S )Nz%s = CPyStatics[%d];annz#%s = (CPyTagged)CPyStatics[%d] | 1;)r   literal_indexr   rL   rV   r{   r   )r   r   indexr[   r[   r\   visit_load_literal.  s   
"
z)FunctionEmitterVisitor.visit_load_literalobjGetAttr | SetAttrdecl_clr   c                 C  s  d|j | jj d}|jr_|j jjr_t|j|j	}| j
 }| jd| d | jd|d| j|d| | d| d| |j |j	 d}d| d	| d
| dS |j jjrt|jriJ d|| jj d}d| | d| j	|j	 S )a  Generate attribute accessor for normal (non-property) access.

        This either has a form like obj->attr_name for attributes defined in non-trait
        classes, and *(obj + attr_offset) for attributes defined by traits. We also
        insert all necessary C casts here.
        ( *)zsize_t r   z{} = {};zCPy_FindAttrOffset({}, {}, {})z	)->vtable*z	((char *)z + r_   z)->)
class_typestruct_namerP   r   is_traitclass_irlist
attributesr   attrr   r   r{   ri   type_struct_namerU   	attr_type)r   r   r   r   casttrait_attr_indexoffset	attr_castr[   r[   r\   get_attr_expr7  s*   




z$FunctionEmitterVisitor.get_attr_exprr(   c                 C  s  |  |}|  |j}|j}|j}||j\}}|jo|j}|j|j|drT|jr,dnd}	| 	d||	|| j
|j||j|| j| ||j|jf  d S | |||}
| j
	| d|
 d ||j}d }|s| j
j||d||j|dd	 |  }|d ur|j|u r|jtjkr|jd ur|js| ||j|j | 	d
| |j  |}| j
	d |sd}| j
	d|t |jt |j |j!r|j"s|s|s| j
	d | j
#|| |r|j$| j%ur| 	d
| |j$  |  j&d7  _&d S |s	| j
	d d S d S )N)prefer_method_TRAITro   z1%s = CPY_GET_ATTR%s(%s, %s, %d, %s, %s); /* %s */r   r   r   T)unlikelyr   rv   PyExc_AttributeErrorz4PyErr_SetString({}, "attribute {} of {} undefined");z} else {rr   )'r   r   r   r   attr_detailsr   r   error_overlap
get_methodr{   rP   r   getter_indexr   r   rU   r   r   is_always_definedemit_undefined_attr_checknext_branchr   r   r   r   r   r   emit_attribute_errorre   r   r   ri   repris_refcountedis_borrowedemit_inc_refr   r   r   )r   r   r   r   rtypecl
attr_rtyper   r   version	attr_expralways_definedmerged_branchbranch	exc_classr[   r[   r\   visit_get_attr[  st   




z%FunctionEmitterVisitor.visit_get_attrBranch | Nonec                 C  s6   | j d t| jk r| j| j d  }t|tr|S d S )Nrr   )r   r   r   rs   r   )r   next_opr[   r[   r\   r     s
   
z"FunctionEmitterVisitor.next_branchr<   c                 C  s  |j tkr
| |}| |j}| |j}|j}|j}||j\}}|	|jrm|j
s2|j tks?J d|j|j
|j |f |jrDdnd}	| d||	|| j|j||j||| j| ||j|jf	  d S | |||}
|j
s|jr||j}|s| j||
d||j| | j|
| |s| jd n|jr||js| j|||||j | j|
 d| d |j tkr| j| d	 d S d S )
Nz%s %d %d %sr   ro   z5%s = CPY_SET_ATTR%s(%s, %s, %d, %s, %s, %s); /* %s */r   rv   r   r   z = 1;)
error_kindr   r   r   r   r   r   r   r   r   is_initr   r{   rP   r   setter_indexr   r   rU   r   r   r   r   r   emit_dec_refr   emit_attr_bitmap_set)r   r   r   r   r   r   r   r   r   r  r  r  r[   r[   r\   visit_set_attr  s\   




z%FunctionEmitterVisitor.visit_set_attrr   
PREFIX_MAPr5   c                 C  s\   |  |}| j|j }| j|j|j|}|jtkrd| }| j| d| d|j	d d S )Nz(PyObject *)%sr   r   r   )
r   r  	namespacerP   static_name
identifierrm   r   r{   r   )r   r   r   rp   re   r[   r[   r\   visit_load_static  s   

 z(FunctionEmitterVisitor.visit_load_staticr,   c                 C  sh   |  |j}| j|j }| j|j|j|}|jtkrd| }| 	| d| d | 
||jj d S )Nz(PyTypeObject *)%sr   r   )r   r   r  r  rP   r  r  rm   r   r{   r   rV   )r   r   r   rp   re   r[   r[   r\   visit_init_static  s   
z(FunctionEmitterVisitor.visit_init_staticr?   c                 C  sP   |  |}|  |j}| | d| d|j d |js&| ||j d S d S )Nr   r   r   )r   r   r{   r   r   r   rV   r   r[   r[   r\   visit_tuple_get  s   
z&FunctionEmitterVisitor.visit_tuple_getr   rD   c                 C  s   |j s
| |d S dS )Nr   ro   )is_voidr   )r   r   r[   r[   r\   get_dest_assign  s   z&FunctionEmitterVisitor.get_dest_assignr   c              	     sf     |}d fdd|jD } j|j}|j j} | | t	 | d| d dS )zCall native function.rS   c                 3      | ]}  |V  qd S rT   r   rW   r   r[   r\   r]         z4FunctionEmitterVisitor.visit_call.<locals>.<genexpr>r   );N)
r  r`   ra   rP   get_group_prefixrO   cnamer   r{   r
   )r   r   r   ra   libr  r[   r   r\   
visit_call  s
   
&z!FunctionEmitterVisitor.visit_callr6   c                   s6    |} |j}|j}|j}|j}|j|}|dus J ||}|jj	t
kr-g n|jj	tkr:d| dgn|g}	d|	 fdd|jD  }
t| j}|jjrXdnd}|rz j|j} | | t | j d	|
 d
 dS ||} d||| j|j|| j||
|j	 dS )zCall native method.Nz(PyObject *)Py_TYPE(r_   rS   c                   r   r[   r   rW   r   r[   r\   r     r   z<FunctionEmitterVisitor.visit_method_call.<locals>.<listcomp>r   ro   r   r  z4{}CPY_GET_METHOD{}({}, {}, {}, {}, {})({}); /* {} */)r  r   r   receiver_typer   methodr   is_method_finalr|   kindr   r   r`   ra   rd   rP   r   r  r{   r
   r  r   method_indexri   r   r   )r   r   r   r   r   r   re   r!  	is_directobj_argsra   mtyper  r  
method_idxr[   r   r\   visit_method_call  s@   

.

z(FunctionEmitterVisitor.visit_method_callr+   c                 C  s    |  |j}| ||jj d S rT   )r   r   r   rV   r   r   r   r[   r[   r\   visit_inc_ref4  s   z$FunctionEmitterVisitor.visit_inc_refr"   c                 C  s&   |  |j}| j||jj|jd d S )N)is_xdec)r   r   r  rV   r,  r*  r[   r[   r\   visit_dec_ref8  s   z$FunctionEmitterVisitor.visit_dec_refr   c                 C  s*   | j j| |j| ||jjdd d S )NT)
can_borrow)rP   emit_boxr   r   rV   r   r[   r[   r\   	visit_box<  s   *z FunctionEmitterVisitor.visit_boxr   c                 C  s   |   }d }|d ur8|j|u r8|jtjkr8|jd ur8|js8|j| ju r8t	| 
|j| j| j|j}|  jd7  _| jj| |j| ||j|jj|d d S )Nrr   )src_typeerror)r   r   r   r   r   r   r   r   r   r   r   r   rl   rm   r   rP   	emit_castr   r   rV   )r   r   r  handlerr[   r[   r\   
visit_cast?  s&   



z!FunctionEmitterVisitor.visit_castrB   c                 C  s$   | j | |j| ||j d S rT   )rP   
emit_unboxr   r   rV   r   r[   r[   r\   visit_unboxX  s   $z"FunctionEmitterVisitor.visit_unboxrC   c                 C  s   | j d d S )NzCPy_Unreachable();rP   r{   r   r[   r[   r\   visit_unreachable[     z(FunctionEmitterVisitor.visit_unreachabler9   c                 C  s   |j d ur<t|j tr!|j dd}| jd|j d| d n&t|j tr8| jd|j| j	|j  nJ d| jd	|j d
 | j| 	| d d S )N"z\"zPyErr_SetString(PyExc_z, "z");zPyErr_SetObject(PyExc_{}, {});Fz)op value type must be either str or ValuezPyErr_SetNone(PyExc_r  z = 0;)
r   rs   rR   replacerP   r{   
class_namerD   ri   r   )r   r   messager[   r[   r\   visit_raise_standard_error^  s   
z1FunctionEmitterVisitor.visit_raise_standard_errorr   c                   sR   |j rd}n |}d fdd|jD } j| |j d| d d S )Nro   rS   c                 3  r  rT   r   rW   r   r[   r\   r]   u  r  z6FunctionEmitterVisitor.visit_call_c.<locals>.<genexpr>r   r  )r  r  r`   ra   rP   r{   function_name)r   r   r   ra   r[   r   r\   visit_call_cp  s
   
"z#FunctionEmitterVisitor.visit_call_cr>   c                 C  0   |  |}|  |j}| | d| d d S Nr   r   r   r   r{   )r   r   r   r   r[   r[   r\   visit_truncatex  s   
z%FunctionEmitterVisitor.visit_truncater#   c                 C  sX   |  |}|  |j}|jr| |jj}n| |jj}| | d| | d d S rC  )r   r   signedemit_signed_int_castrV   emit_unsigned_int_castr{   )r   r   r   r   src_castr[   r[   r\   visit_extend~  s   
z#FunctionEmitterVisitor.visit_extendr2   c                 C  s,   |  |}| j| d|j d|jd d S )Nr   r   r   )r   r{   r  r   )r   r   r   r[   r[   r\   visit_load_global  s   
"z(FunctionEmitterVisitor.visit_load_globalr.   c              
   C  s   |  |}|  |j}|  |j}|jtjkr)| |jj| }| |jj| }| | d| d|j	|j  d| d d S Nr   r   r   )
r   lhsrhsr   r.   RIGHT_SHIFTrG  rV   r{   op_strr   r   r   rM  rN  r[   r[   r\   visit_int_op  s   
.z#FunctionEmitterVisitor.visit_int_opr    c                 C  s  |  |}|  |j}|  |j}d}d}|jtjtjtjtjfv r1| 	|jj
}| 	|jj
}nC|jtjtjtjtjfv rM| |jj
}| |jj
}n't|jtra|jjdk ra| 	|jj
}nt|jtrt|jjdk rt| 	|jj
}| | d| | d|j|j  d| | d
 d S )Nro   r   r   r   r   )r   rM  rN  r   r    SLTSGTSLESGErG  rV   ULTUGTULEUGErH  rs   r-   r   r{   rP  )r   r   r   rM  rN  lhs_castrhs_castr[   r[   r\   visit_comparison_op  s    
6z*FunctionEmitterVisitor.visit_comparison_opr'   c              
   C  s|   |  |}|  |j}|  |j}|jtjkr.| | d| d|j|j  d| d d S | | d| d| d d S )Nr   r   r   z = fmod(rS   r  )r   rM  rN  r   r'   MODr{   rP  rQ  r[   r[   r\   visit_float_op  s   
. z%FunctionEmitterVisitor.visit_float_opr&   c                 C  rB  )Nz = -r   rD  r   r[   r[   r\   visit_float_neg  s   
z&FunctionEmitterVisitor.visit_float_negr%   c              
   C  sP   |  |}|  |j}|  |j}| | d| d|j|j  d| d d S rL  )r   rM  rN  r{   rP  r   rQ  r[   r[   r\   visit_float_comparison_op  s   
.z0FunctionEmitterVisitor.visit_float_comparison_opr4   c                 C  sB   |  |}|  |j}| |j}| | d| d| d d S )Nz = *(r   r   )r   r   rU   rV   r{   )r   r   r   r   rV   r[   r[   r\   visit_load_mem  s   
 z%FunctionEmitterVisitor.visit_load_memr=   c              	   C  sR   |  |j}|  |j}| |j}||kr'| d| d| d| d d S d S )Nz*(r   r   r   )r   r   r   rU   	dest_typer{   )r   r   r   r   rc  r[   r[   r\   visit_set_mem  s   "z$FunctionEmitterVisitor.visit_set_memr)   c              	   C  sb   |  |}|  |j}t|jtsJ |j|jjv sJ d| d||j	j
|jj||j d S )NzInvalid field name.z{} = ({})&(({} *){})->{};)r   r   rs   r1  rG   fieldr   r{   ri   rV   _ctypere   r   r[   r[   r\   visit_get_element_ptr  s   
z,FunctionEmitterVisitor.visit_get_element_ptrr0   c                 C  s   |j }| |}t|jtr| |j}nt|jtr/| j|jj }| j	|jj
|jj|}n|j}| | d|j d| d d S )Nz = (z)&r   )rV   r   rs   r   r:   r5   r  r  rP   r  r  rm   r{   rf  )r   r   r   r   r   rp   r[   r[   r\   visit_load_address  s   
"z)FunctionEmitterVisitor.visit_load_addressr/   c                 C  s   d S rT   r[   r   r[   r[   r\   visit_keep_alive  s   z'FunctionEmitterVisitor.visit_keep_aliverA   c                 C  rB  rC  rD  r   r[   r[   r\   visit_unborrow  s   
z%FunctionEmitterVisitor.visit_unborrowr   r   c                 C     | j |S rT   )rP   r   )r   r   r[   r[   r\   r        zFunctionEmitterVisitor.labelr   c                 C  s   t |tr=|j}|dkrt|jrdS t|}|dkr+|dkr%|d7 }|S |d7 }|S |dkr3d}|S |d	kr;|d7 }|S t |tr[t|j}|d
krMdS |dkrSdS |dkrYdS |S | j	|S )Nr   NULLl        l            ULLLLl         z(-9223372036854775807LL - 1)i   infINFINITYz-infz	-INFINITYnanNAN)
rs   r-   r   rM   rV   rR   r$   r   rP   r   )r   r   valru   r   r[   r[   r\   r     s6   


zFunctionEmitterVisitor.regr   rI   c                 C  rk  rT   )rP   rU   r   r   r[   r[   r\   rU     rl  zFunctionEmitterVisitor.ctypec                 C  rk  rT   )rP   r   ru  r[   r[   r\   r     rl  z$FunctionEmitterVisitor.c_error_valuec                 C  rk  rT   )rP   r   ru  r[   r[   r\   r     rl  z(FunctionEmitterVisitor.c_undefined_valueNr   liner   objectc                C  s   | j j||d d S )Nr   r8  )r   rv  r   r[   r[   r\   r{     s   z FunctionEmitterVisitor.emit_linelinesc                 G  s   | j j|  d S rT   )rP   r   )r   rx  r[   r[   r\   r   !  r:  z!FunctionEmitterVisitor.emit_linesc                 C  s   | j j||| jd d S )N)r   )rP   r   r   )r   r   r   r[   r[   r\   r   $  s   z#FunctionEmitterVisitor.emit_inc_refr,  boolc                 C  s   | j j|||| jd d S )N)r,  r   )rP   r  r   )r   r   r   r,  r[   r[   r\   r  '  s   z#FunctionEmitterVisitor.emit_dec_refc                 C  s   | j | d S rT   )r   r{   )r   rv  r[   r[   r\   emit_declaration*  r:  z'FunctionEmitterVisitor.emit_declarationc                 C  s(   |j d ur| j| j| j|j  d S d S rT   )r   rP   r   rl   rm   r   r[   r[   r\   r   -  s   
z%FunctionEmitterVisitor.emit_tracebackr=  r   c              	   C  sd   |j d usJ | jd| j}| d| jdd|j d |||j d |f  tr0| d d S d S )Nglobalsz3CPy_AttributeError("%s", "%s", "%s", "%s", %d, %s);\z\\r   rr   z7assert(PyErr_Occurred() != NULL && "failure w/o err!");)r   rP   r  rm   r{   rl   r<  r   )r   r   r=  r   globals_staticr[   r[   r\   r   1  s    z+FunctionEmitterVisitor.emit_attribute_errorrV   c                 C  s   t |rdS dS )Nz(Py_ssize_t)ro   )rN   r   rV   r[   r[   r\   rG  B  s   z+FunctionEmitterVisitor.emit_signed_int_castc                 C  s   t |rdS t|rdS dS )Nz
(uint32_t)z
(uint64_t)ro   )rJ   rK   r~  r[   r[   r\   rH  H  s
   z-FunctionEmitterVisitor.emit_unsigned_int_cast)
rP   r   r   r   rl   rR   rm   rR   rQ   rn   )rQ   rR   )r   r*   rQ   rn   )r   r   rQ   rn   )r   r;   rQ   rn   )r   r@   rQ   rn   )r   r   rQ   rn   )r   r   rQ   rn   )r   r1   rQ   rn   )r   r3   rQ   rn   )r   rR   r   r   r   r   rQ   rR   )r   r(   rQ   rn   )rQ   r  )r   r<   rQ   rn   )r   r5   rQ   rn   )r   r,   rQ   rn   )r   r?   rQ   rn   )r   rD   rQ   rR   )r   r   rQ   rn   )r   r6   rQ   rn   )r   r+   rQ   rn   )r   r"   rQ   rn   )r   r   rQ   rn   )r   r   rQ   rn   )r   rB   rQ   rn   )r   rC   rQ   rn   )r   r9   rQ   rn   )r   r   rQ   rn   )r   r>   rQ   rn   )r   r#   rQ   rn   )r   r2   rQ   rn   )r   r.   rQ   rn   )r   r    rQ   rn   )r   r'   rQ   rn   )r   r&   rQ   rn   )r   r%   rQ   rn   )r   r4   rQ   rn   )r   r=   rQ   rn   )r   r)   rQ   rn   )r   r0   rQ   rn   )r   r/   rQ   rn   )r   rA   rQ   rn   )r   r   rQ   rR   )r   rD   rQ   rR   )r   rI   rQ   rR   )rv  rR   r   rw  rQ   rn   )rx  rR   rQ   rn   )r   rR   r   rI   rQ   rn   )r   rR   r   rI   r,  ry  rQ   rn   )rv  rR   rQ   rn   )r   r   r=  rR   r   rR   rQ   rn   )rV   rI   rQ   rR   )C__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   r  r   r  r   r   r   r   r   r	   r  __annotations__r  r  r  r  r  r)  r+  r-  r0  r5  r7  r9  r?  rA  rE  rJ  rK  rR  r]  r_  r`  ra  rb  rd  rg  rh  ri  rj  r   r   rU   r   r   r{   r   r   r  rz  r   r   rG  rH  r[   r[   r[   r\   rz      sz   
 




4





	
	
$
B
8


	



-









	









	














rz   N)rO   r   rP   r   rQ   rR   )rO   r   rP   r   rQ   rR   )
rO   r   rP   r   rl   rR   rm   rR   rQ   rn   )\__doc__
__future__r   typingr   mypyc.analysis.blockfreqr   mypyc.codegen.emitr   r   r   r   mypyc.commonr	   r
   r   r   r   mypyc.ir.class_irr   mypyc.ir.func_irr   r   r   r   r   mypyc.ir.opsr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   mypyc.ir.pprintrE   mypyc.ir.rtypesrF   rG   rH   rI   rJ   rK   rL   rM   rN   rd   rk   r   rz   r[   r[   r[   r\   <module>   s    3,


O