
    i@                       U 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mZ ddl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@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN dd
lOmPZP ddlQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^ d!dZ_d"dZ`d#dZa G d de?d                   Zbi Zcdedd<   d$d ZedS )%z+Code generation for native function bodies.    )annotations)Final)frequently_executed_blocks)DEBUG_ERRORS
PREFIX_MAPEmitterTracebackAndGotoHandlerc_array_initializer)GENERATOR_ATTRIBUTE_PREFIXHAVE_IMMORTALNATIVE_PREFIX
REG_PREFIX)ClassIR)FUNC_CLASSMETHODFUNC_STATICMETHODFuncDeclFuncIR
all_values)4	ERR_FALSENAMESPACE_TYPEAssignAssignMulti
BasicBlockBoxBranchCallCallCCastComparisonOp	ControlOpCStringDecRefExtendFloatFloatComparisonOpFloatNegFloatOpGetAttr
GetElementGetElementPtrGotoIncRef
InitStaticIntegerIntOp	KeepAliveLoadAddressLoadErrorValue
LoadGlobalLoadLiteralLoadMem
LoadStatic
MethodCallOp	OpVisitorPrimitiveOpRaiseStandardErrorRegisterReturnSetAttr
SetElementSetMemTruncateTupleGetTupleSetUnborrowUnboxUndefUnreachableValue)generate_names_for_ir)RArray	RInstanceRStructRTupleRTypeRVecis_bool_or_bit_rprimitiveis_int32_rprimitiveis_int64_rprimitiveis_int_rprimitiveis_none_rprimitiveis_pointer_rprimitive	is_taggedfnr   emitterr   returnstrc                    d                     fd| j        D                       pd}                    | j                  }| d| dS )N, c              3  L   K   | ]}                     |j                  V  d S N)ctypetype).0argrX   s     U/root/projects/qq-shell/venv/lib64/python3.11/site-packages/mypyc/codegen/emitfunc.py	<genexpr>z'native_function_type.<locals>.<genexpr>[   s1      @@W]]38,,@@@@@@    voidz (*)())joinargsr_   ret_type)rW   rX   ri   rets    `  rc   native_function_typerl   Z   sZ    99@@@@@@@@@JFD
--
$
$Cre   r   c                X   g }| j         j        D ]?}|                    |                    |j                   t
           |j                    @d                    |                    | j         j                  |	                    |           d
                    |          pd          S )Nz{ret_type}{name}({args})r\   rf   )rj   nameri   )sigri   appendctype_spacedr`   r   rn   formatrj   native_function_namerh   )rW   rX   ri   rb   s       rc   native_function_headerrt   `   s    Dv{ O Ow++CH55MzM38MMNNNN%,,%%bfo66))"--YYt__& -   re   source_pathmodule_nameNonec           	        t          |j                  }t          | j        | j                  }t          |j        |          }t          ||||          }|                    t          | j        |           d           |	                                 t          | j        | j                  D ]}t          |j        t                    r|                    |j                   t          |j        t                    rQ|| j        v r[|                    |j                  }	d}
|                    d                    |	t$          ||         |
                     | j        }t'          |          D ]\  }}||_        | j        D ]}|j        }t          |t,                    s
J |            |                                D ]p}|j        |j        dz   k    }t          |t0                    o*t3          d |                                D                       }|r|rd| j        |j                 _        qt9          | j        d                   }t;          t=          |                    D ]}||         }||v|_        d }|dz   t=          |          k     r||dz            }|                     |           ||_!        |j"        }||_"        d|_#        |j#        t=          |          k     rH||j#                 $                    |           |xj#        dz  c_#        |j#        t=          |          k     H|                    d	           |%                    |           |%                    |           d S )
Nz { z{ctype}{prefix}{name}{init};)r_   prefixrn   init   c              3  @   K   | ]}t          |t                    V  d S r^   )
isinstancer(   )ra   ss     rc   rd   z+generate_native_function.<locals>.<genexpr>   sE       G G+,
1g&&G G G G G Gre   Tr   })&r   contextrI   arg_regsblocksFunctionEmitterVisitor	emit_linert   declindentr   r~   r`   rM   declare_tuple_structrJ   rq   rr   r   	enumeratelabel
terminatorr    targetsr   anysources
referencedr   rangelenrare
emit_label
next_blockopsop_indexacceptemit_from_emitter)rW   rX   ru   rv   declarationsnamesbodyvisitorrr_   r{   r   iblockr   targetis_next_blockis_problematic_opcommonr   r   s                        rc   generate_native_functionr   l   s    7?++L!"+ry99E7?E**D$T<kRRG4RWgFFKKKLLLKKMMMRY// 
 
aff%% 	1((000aff%% 	$$QV,,*11JU1XD 2  	
 	
 	
 	
 YFf%%  5
  : :%
*i00<<*<<< ((** 	: 	:F"LEK!O;M !+:v > > !3 G G0:0B0B0D0DG G G D D ! :$5 :59	&,'2	: (	!55F3v;; " "q	F*
q53v;;AJ'iS)) !((111! S)) 	NN3l+++d#####re   c                     e Zd Zdd	Zdd
ZddZddZddZddZddZ	ddZ
ddZddZddZdd$Zdd&Zdd'Zdd)Zdd+Zdd-Zdd/Zdd1Zdd3Zdd5Zdd7Zdd<Zdd>Zdd@ZddBZddDZddFZddHZddJZ ddLZ!ddNZ"ddPZ#ddRZ$ddTZ%ddVZ&ddXZ'ddZZ(dd\Z)dd^Z*dd`Z+ddbZ,dddZ-ddfZ.ddhZ/ddjZ0ddlZ1ddnZ2ddqZ3ddsZ4ddvZ5ddwZ6ddxZ7dydzdd~Z8ddZ9ddZ:ddZ;ddZ<ddZ=ddZ>ddZ?ddZ@dyS )r   rX   r   r   ru   rZ   rv   rY   rw   c                    || _         |j        | _        || _        || _        || _        |j        j        | _        d| _        d | _        g | _	        d| _
        d S )NFr   )rX   r   r   ru   rv   r   literalsr   r   r   r   )selfrX   r   ru   rv   s        rc   __init__zFunctionEmitterVisitor.__init__   sX     ]
(&&0	-1re   c                4    | j                                         S r^   )rX   	temp_name)r   s    rc   r   z FunctionEmitterVisitor.temp_name   s    |%%'''re   opr+   c                    |j         | j        ur2|                     d|                      |j                   z             d S d S )Ngoto %s;)r   r   r   r   r   s     rc   
visit_gotoz!FunctionEmitterVisitor.visit_goto   sD    84?**NN:

28(<(<<===== +*re   valuerH   comparec                x   |j         }t          |t                    r5| j                            ||                     |          | j        |          S t          |t                    r%|dk    rdnd}|                     |           d| dS |                     |           d| d|                     |           S )N!=z>=<z.len z 0 )r`   r~   rM   rX   tuple_undefined_check_condregc_error_valuerO   )r   r   r   typvec_compares        rc   error_value_checkz(FunctionEmitterVisitor.error_value_check   s    jc6"" 
	L<::TXXe__d&8'   T"" 	L")T//$$sKhhuoo;;K;;;;hhuooKKKK$2D2DS2I2IKKKre   r   c                
   |j         |j        }}|j        }d}|| j        u r|j        	||}}| }d}|rdnd}d}|j        t          j        k    r!|                     |j	                  }| | }nA|j        t          j
        k    r"|rdnd}	|                     |j	        |	          }n
J d            |j        |j        r|sd| d	}nd
| d	}|| j        u r|j        <|| j        ur1|                     d| d|                     |           d           d S d S |                     d| d           |                     |           |                     d|                     |          z  d           d S |                     d| d           |                     |           || j        ur+|                     d|                     |          z             |                     dd|                     |          z             d S )NFT!ry   r   ==zInvalid branchz	unlikely(rg   zlikely(if (z) goto ;) {r   r   z} elsez    goto %s;)truefalsenegatedr   traceback_entryr   r   BOOLr   r   IS_ERRORr   r   r   r   emit_traceback
emit_lines)
r   r   r   r   r   negated_rarenegcondexpr_resultr   s
             rc   visit_branchz#FunctionEmitterVisitor.visit_branch   s\   grxe*4?""r'9'A%D!kGL$cc"5FK((28,,K(;((DDUfo%%%/dd4G))"(G<<DD***** )RW) )*4***((((DO##!)t..NN#J$#J#Jtzz$7G7G#J#J#JKKKKK /. 0d000111##B'''
TZZ-=-= =sCCCCCNN,$,,,---###4?**zDJJt,<,<<===OOHntzz%7H7H&HIIIIIre   r=   c                j    |                      |j                  }|                     d|z             d S )Nz
return %s;)r   r   r   )r   r   	value_strs      rc   visit_returnz#FunctionEmitterVisitor.visit_return  s2    HHRX&&	|i/00000re   rC   c           
     l   |                      |          }|j        }| j                            |           t	          |j                  dk    r|                     | d           d S t          |j                  D ]6\  }}|                     | d| d|                      |           d           7d S )Nr   z.empty_struct_error_flag = 0;.f = r   )r   
tuple_typerX   r   r   itemsr   r   )r   r   destr   r   items         rc   visit_tuple_setz&FunctionEmitterVisitor.visit_tuple_set  s    xx||]
))*555rx==ANNdAAABBBBB$RX.. C C4$AA!AAAAABBBBC Cre   r   c                h   |                      |j                  }|                      |j                  }||k    rw|j        j        }|j        j        }|j        r|j        sd| }n.|j        s'|j        r d| j                            |           d| }|                     | d| d           d S d S )Nz(void *)(rg   r   r   )r   r   srcr`   
is_unboxedrX   r_   r   )r   r   r   r   src_type	dest_types         rc   visit_assignz#FunctionEmitterVisitor.visit_assign  s    xx  hhrv 3;;v{HI" @9+? @ '&&( @Y-A @ @$,,,Y77??#??NNd--s---..... ;re   r   c           
     h    |j         j        }t          |t                    s
J |                                 |j                   }                     d j                            |j                  |t          |j
                  t           fd|j
        D             d          fz             d S )Nz%s%s[%d] = %s;c                :    g | ]}                     |          S  r   )ra   r   r   s     rc   
<listcomp>z=FunctionEmitterVisitor.visit_assign_multi.<locals>.<listcomp>;  s#    $A$A$AQTXXa[[$A$A$Are   T)indented)r   r`   r~   rJ   r   r   rX   rq   	item_typer   r   r
   )r   r   r   r   s   `   rc   visit_assign_multiz)FunctionEmitterVisitor.visit_assign_multi/  s    gl#v&&+++++xx   	))#-88BF#$A$A$A$A"&$A$A$ADQQQ		
 	
 	
 	
 	
re   r2   c           	                               |          }t          |j        t                    r fd|j        j        D             }                                 }                     d                                         |j                  |d	                    |                                                    | d| d           d S t          |j        t                    r" j                            ||j                   d S                                            |           d                     |j                   d           d S )Nc                :    g | ]}                     |          S r   )c_undefined_value)ra   r   r   s     rc   r   zAFunctionEmitterVisitor.visit_load_error_value.<locals>.<listcomp>B  s'    MMMtd,,T22MMMre   z{} {} = {{ {} }};r\   r   r   )r   r~   r`   rM   typesr   r   rr   r_   rh   rO   rX   set_undefined_valuer   )r   r   r   valuestmps   `    rc   visit_load_error_valuez-FunctionEmitterVisitor.visit_load_error_value?  s7   hhrllbgv&& 	OMMMMrw}MMMF..""CNN.55djj6I6I3PTPYPYZ`PaPabbcccNNc,,c,,,-----&& 	OL,,S"':::::NNdhhrllMMt/A/A"'/J/JMMMNNNNNre   r4   c                @   | j                             |j                  }t          |j                  s6|                     d|                     |          |fz  |j                   d S |                     d|                     |          |fz  |j                   d S )Nz%s = CPyStatics[%d];annz#%s = (CPyTagged)CPyStatics[%d] | 1;)r   literal_indexr   rS   r`   r   r   )r   r   indexs      rc   visit_load_literalz)FunctionEmitterVisitor.visit_load_literalK  s    ++BH55 )) 	NN1TXXb\\54IIrxNXXXXXNN5"u8MMSUS[      re   objGetAttr | SetAttrdecl_clr   c                Z   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        r,|j        rJ 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.
        r    *)zsize_t r   z{} = {};zCPy_FindAttrOffset({}, {}, {})z	)->vtable*z	((char *)z + rg   z)->)
class_typestruct_namerX   r   is_traitclass_irlist
attributesr   attrr   r   r   rr   type_struct_namer_   	attr_type)r   r   r   r   casttrait_attr_indexoffset	attr_casts           rc   get_attr_exprz$FunctionEmitterVisitor.get_attr_exprT  s    F2=,,T\-?@@EEE 	B 6 ? 	B  $G$677==bgFF\++--F''(;&(;(;(;<<<L""!!4;;55g>>0D0#000(  	 	 	 NDJJr}'>'>rw'G'GHHMMMI<y<<3<<6<<<< }%. H"++++G7..t|/ABBGGGAtASAAT\%6%6rw%?%?AAAre   r(   c                   |j         r|                     |           d S |                     |          }|                     |j                  }|j        }|j        }|                    |j                  \  }}|j        o|j	        }|
                    |j        |          r|                    |j                  r'|                     | d|j        |j        g            d S |j        rdnd}	|                     d||	|| j                            |j                  |                    |j                  |                    | j                  |                     |                    |j                            |j        fz             d S |                     |||          }
| j                            | d|
 d           |                    |j                  }d }|sD| j                            ||d||j        |d	           |                                 }||j        |u r|j        t6          j        k    r{|j        t|j        sm|                     ||j         |j                   |                     d
| !                    |j"                  z             |}| j                            d           |smd}| j                            d#                    |tI          |j        %                    tL                              tI          |j                                        |j'        r@|j(        s9|s|s| j                            d           | j        )                    ||           |rP|j*        | j+        ur0|                     d
| !                    |j*                  z             | xj,        dz  c_,        d S |s| j                            d           d S d S )N)prefer_methodr   _TRAITry   z1%s = CPY_GET_ATTR%s(%s, %s, %d, %s, %s); /* %s */r   r   T)unlikelyr   r   PyExc_AttributeErrorz4PyErr_SetString({}, "attribute {} of {} undefined");z} else {r|   )-allow_error_valueget_attr_with_allow_error_valuer   r   r   r  attr_detailsr  r   error_overlap
get_methodis_method_finalemit_method_callr   rX   r  getter_indexr   r   r_   r  r  is_always_definedemit_undefined_attr_checknext_branchr   r   r   r   r   r   emit_attribute_errorrn   r   r   rr   reprremoveprefixr   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_classs                  rc   visit_get_attrz%FunctionEmitterVisitor.visit_get_attrx  s    	00444Fxx||hhrv^ oobg66
G@
(@===>> >	,!!"'** %%lllBFBGRHHHHH&(k9((rG55enEE**2733))$*55

5??27#;#;<<	
     **3G<<IL""d#;#;y#;#;#;<<<11"'::N M! 66dC"t 7    ))++%**"I88"2> & ?
 11&"'27KKKzDJJv{4K4K'KLLL(...s333$  6IL**NUU% !5!56P!Q!QRR MM    ' < <$ 7^ 7L**:666))$
;;; , &do==NN:

=;N0O0O#OPPP"# ,&&s+++++, ,re   c                   |                      |          }|                      |j                  }|j        }|j        }|                    |j                  \  }}|                     |||          }| j                            | d| d           |j	        rr|j
        sm|                     |d          }	| j                            d|	 d           | j                            ||           | j                            d           dS dS dS )zHandle GetAttr with allow_error_value=True.

        This allows NULL or other error value without raising AttributeError.
        r   r   r   r   r   r   N)r   r   r   r  r  r  r  rX   r   r  r   r   r!  )
r   r   r   r   r"  r#  r$  r   r&  checks
             rc   r  z6FunctionEmitterVisitor.get_attr_with_allow_error_value  s!   
 xx||hhrv^ oobg66
G &&sB88	$779777888 # 	(BN 	(**2t44EL""#5%#5#5#5666L%%dJ777L""3'''''		( 	( 	( 	(re   Branch | Nonec                    | j         dz   t          | j                  k     r,| j        | j         dz            }t          |t                    r|S d S )Nr|   )r   r   r   r~   r   )r   next_ops     rc   r  z"FunctionEmitterVisitor.next_branch  sK    =1s48}},,ht}q01G'6** tre   r>   c                @   |j         t          k    r|                     |          }|                     |j                  }|                     |j                  }|j        }|j        }|                    |j                  \  }}|j	        r|j
        s|j         t          k    s J d|j        |j
        |j         |fz              |j        rdnd}	|                     d||	|| j                            |j                  |                    |j                  ||                    | j                  |                     |                    |j                            |j        f	z             d S |                     |||          }
|j
        s|j        rx|                    |j                  }|s$| j                            ||
d||j        |           | j                            |
|           |s| j                            d           nD|j        r=|                    |j                  s#| j                            |||||j                   | j                            |
 d| d           |j         t          k    r| j                            | d	           d S d S )
Nz%s %d %d %sr  ry   z5%s = CPY_SET_ATTR%s(%s, %s, %d, %s, %s, %s); /* %s */r   r   r   r   z = 1;)
error_kindr   r   r   r   r   r  r  r  
is_propsetis_initr   r   rX   r  setter_indexr   r   r_   r  r  r  r  r  emit_dec_refr  emit_attr_bitmap_set)r   r   r   r   r   r"  r#  r$  r   r%  r&  r'  s               rc   visit_set_attrz%FunctionEmitterVisitor.visit_set_attr  s   =I%%88B<<Dhhrvhhrv^ oobg66
G= -	7z bmy&@&@&@-
	S C&@&@&@ #%+5hh2GNNGL11%.AA&&rw//%%dj11JJurw7788G
      **3G<<I: U*": U "$!5!5bg!>!>% L::"ItS"'2   )))Z@@@% 0L**3///) U"2F2Frw2O2O U 11#sJBGTTT L""i#:#:C#:#:#:;;;}	))&&$~~~66666 *)re   r6   c                   |                      |          }t          |j                 }| j                            |j        |j        |          }|j        t          k    rd|z  }|                     | d| d|j	                   d S )Nz(PyObject *)%sr   r   r   )
r   r   	namespacerX   static_name
identifierrv   r   r   r   )r   r   r   rz   rn   s        rc   visit_load_staticz(FunctionEmitterVisitor.visit_load_static  s    xx||BL)|''r~vNN<>))#d*D$**4***77777re   r-   c                J   |                      |j                  }t          |j                 }| j                            |j        |j        |          }|j        t          k    rd|z  }| 	                    | d| d           | 
                    ||j        j                   d S )Nz(PyTypeObject *)%sr   r   )r   r   r   r:  rX   r;  r<  rv   r   r   r!  r`   )r   r   r   rz   rn   s        rc   visit_init_staticz(FunctionEmitterVisitor.visit_init_static  s    ""BL)|''r~vNN<>))(50E$++5+++,,,$.....re   rB   c                    |                      |          }|                      |j                  }|                     | d| d|j         d           |j        s|                     ||j                   d S d S )Nr   r   r   )r   r   r   r   r   r!  r`   r   r   r   r   s       rc   visit_tuple_getz&FunctionEmitterVisitor.visit_tuple_get'  s    xx||hhrv$55355"(555666~ 	-dBG,,,,,	- 	-re   r   c                D    |j         s|                     |          dz   S dS )Nr   ry   )is_voidr   )r   r   s     rc   get_dest_assignz&FunctionEmitterVisitor.get_dest_assign.  s&    | 	88D>>E))2re   r   c           	     F                          |          }d                     fd|j        D                       } j                            |j                  }|j                             j                  }                     | | t           | d| d           dS )zCall native function.r\   c              3  B   K   | ]}                     |          V  d S r^   r   ra   rb   r   s     rc   rd   z4FunctionEmitterVisitor.visit_call.<locals>.<genexpr>7  -      ::3#::::::re   r   );N)
rE  rh   ri   rX   get_group_prefixrW   cnamer   r   r   )r   r   r   ri   librL  s   `     rc   
visit_callz!FunctionEmitterVisitor.visit_call4  s    ##B''yy::::"':::::l++BE22DJ''$DD]DEDDDDDDEEEEEre   r7   c                ~    |                      |          }|                     ||j        |j        |j                   dS )zCall native method.N)rE  r  r   methodri   r   r   r   s      rc   visit_method_callz(FunctionEmitterVisitor.visit_method_call<  s;    ##B''dBFBIrw?????re   op_objrn   op_argslist[Value]c                                          |          }|j        }t          |t                    s
J |            |j        }|j                            |          }|J |                    |          }	|j        j        t          k    rg n|j        j        t          k    rd| dgn|g}
d                    |
 fd|D             z             }t          | j                  }|j        j        rdnd}|	r_ j                            |j                  }                     | | t"           |                     j                   d| d           d S |                    |          }                     d	                    ||| j                            |j                  ||                     j                  |||	  	                   d S )
Nz(PyObject *)Py_TYPE(rg   r\   c                :    g | ]}                     |          S r   r   rH  s     rc   r   z;FunctionEmitterVisitor.emit_method_call.<locals>.<listcomp>S  s#    $F$F$FsTXXc]]$F$F$Fre   r  ry   r   rJ  z4{}CPY_GET_METHOD{}({}, {}, {}, {}, {})({}); /* {} */)r   r`   r~   rK   r  r  r  r   kindr   r   rh   rl   rX   r   rK  r   r   rL  r   method_indexrr   r  r   )r   r   rS  rn   rT  r   r"  r  rP  	is_directobj_argsri   mtyper%  rM  
method_idxs   `               rc   r  z'FunctionEmitterVisitor.emit_method_callA  s   hhv%++22U222>**400!!! ,,T22	 {#444 B4:K4DHX4X4X////00_b^c 	
 yy$F$F$F$Fg$F$F$FFGG$VT\::#n5=((2 	,//<<CNNd[C[[TZ8P8P[[SW[[[\\\\\ ++D11JNNFMML11%.AA%%dj11
 
    re   r,   c                   t          |j        t                    rEt          |j        j        j                  st          |j        j        j                  r	t          rd S t          |j        t                    r;t          r4|j        j        }t	          |          t          u rd|cxk    rdk    rn nd S | 
                    |j                  }|                     ||j        j                   d S )N   )r~   r   r   rT   r`   rP   r   r4   r   intr   r!  )r   r   r   r   s       rc   visit_inc_refz$FunctionEmitterVisitor.visit_inc_refk  s    rvs##	#BFJO44	8QRTRXR\Ra8b8b	 	 Fbfk** 	} 	FLEE{{c!!bE&8&8&8&8S&8&8&8&8&8hhrv#rv{+++++re   r"   c                    |                      |j                  }|                     ||j        j        |j                   d S )N)is_xdec)r   r   r6  r`   rd  )r   r   r   s      rc   visit_dec_refz$FunctionEmitterVisitor.visit_dec_ref~  s<    hhrv#rv{BJ?????re   r   c                    | j                             |                     |j                  |                     |          |j        j        d           d S )NT)
can_borrow)rX   emit_boxr   r   r`   r   s     rc   	visit_boxz FunctionEmitterVisitor.visit_box  sD    dhhrv..bfkVZ[[[[[re   r   c                   |j         rO|j        rH|                     |                     |           d|                     |j                   d           d S |                                 }d }||j        |u rz|j        t          j	        k    re|j
        ^|j        sW|j        | j        u rIt          |                     |j                  | j        | j        |j
                  }| xj        dz  c_        | j                            |                     |j                  |                     |          |j        |j        j        |           d S )Nr   r   r|   )r   error)is_uncheckedr   r   r   r   r  r   r   r   r   r   r   r   r   r	   r   r   ru   rv   r   rX   	emit_castr`   )r   r   r)  handlers       rc   
visit_castz!FunctionEmitterVisitor.visit_cast  sH   ? 	r~ 	NNdhhrllBBtxx/?/?BBBCCCF!!##""I00*6 7LDO33 2JJv{++$$*	  "HHRVdhhrllBGbfkQX 	 	
 	
 	
 	
 	
re   rE   c                    | j                             |                     |j                  |                     |          |j                   d S r^   )rX   
emit_unboxr   r   r`   r   s     rc   visit_unboxz"FunctionEmitterVisitor.visit_unbox  s<     0 0$((2,,HHHHHre   rG   c                :    | j                             d           d S )NzCPy_Unreachable();rX   r   r   s     rc   visit_unreachablez(FunctionEmitterVisitor.visit_unreachable  s    344444re   r;   c                \   |j         t          |j         t                    rB|j                             dd          }| j                            d|j         d| d           nt          |j         t                    rQ| j                            d                    |j        | j        	                    |j                                        n-J d            | j                            d	|j         d
           | j                            | 	                    |           d           d S )N"\"zPyErr_SetString(PyExc_z, "z");zPyErr_SetObject(PyExc_{}, {});Fz)op value type must be either str or ValuezPyErr_SetNone(PyExc_rJ  z = 0;)
r   r~   rZ   replacerX   r   
class_namerH   rr   r   )r   r   messages      rc   visit_raise_standard_errorz1FunctionEmitterVisitor.visit_raise_standard_error  s+   8"(C(( 
J(**366&&'^'^'^RY'^'^'^____BHe,, J&&4;;t|'7'7'A'A     JIIIIL""#K"-#K#K#KLLL$((2,,55566666re   r   c                     |j         rd}n                     |          }d                     fd|j        D                       } j                            | |j         d| d           d S )Nry   r\   c              3  B   K   | ]}                     |          V  d S r^   r   rH  s     rc   rd   z6FunctionEmitterVisitor.visit_call_c.<locals>.<genexpr>  rI  re   r   rJ  )rD  rE  rh   ri   rX   r   function_name)r   r   r   ri   s   `   rc   visit_call_cz#FunctionEmitterVisitor.visit_call_c  s    : 	,DD''++Dyy::::"':::::$C(8CC4CCCDDDDDre   r:   c                <    t          d|j        j         d          )Nzunexpected PrimitiveOp z%: they must be lowered before codegen)RuntimeErrordescrn   r   s     rc   visit_primitive_opz)FunctionEmitterVisitor.visit_primitive_op  s&    YbglYYY
 
 	
re   rA   c                    |                      |          }|                      |j                  }|                     | d| d           d S Nr   r   r   r   r   )r   r   r   r   s       rc   visit_truncatez%FunctionEmitterVisitor.visit_truncate  sM    xx||  $++5+++,,,,,re   r#   c                *   |                      |          }|                      |j                  }|j        r |                     |j        j                  }n|                     |j        j                  }|                     | d| | d           d S r  )r   r   signedemit_signed_int_castr`   emit_unsigned_int_castr   )r   r   r   r   src_casts        rc   visit_extendz#FunctionEmitterVisitor.visit_extend  s    xx||  9 	@00==HH2226;??H$5585U55566666re   r3   c                ~    |                      |          }|                     | d|j         d|j                   d S )Nr   r   r   )r   r   r<  r   rQ  s      rc   visit_load_globalz(FunctionEmitterVisitor.visit_load_global  sB    xx||$332=333@@@@@re   r/   c           
        |                      |          }|                      |j                  }|                      |j                  }|j        t          j        k    rD|                     |j        j                  |z   }|                     |j        j                  |z   }|                     | d| d|j	        |j                  d| d           d S Nr   r   r   )
r   lhsrhsr   r/   RIGHT_SHIFTr  r`   r   op_strr   r   r   r  r  s        rc   visit_int_opz#FunctionEmitterVisitor.visit_int_op  s    xx||hhrvhhrv5E%%%++BFK883>C++BFK883>C$BB3BB25)9BBCBBBCCCCCre   r   c                   |                      |          }|                      |j                  }|                      |j                  }d}d}|j        t          j        t          j        t          j        t          j        fv r@| 	                    |j        j
                  }| 	                    |j        j
                  }n|j        t          j        t          j        t          j        t          j        fv r?|                     |j        j
                  }|                     |j        j
                  }nt!          |j        t"                    r0|j        j        dk     r | 	                    |j        j
                  }nIt!          |j        t"                    r/|j        j        dk     r| 	                    |j        j
                  }|                     | d| | d|j        |j                  d| | d
           d S )Nry   r   r   r   r   )r   r  r  r   r   SLTSGTSLESGEr  r`   ULTUGTULEUGEr  r~   r.   r   r   r  )r   r   r   r  r  lhs_castrhs_casts          rc   visit_comparison_opz*FunctionEmitterVisitor.visit_comparison_op  s   xx||hhrvhhrv5\%|'79I<K[\\\00==H00==HHU|')9<;K\M]^^^2226;??H2226;??HH(( 	>RV\A-=-=00==HH(( 	>RV\A-=-=00==H$VV8VSVV29RU3CVVhVPSVVVWWWWWre   r'   c           
     d   |                      |          }|                      |j                  }|                      |j                  }|j        t          j        k    r3|                     | d| d|j        |j                  d| d           d S |                     | d| d| d           d S )Nr   r   r   z = fmod(r\   rJ  )r   r  r  r   r'   MODr   r  r  s        rc   visit_float_opz%FunctionEmitterVisitor.visit_float_op  s    xx||hhrvhhrv5GKNNdFFsFFRYru-=FFFFFGGGGG NNd::C::3:::;;;;;re   r&   c                    |                      |          }|                      |j                  }|                     | d| d           d S )Nz = -r   r  rA  s       rc   visit_float_negz&FunctionEmitterVisitor.visit_float_neg  sM    xx||hhrv$**C***+++++re   r%   c           
         |                      |          }|                      |j                  }|                      |j                  }|                     | d| d|j        |j                  d| d           d S r  )r   r  r  r   r  r   r  s        rc   visit_float_comparison_opz0FunctionEmitterVisitor.visit_float_comparison_op  sy    xx||hhrvhhrv$BB3BB25)9BBCBBBCCCCCre   r5   c                   |                      |          }|                      |j                  }|                     |j                  }|                     | d| d| d           |j        s|                     ||j                   d S d S )Nz = *(r   r   )r   r   r_   r`   r   r   r!  )r   r   r   r   r`   s        rc   visit_load_memz%FunctionEmitterVisitor.visit_load_mem  s    xx||hhrvzz"'""$44T44c444555~ 	-dBG,,,,,	- 	-re   r@   c           	         |                      |j                  }|                      |j                  }|                     |j                  }||k    r!|                     d| d| d| d           d S d S )Nz*(r   r   r   )r   r   r   r_   r   r   r   r   r   r   r   s        rc   visit_set_memz$FunctionEmitterVisitor.visit_set_mem  s    xx  hhrvJJr|,,	 3;;NN=	==d==s===>>>>> ;re   r)   c           
         |                      |          }|                      |j                  }|                     |j                  }|                     | d| d| d|j         d           d S )N = (rg   .r   )r   r   r_   r`   r   fieldr  s        rc   visit_get_elementz(FunctionEmitterVisitor.visit_get_element   sr    xx||hhrvJJrw''	$AAIAAAAbhAAABBBBBre   r*   c           	     z   |                      |          }|                      |j                  }t          |j        t                    sJ |j                    |j        |j        j        v s
J d            |                     d                    ||j	        j
        ||j        j        |j                             d S )NzInvalid field name.z){} = ({})((CPyPtr){} + offsetof({}, {}));)r   r   r~   r   rL   r  r   r   rr   r`   _ctypern   rA  s       rc   visit_get_element_ptrz,FunctionEmitterVisitor.visit_get_element_ptr&  s    xx||hhrv"+w//<<<<<x2;,,,,.C,,, 	7>>bgnc2;+;RX 	
 	
 	
 	
 	
re   r?   c           	     |   |                      |          }|                      |j                  }|j        }t          |j        t
                    r |                     | d| d| d           d S |                      |j                  }|j        j        }t          |t                    s
J |            g }|j	        D ]8}||k    r|
                    | d|            #|
                    |           9|                     | d|                     |           dd                    |           d           d S )Nr  r   r   r  z) { r\   z };)r   r   r  r~   r   rF   r   r`   rL   r   rp   r_   rh   )	r   r   r   r   r  r   r   
init_itemsns	            rc   visit_set_elementz(FunctionEmitterVisitor.visit_set_element5  sM   xx||xx  bfe$$ 	`NNd66U66t66677777 ((26""Cv{Hh00::(:::J^ , ,::%%llqll3333%%d++++NNd^^

8(<(<^^499ZCXCX^^^_____re   r1   c                   |j         }|                     |          }t          |j        t                    r|                     |j                  }nit          |j        t
                    rHt          |j        j                 }| j        	                    |j        j
        |j        j        |          }n|j        }|                     | d|j         d| d           d S )Nr  z)&r   )r`   r   r~   r   r<   r6   r   r:  rX   r;  r<  rv   r   r  )r   r   r   r   r   rz   s         rc   visit_load_addressz)FunctionEmitterVisitor.visit_load_addressN  s    gxx||bfh'' 	((26""CC
++ 	 01F,**26+<bf>PRXYYCC&C$88CJ88#88899999re   r0   c                    d S r^   r   r   s     rc   visit_keep_alivez'FunctionEmitterVisitor.visit_keep_aliveZ  s    re   rD   c                    |                      |          }|                      |j                  }|                     | d| d           d S r  r  rA  s       rc   visit_unborrowz%FunctionEmitterVisitor.visit_unborrow^  sM    xx||hhrv$))3)))*****re   r   r   c                6    | j                             |          S r^   )rX   r   )r   r   s     rc   r   zFunctionEmitterVisitor.labelf      |!!%(((re   r   c                   t          |t                    r`|j        }|dk    rt          |j                  rdS t          |          }|dk    r|dk    r|dz  }n|dz  }n|dk    rd}n|d	k    r|dz  }|S t          |t                    r.t          |j                  }|d
k    rdS |dk    rdS |dk    rdS |S t          |t                    rdt          |j                  z   dz   S | j
                            |          S )Nr   NULLl        l            ULLLLl         z(-9223372036854775807LL - 1)i   infINFINITYz-infz	-INFINITYnanNANrw  )r~   r.   r   rU   r`   rZ   r$   r  r!   encode_c_string_literalrX   r   )r   r   valr   r   s        rc   r   zFunctionEmitterVisitor.regi  s+   c7## 	))Caxx1#(;;xvCAw7##JAAIAA
""2
""T	HU## 	)SYAEzz!zf"{euHW%% 	)0;;;cAA<##C(((re   r"  rN   c                6    | j                             |          S r^   )rX   r_   r   r"  s     rc   r_   zFunctionEmitterVisitor.ctype  r  re   c                6    | j                             |          S r^   )rX   r   r  s     rc   r   z$FunctionEmitterVisitor.c_error_value  s    |))%000re   c                6    | j                             |          S r^   )rX   r   r  s     rc   r   z(FunctionEmitterVisitor.c_undefined_value  s    |--e444re   Nr   liner   objectc               >    | j                             ||           d S )Nr   rt  )r   r  r   s      rc   r   z FunctionEmitterVisitor.emit_line  s#    t-----re   linesc                $     | j         j        |  d S r^   )rX   r   )r   r  s     rc   r   z!FunctionEmitterVisitor.emit_lines  s    ''''re   c                J    | j                             ||| j                   d S )N)r   )rX   r!  r   )r   r   r"  s      rc   r!  z#FunctionEmitterVisitor.emit_inc_ref  s'    !!$DI!>>>>>re   rd  boolc                L    | j                             |||| j                   d S )N)rd  r   )rX   r6  r   )r   r   r"  rd  s       rc   r6  z#FunctionEmitterVisitor.emit_dec_ref  s)    !!$wTY!OOOOOre   c                :    | j                             |           d S r^   )r   r   )r   r  s     rc   emit_declarationz'FunctionEmitterVisitor.emit_declaration  s    ##D)))))re   c                n    |j         -| j                            | j        | j        |j                    d S d S r^   )r   rX   r   ru   rv   r   s     rc   r   z%FunctionEmitterVisitor.emit_traceback  s<    )L''(8$:JBL^_____ *)re   rz  r  c           	        |j         J | j        j        j        r|j         d         dk    s
J d            | j                            d| j                  }|                     d| j                            dd          |j         d         ||	                    t                    |j         d         |fz             t          r|                     d           d S d S )	Nr|   r   z;AttributeError traceback cannot have a negative line numberglobalsz3CPy_AttributeError("%s", "%s", "%s", "%s", %d, %s);\\\z7assert(PyErr_Occurred() != NULL && "failure w/o err!");)r   rX   r   strict_traceback_checksr;  rv   r   ru   ry  r  r   r   )r   r   rz  r  globals_statics        rc   r  z+FunctionEmitterVisitor.emit_attribute_error  s    !---<7 	M"1%***L +**11)T=MNNA ((v66"1%!!"<=="1%
	
 
	
 
	
  	VNNTUUUUU	V 	Vre   r`   c                (    t          |          rdS dS )Nz(Py_ssize_t)ry   )rV   r   r`   s     rc   r  z+FunctionEmitterVisitor.emit_signed_int_cast  s    T?? 	!>2re   c                J    t          |          rdS t          |          rdS dS )Nz
(uint32_t)z
(uint64_t)ry   )rQ   rR   r  s     rc   r  z-FunctionEmitterVisitor.emit_unsigned_int_cast  s1    t$$ 	< && 	<2re   )
rX   r   r   r   ru   rZ   rv   rZ   rY   rw   )rY   rZ   )r   r+   rY   rw   )r   rH   r   rZ   rY   rZ   )r   r   rY   rw   )r   r=   rY   rw   )r   rC   rY   rw   )r   r   rY   rw   )r   r   rY   rw   )r   r2   rY   rw   )r   r4   rY   rw   )r   rZ   r   r   r   r   rY   rZ   )r   r(   rY   rw   )rY   r.  )r   r>   rY   rw   )r   r6   rY   rw   )r   r-   rY   rw   )r   rB   rY   rw   )r   rH   rY   rZ   )r   r   rY   rw   )r   r7   rY   rw   )
r   rZ   rS  rH   rn   rZ   rT  rU  rY   rw   )r   r,   rY   rw   )r   r"   rY   rw   )r   r   rY   rw   )r   r   rY   rw   )r   rE   rY   rw   )r   rG   rY   rw   )r   r;   rY   rw   )r   r   rY   rw   )r   r:   rY   rw   )r   rA   rY   rw   )r   r#   rY   rw   )r   r3   rY   rw   )r   r/   rY   rw   )r   r   rY   rw   )r   r'   rY   rw   )r   r&   rY   rw   )r   r%   rY   rw   )r   r5   rY   rw   )r   r@   rY   rw   )r   r)   rY   rw   )r   r*   rY   rw   )r   r?   rY   rw   )r   r1   rY   rw   )r   r0   rY   rw   )r   rD   rY   rw   )r   r   rY   rZ   )r   rH   rY   rZ   )r"  rN   rY   rZ   )r  rZ   r   r  rY   rw   )r  rZ   rY   rw   )r   rZ   r"  rN   rY   rw   )r   rZ   r"  rN   rd  r  rY   rw   )r  rZ   rY   rw   )r   r   rz  rZ   r  rZ   rY   rw   )r`   rN   rY   rZ   )A__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   r  r+  r  r  r8  r=  r?  rB  rE  rN  rR  r  rb  re  ri  ro  rr  ru  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!  r6  r  r   r  r  r  r   re   rc   r   r      sU          "( ( ( (> > > >L L L L+J +J +J +JZ1 1 1 1C C C C/ / / /$
 
 
 
 
O 
O 
O 
O   "B "B "B "BHH, H, H, H,T( ( ( (,   57 57 57 57n8 8 8 8/ / / /- - - -   F F F F@ @ @ @
( ( ( (T, , , ,&@ @ @ @\ \ \ \
 
 
 
8I I I I5 5 5 57 7 7 7$E E E E
 
 
 

- - - -7 7 7 7A A A AD D D DX X X X,< < < <, , , ,
D D D D- - - -? ? ? ?C C C C
 
 
 
` ` ` `2
: 
: 
: 
:   + + + +) ) ) )) ) ) )@) ) ) )1 1 1 15 5 5 5 59 . . . . . .( ( ( (? ? ? ?P P P P* * * *` ` ` `V V V V*        re   r   NzFinal[dict[int, str]]_translation_tablebbytesc                   t           st          d          dt          d          dt          d          dt          d          dt          d	          d
i}t          d          D ]-}||vr'|dk     s|dk    r	d|z  ||<   t          |          ||<   .t                               t
                              |                     |                     d                              t                     S )zConvert bytestring to the C string literal syntax (with necessary escaping).

    For example, b'foo
' gets converted to 'foo\n' (note that double quotes are not added).
    
z\nz\r	z\trw  rx  r  r  r`         z\x%.2xlatin1)	r  ordr   chrupdaterZ   	maketransdecode	translate)r  dr   s      rc   r  r    s    
  4 IIuIIuIIuHHeIIv
 s 	" 	"Azzr66Q#XX$q=AaDDq66AaD!!#--"2"233388H''(:;;;re   )rW   r   rX   r   rY   rZ   )rW   r   rX   r   rY   rZ   )
rW   r   rX   r   ru   rZ   rv   rZ   rY   rw   )r  r  rY   rZ   )f__doc__
__future__r   typingr   mypyc.analysis.blockfreqr   mypyc.codegen.emitr   r   r   r	   r
   mypyc.commonr   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/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   mypyc.ir.pprintrI   mypyc.ir.rtypesrJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rl   rt   r   r   r  __annotations__r  r   re   rc   <module>r     s^   1 1 1 " " " " " "       ? ? ? ? ? ?              ^ ] ] ] ] ] ] ] ] ] ] ] % % % % % % ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5l 2 1 1 1 1 1                             "       	 	 	 	L$ L$ L$ L$^K K K K KYt_ K K K\ -/  . . . .< < < < < <re   