
    i                       U d Z ddlmZ ddlZddlZddlZddlm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mZmZmZmZmZmZ dd	lmZ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'm(Z( ddl)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@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJ ddlKmLZLmMZM ddlNmOZO ddlPmQZQ dZRdeSd<   e$ee%ee#ee&eiZTdeSd<    G d d          ZU G d d          ZV G d d          ZW G d deW          ZX G d deW          ZY G d deW          ZZ G d  d!eW          Z[ G d" d#          Z\dd$d/d+Z]d0d.Z^dS )1zUtilities for emitting C code.    )annotationsN)Callable)Final)c_string_initializer)Literals)ATTR_PREFIXBITMAP_BITSFAST_ISINSTANCE_MAX_SUBCLASSESHAVE_IMMORTALMODULE_PREFIXNATIVE_PREFIXPREFIX
REG_PREFIXSTATIC_PREFIXTYPE_PREFIXTYPE_VAR_PREFIX)ClassIRall_concrete_classes)FUNC_STATICMETHODFuncDeclFuncIRget_text_signature)NAMESPACE_MODULENAMESPACE_STATICNAMESPACE_TYPENAMESPACE_TYPE_VAR
BasicBlockValue)!	RInstance
RPrimitiveRTupleRTypeRUnionRVecint_rprimitiveis_bool_or_bit_rprimitiveis_bytearray_rprimitiveis_bytes_rprimitiveis_dict_rprimitiveis_fixed_width_rtypeis_float_rprimitiveis_frozenset_rprimitiveis_int16_rprimitiveis_int32_rprimitiveis_int64_rprimitiveis_int_rprimitiveis_list_rprimitiveis_native_rprimitiveis_none_rprimitiveis_object_rprimitiveis_optional_typeis_range_rprimitiveis_set_rprimitiveis_short_int_rprimitiveis_str_rprimitiveis_tuple_rprimitiveis_uint8_rprimitiveobject_rprimitiveoptional_value_typevec_api_by_item_typevec_item_type_tags)NameGeneratorexported_name)builtin_names)is_same_typeFr   DEBUG_ERRORS
PREFIX_MAPc                  (    e Zd ZdZ	 dddddddZdS )HeaderDeclarationan  A representation of a declaration in C.

    This is used to generate declarations in header files and
    (optionally) definitions in source files.

    Attributes:
      decl: C source code for the declaration.
      defn: Optionally, C source code for a definition.
      dependencies: The names of any objects that must be declared prior.
      is_type: Whether the declaration is of a C type. (C types will be declared in
               external header files and not marked 'extern'.)
      needs_export: Whether the declared object needs to be exported to
                    other modules in the linking table.
    NF)dependenciesis_typeneeds_exportdeclstr | list[str]defnlist[str] | NonerH   set[str] | NonerI   boolrJ   returnNonec                   t          |t                    r|gn|| _        || _        |pt	                      | _        || _        || _        d S N)
isinstancestrrK   rM   setrH   rI   rJ   )selfrK   rM   rH   rI   rJ   s         Q/root/projects/qq-shell/venv/lib64/python3.11/site-packages/mypyc/codegen/emit.py__init__zHeaderDeclaration.__init__g   sM     )s33=TFF		(1CEE(    rT   )rK   rL   rM   rN   rH   rO   rI   rP   rJ   rP   rQ   rR   __name__
__module____qualname____doc__rZ    r[   rY   rG   rG   W   sQ         $ "&)
 )-") ) ) ) ) ) ) )r[   rG   c                       e Zd ZdZ	 	 dddZdS )EmitterContextz-Shared emitter state for a compilation group.Nnamesr@   strict_traceback_checksrP   
group_name
str | None	group_mapdict[str, str | None] | NonerQ   rR   c                    d| _         || _        || _        |pi | _        t	                      | _        i | _        t                      | _        || _	        dS )zSetup shared emitter state.

        Args:
            names: The name generator to use
            group_map: Map from module names to group name
            group_name: Current group name
        r   N)
temp_counterrd   rf   rh   rW   
group_depsdeclarationsr   literalsre   )rX   rd   re   rf   rh   s        rY   rZ   zEmitterContext.__init__z   sS     
$"b$'EE ;= 

'>$$$r[   )NN)
rd   r@   re   rP   rf   rg   rh   ri   rQ   rR   r\   ra   r[   rY   rc   rc   w   s;        77 "&26 ?  ?  ?  ?  ?  ?  ?r[   rc   c                      e Zd ZdZdS )ErrorHandlerz3Describes handling errors in unbox/cast operations.Nr]   r^   r_   r`   ra   r[   rY   rp   rp      s        ====r[   rp   c                      e Zd ZdZdS )AssignHandlerzAssign an error value on error.Nrq   ra   r[   rY   rs   rs      s        ))))r[   rs   c                      e Zd ZdZddZdS )	GotoHandlerzGoto label on error.labelrV   rQ   rR   c                    || _         d S rT   rv   rX   rv   s     rY   rZ   zGotoHandler.__init__       


r[   N)rv   rV   rQ   rR   r\   ra   r[   rY   ru   ru      s.             r[   ru   c                      e Zd ZdZdd
ZdS )TracebackAndGotoHandlerz+Add traceback item and goto label on error.rv   rV   source_pathmodule_nametraceback_entrytuple[str, int]rQ   rR   c                >    || _         || _        || _        || _        d S rT   )rv   r}   r~   r   )rX   rv   r}   r~   r   s        rY   rZ   z TracebackAndGotoHandler.__init__   s)     
&&.r[   N)
rv   rV   r}   rV   r~   rV   r   r   rQ   rR   r\   ra   r[   rY   r|   r|      s.        55/ / / / / /r[   r|   c                      e Zd ZdZddZdS )	ReturnHandlerz!Return a constant value on error.valuerV   rQ   rR   c                    || _         d S rT   )r   )rX   r   s     rY   rZ   zReturnHandler.__init__   rz   r[   N)r   rV   rQ   rR   r\   ra   r[   rY   r   r      s.        ++     r[   r   c                  0   e Zd ZdZ	 	 	 dddZddZddZddZddZddZ	ddZ
ddddd Zdd"Zdd$Zdd&Zdd)Zdd*Zdd+Zdd-Zdd/Zefdd3Zdd6Zdd9Zdd:Zdd<Zdd=Zdd>ZddAZddEZddHZddIZddLZ ddMZ!ddPZ"dQdRddVZ#ddWZ$dXdYdd^Z%dd_Z&dd`Z'ddbZ(dQdcddfZ)dQdQdgddiZ*ddkZ+dQddXdQddXdlddvZ,ddxZ-ddzZ.dd{Z/dd}Z0dQddXdQdQd~ddZ1ddZ2ddZ3	 dddZ4ddZ5ddZ6ddZ7ddZ8ddZ9ddZ:	 	 dddZ;ddZ<ddZ=dS )EmitterzHelper for C code generation.Ncontextrc   value_namesdict[Value, str] | Nonecapi_versiontuple[int, int] | Nonefilepathrg   rQ   rR   c                    || _         |pt          j        d d         | _        |j        | _        |pi | _        g | _        d| _        || _        d S )N   r   )	r   sysversion_infor   rd   r   	fragments_indentr   )rX   r   r   r   r   s        rY   rZ   zEmitter.__init__   sS     (@C,<RaR,@]
&,"$& r[   c                &    | xj         dz  c_         d S )N   r   rX   s    rY   indentzEmitter.indent   s    r[   c                @    | xj         dz  c_         | j         dk    sJ d S )Nr   r   r   r   s    rY   dedentzEmitter.dedent   s+    |q      r[   rv   r   rV   c                    d|j         z  S )NzCPyL%srx   ry   s     rY   rv   zEmitter.label   s    %+%%r[   regr   c                ,    t           | j        |         z   S rT   )r   r   )rX   r   s     rY   r   zEmitter.reg   s    D,S111r[   namec                    t           |z   S rT   )r   )rX   r   s     rY   attrzEmitter.attr   s    T!!r[   objobjectlinec                L   | j         t          |          z   }t          j        |dt	          d|z
  d                    t          fddD                       rdS dv r>                    dd	
          \  }}t          j        ||dz   dz            }d| d| dS d dS )a;  Build a C comment with an object's string representation.

        If the comment exceeds the line length limit, it's wrapped into a
        multiline string (with the extra lines indented to be aligned with
        the first line's comment).

        If it contains illegal characters, an empty string is returned.TZ      )compactwidthc              3      K   | ]}|v V  	d S rT   ra   ).0x	formatteds     rY   	<genexpr>z,Emitter.object_annotation.<locals>.<genexpr>   s'      ::!qI~::::::r[   )z/*z*/  
   )maxsplit    z /* z */)	r   lenpprintpformatmaxanysplittextwrapr   )rX   r   r   
line_width
first_linerestcomment_continuedr   s          @rY   object_annotationzEmitter.object_annotation   s     \CII-
N3CZQS<T<TUUU	::::'9::::: 	29(ta@@J (zA~6L M M>*>>(9>>>>()((((r[   r   )annr   c               8   |                     d          r|                                  ||                     ||          nd}| j                            | j        dz  |z   |z   dz              |                    d          r|                                  d S d S )N}r   r   r   {)
startswithr   r   r   appendr   endswithr   )rX   r   r   comments       rY   	emit_linezEmitter.emit_line   s    ??3 	KKMMM7:$((d333BdlS047'ADHIII== 	KKMMMMM	 	r[   linesc                :    |D ]}|                      |           d S rT   )r   )rX   r   r   s      rY   
emit_lineszEmitter.emit_lines   s0     	! 	!DNN4    	! 	!r[   BasicBlock | strc                    t          |t                    r|}n)|j        dk    s|j        sd S |                     |          }| j                            | d           d S )Nr   z: ;
)rU   rV   rv   
referencedr   r   )rX   rv   texts      rY   
emit_labelzEmitter.emit_label  sh    eS!! 	%DD{au'7::e$$Dnnn-----r[   emitterc                D    | j                             |j                    d S rT   )r   extend)rX   r   s     rY   emit_from_emitterzEmitter.emit_from_emitter  s!    g/00000r[   fmtargsc           	         |                     dd          }|                     dd                    d|z  gt          |          z             z             |                     d           d S )Nr   z\nzprintf(%s);, z"%s"zfflush(stdout);)replacer   joinlist)rX   r   r   s      rY   emit_printfzEmitter.emit_printf  sb    kk$&&}tyy&3,$t**1L'M'MMNNN()))))r[   c                J    | j         xj        dz  c_        d| j         j        z  S )Nr   z__tmp%dr   rk   r   s    rY   	temp_namezEmitter.temp_name  s(    !!Q&!!4<444r[   c                J    | j         xj        dz  c_        d| j         j        z  S )Nr   z__LL%dr   r   s    rY   	new_labelzEmitter.new_label  s(    !!Q&!!$,333r[   r~   c                    | j         j        }|                    |          }|rB|| j         j        k    r2| j         j                            |           dt          |           dS dS )a  Get the group prefix for a module (relative to the current group).

        The prefix should be prepended to the object name whenever
        accessing an object from this module.

        If the module lives is in the current compilation group, there is
        no prefix.  But if it lives in a different group (and hence a separate
        extension module), we need to access objects from it indirectly via an
        export table.

        For example, for code in group `a` to call a function `bar` in group `b`,
        it would need to do `exports_b.CPyDef_bar(...)`, while code that is
        also in group `b` can simply do `CPyDef_bar(...)`.

        Thus the prefix for a module in group `b` is 'exports_b.' if the current
        group is *not* b and just '' if it is.
        exports_.r   )r   rh   getrf   rl   addrA   )rX   r~   groupstarget_group_names       rY   get_module_group_prefixzEmitter.get_module_group_prefix  sq    $ '"JJ{33 	!2dl6M!M!ML#''(9:::Am,=>>AAAA2r[   ClassIR | FuncDeclc                6    |                      |j                  S )z#Get the group prefix for an object.)r   r~   )rX   r   s     rY   get_group_prefixzEmitter.get_group_prefix8  s     ++CO<<<r[   idmoduleprefixc                    |sdn|                      |          }|rdnd}| j                            |pd|          }| | | | S )a  Create name of a C static variable.

        These are used for literals and imported modules, among other
        things.

        The caller should ensure that the (id, module) pair cannot
        overlap with other calls to this method within a compilation
        group.
        r   *)r   rd   private_name)rX   r   r   r   
lib_prefix
star_maybesuffixs          rY   static_namezEmitter.static_name=  sf      &ORR4+G+G+O+O
 '.SSB
((2r:::j:&:&:::r[   clr   c                P    |                      |j        |j        t                    S )Nr   )r   r   r~   r   )rX   r   s     rY   type_struct_namezEmitter.type_struct_nameN  s!    LLLr[   rtyper"   c                    |j         S rT   )_ctyperX   r   s     rY   ctypezEmitter.ctypeQ  s
    |r[   c                R    |                      |          }|d         dk    r|S |dz   S )z*Adds a space after ctype for non-pointers.r   r   )r   )rX   r   r   s      rY   ctype_spacedzEmitter.ctype_spacedT  s1    

5!!9L3;r[   targetc                    t          |t                    r2|                     | d           |                     | d           d S |                     | d|                     |           d           d S )Nz
.len = -1;z.buf = NULL; = ;)rU   r$   r   c_undefined_value)rX   r  r   s      rY   set_undefined_valuezEmitter.set_undefined_value\  s    eT"" 	KNNf000111NNf22233333NNfII)?)?)F)FIIIJJJJJr[   c                   |j         sdS t          |t                    r|j        S t          |t                    r|                     |          S t          |t                    rd|                     |           dS J |            )NNULL(z) { -1, NULL })
is_unboxedrU   r    c_undefinedr!   tuple_undefined_valuer$   r   r   s     rY   r  zEmitter.c_undefined_valuec  s     	;6z** 	;$$v&& 	;--e444t$$ 	;:tzz%((::::er[   c                ,    |                      |          S rT   )r  r   s     rY   c_error_valuezEmitter.c_error_valuen  s    %%e,,,r[   fnr   c                H    t            |                    | j                   S rT   )r   cnamerd   )rX   r  s     rY   native_function_namezEmitter.native_function_nameq  s!    7$*!5!5777r[   rtupler!   	list[str]c                   d|j          d|j          d|j          dg}t          |j                  dk    r|                    d           n?d}|j        D ]5}|                    |                     |           d| d           |d	z  }6|                    d
|j          d           |                    d           |                    d           |S )Nz#ifndef MYPYC_DECLARED_z#define MYPYC_DECLARED_ztypedef struct z {r   zint empty_struct_error_flag;fr  r   z} z#endifr   )struct_namer   typesr   r  )rX   r  resultityps        rY   tuple_c_declarationzEmitter.tuple_c_declarationt  s   :f&8:::f&8::5f0555

 v|!! MM89999A|  !2!23!7!7>>!>>>???Q1F.111222hbr[   indexintc                6    |t           z  }|dk    rdS d|dz    S )z.Return C field name used for attribute bitmap.r   bitmapr   )r	   )rX   r   ns      rY   bitmap_fieldzEmitter.bitmap_field  s,    [ 668Ar[   c                |    d|                     | j                   d}|                     |          }d| | d| S )z5Return reference to the attribute definedness bitmap.r   *))->)r  rd   r%  )rX   r   r   r   castr   s         rY   attr_bitmap_exprzEmitter.attr_bitmap_expr  sN    22>>$*--222  '''4''''''r[   r   r   c                <    |                      |||||d           dS )zMark an attribute as defined in the attribute bitmap.

        Assumes that the attribute is tracked in the bitmap (only some attributes
        use the bitmap). If 'value' is not equal to the error value, do nothing.
        FclearN_emit_attr_bitmap_update)rX   r   r   r   r   r   s         rY   emit_attr_bitmap_setzEmitter.emit_attr_bitmap_set  s+     	%%eS%T%OOOOOr[   c                <    |                      d||||d           dS )z}Mark an attribute as undefined in the attribute bitmap.

        Unlike emit_attr_bitmap_set, clear unconditionally.
        r   Tr,  Nr.  )rX   r   r   r   r   s        rY   emit_attr_bitmap_clearzEmitter.emit_attr_bitmap_clear  s+    
 	%%b#ub$d%KKKKKr[   r-  rP   c                   |r0|                      ||d          }|                     d| d           |j                            |          }d|t          dz
  z  z  }	|                     |||          }
|r|                     |
 d|	 d           n|                     |
 d|	 d           |r|                     d           d S d S )	N==if (unlikely()) {r   z &= ~r  z |= r   )error_value_checkr   bitmap_attrsr   r	   r*  )rX   r   r   r   r   r   r-  checkr   maskr#  s              rY   r/  z Emitter._emit_attr_bitmap_update  s      	9**5%>>ENN75777888%%d++UkAo./&&sB66 	3NNf2242223333NNf11$111222 	 NN3	  	 r[   F)unlikely	attr_exprcomparer;  c               ^   |                      |||          }|rd| d}|j        rm|j                            |          }	d|	t          dz
  z  z  }
|                     |	          }d|                    | j                   d| }| d| d| d|
 d}|                     d	| d
           d S )Nz	unlikely()r   r  r'  z && !((r(  z & if () {)	r7  error_overlapr8  r   r	   r%  r  rd   r   )rX   r   r<  r=  r   r   r   r;  r9  r   bitobj_exprs               rY   emit_undefined_attr_checkz!Emitter.emit_undefined_attr_check  s     &&uiAA 	)((((E 	BO))$//Eq12C$$U++D?2>>$*55??#??HAAXAA$AA3AAAE)e)))*****r[   c                   t          |t                    r|                     ||| j        |d          S t          |t                    r |dk    r| dS |dk    r| dS J |            | d| d|                     |           S )NFcheck_exceptionr4  z.len < 0z!=z	.len >= 0r   )rU   r!   tuple_undefined_check_condr  r$   )rX   r   r   r=  s       rY   r7  zEmitter.error_value_check  s    eV$$ 	D22ud0'5 3    t$$ 	D$))))D****!'!!!CCgCC(:(:5(A(ACCCr[   TrG  tuple_expr_in_cc_type_compare_valCallable[[RType], str]rH  c          	        t          |j                  dk    r%d                    || |t                              S |j        rd}|j        d         }n:t          |j                  D ]\  }}|j        s|j        |         } nJ d            t          |t                    r|                     ||d| z   ||          S t          |t                    r| d| d| dS | d| d| d ||           }	|j        r|r|	d	z  }	|	S )
Nr   z {}.empty_struct_error_flag {} {}Fz&not expecting tuple with error overlap.fz.len z -1r   z && PyErr_Occurred())
r   r  formatr%   rB  	enumeraterU   r!   rI  r$   )
rX   r  rJ  rK  r=  rH  r  	item_typer  r9  s
             rY   rI  z"Emitter.tuple_undefined_check_cond  sx    v|!!5<<*<*<^*L*L    		GAQII#FL11 G G3(  &QIE GFFFFi(( 
	22?X!XX57I7   	4(( 	%========&WW!WWgWW8J8J98U8UWWE# 0 0//Lr[   c                B    d|j          d|                     |           S )z0Undefined tuple value suitable in an expression.r  z) )r  c_initializer_undefined_value)rX   r  s     rY   r  zEmitter.tuple_undefined_value  s)    U6%UU)K)KF)S)SUUUr[   c                    t          |t                    rC|j        sdt          j         dS d                     fd|j        D                       }d| dS t          |t                    rdS                      |          S )zKUndefined value represented in a form suitable for variable initialization.z{ z }r   c                :    g | ]}                     |          S ra   )rS  )r   trX   s     rY   
<listcomp>z9Emitter.c_initializer_undefined_value.<locals>.<listcomp>
  s'    ZZZtAA!DDZZZr[   z{ -1, NULL })rU   r!   r  r%   r  r   r$   r  )rX   r   itemss   `  rY   rS  z%Emitter.c_initializer_undefined_value  s    eV$$ 
	1; = =^7<<<<IIZZZZekZZZ[[E#####t$$ 	1!>))%000r[   
tuple_typec                ,   |j         | j        j        vrt                      }|j        D ]1}t          |t                    r|                    |j                    2t          | 	                    |          |d          | j        j        |j         <   d S d S )NT)rH   rI   )
r  r   rm   rW   r  rU   r!   r   rG   r  )rX   rY  rH   r  s       rY   declare_tuple_structzEmitter.declare_tuple_struct  s    !)BBB55L!' 6 6c6** 6 $$S_555@Q((44<Y]A A ADL%j&<=== CBr[   )raredestr\  c                  t          |          r6|r|                     d|z             dS |                     d|z             dS t          |t                    r7t	          |j                  D ] \  }}|                     | d| |           !dS t          |t                    r|                     d| d           dS |j        sB|j	        st          s|                     d|z             dS |                     d|z             dS dS )	zIncrement reference count of C expression `dest`.

        For composite unboxed structures (e.g. tuples) recursively
        increment reference counts for each component.

        If rare is True, optimize for code size and compilation speed.
        zCPyTagged_IncRef(%s);zCPyTagged_INCREF(%s);rN  zPy_XINCREF(.buf);zCPy_INCREF(%s);zCPy_INCREF_NO_IMM(%s);N)r0   r   rU   r!   rP  r  emit_inc_refr$   r  may_be_immortalr   )rX   r]  r   r\  r  rQ  s         rY   r`  zEmitter.emit_inc_ref  sU    U## 	@ ?6=>>>>>6=>>>>>v&& 	@ )%+ 6 6 = =9!!T..Q..)<<<<= =t$$ 	@NN555566666! 	@$ @M @047888887$>?????	@ 	@r[   is_xdecr\  rc  c                  |rdnd}t          |          r>|r|                     d| d| d           dS |                     d| d| d           dS t          |t                    r:t	          |j                  D ]#\  }}|                     | d| |||           $dS t          |t                    r8|r|                     d	| d
           dS |                     d| d
           dS |j        sj|r|                     d| d| d           dS |j	        st          s|                     d| d| d           dS |                     d| d| d           dS |j        rJ d|             dS )zDecrement reference count of C expression `dest`.

        For composite unboxed structures (e.g. tuples) recursively
        decrement reference counts for each component.

        If rare is True, optimize for code size and compilation speed.
        Xr   
CPyTagged_zDecRef();zDECREF(rN  rb  zCPy_XDecRef(r_  zCPy_XDECREF(CPy_zDECREF_NO_IMM(Fzdec_ref not implemented for N)r0   r   rU   r!   rP  r  emit_dec_refr$   r  ra  r   is_refcounted)rX   r]  r   rc  r\  r   r  rQ  s           rY   ri  zEmitter.emit_dec_ref:  s0    "CCU## 	A @>A>>d>>>????? >A>>d>>>?????v&& 	A )%+ 6 6 Y Y9!!T..Q..)WSW!XXXXY Yt$$ 	A <:d:::;;;;;:d:::;;;;;! 
	A E8a8888899999 ( E ENN#<!#<#<D#<#<#<=====NN#C!#C#C4#C#C#CDDDDD  	A@@@@@@@	A 	Ar[   r  c                r    t          |          }|d|                     |          z  S t          |          S )Nz
%s or None)r=   pretty_namerV   )rX   r  
value_types      rY   rl  zEmitter.pretty_namea  s9    (--
!$"2"2:">">>>3xxr[   )declare_desterrorraise_exceptionoptionalsrc_typelikelysrcrn  ro  ErrorHandler | Nonerp  rq  rr  RType | Noners  c               J    |pt                      }|rt          |          rt          |          st          |          }
|
J t	          |
|          r|r                     d| d           d}|	rd| d}                     ||||                    |          |                                d| d| dd	            	                    |||||                                d
           dS t          |          st          |          syt          |          sjt          |          s[t          |          sLt          |          s=t!          |          s.t#          |          st%          |          st'          |          r]|r                     d| d           t          |          rd}nt          |          rd}nt          |          rd}nt          |          rd}nvt          |          rd}ndt          |          rd}nRt!          |          rd}n@t#          |          st'          |          rd}nt%          |          rd}nJ d|             d}|	rd| d}                     ||||                    ||          |                                d| d| dd	            	                    |||||                                d
           dS t)          |          r|r                     d| d           d}|	rd| d}                     ||||                    ||          |                                d| d| dd	            	                    |||||                                d
           dS t+          |          r|r                     d| d           d}|	rd| d}                     ||||                    ||          |                                d| d| dd	            	                    |||||                                d
           dS t-          |          r|r.                                          |           d| d           d}|	rd| d}                     ||||                    |          |                                d| d| dd	            	                    |||||                                d
           dS t1          |t2                    rN|r                     d| d           t5          |j                  }|rt9          |          t:          dz   k    r/d                    |                     |j                            }ned}t?          dt9          |                    D ]
}|d|z  z  }t9          |          dk    rd|z  }|                    | fd |D             !          }|	rd| d}                     |||||                                d| d| dd	            	                    |||||                                d
           dS tA          |          r|r                     d| d           d"}|	rd| d}                     ||||                    |          |                                d| d| dd	            	                    |||||                                d
           dS t          |          rj|r                     d| d                                |||d#|                                | d| d           |r                     d
           dS dS tC          |          r|r                     d| d           |j"        #                    d$d          d%         }d&| d'| d(}|	rd| d}                     |||||                                d| d| dd	            	                    |||||                                d
           dS t1          |tH                    r %                    ||||||||           dS t1          |tL                    r |rJ  '                    ||||||           dS t1          |tP                    rI|r                     d| d           tS          j*        |j+                  }|,                                }|r
d)| d*| d+}n|d,k    r" -                    |          }d)| d-| d.| d}n_|.                                }|t^          v rta          t^          |                   }n -                    |          }d)| d/| d.| d0| d1| d}|	rd| d}                     |||||                                d| d| dd	            	                    |||||                                d
           dS J d2|z              )3au  Emit code for casting a value of given type.

        Somewhat strangely, this supports unboxed types but only
        operates on boxed versions.  This is necessary to properly
        handle types such as Optional[int] in compatibility glue.

        By default, assign NULL (error value) to dest if the value has
        an incompatible type and raise TypeError. These can be customized
        using 'error' and 'raise_exception'.

        Always copy/steal the reference in 'src'.

        Args:
            src: Name of source C variable
            dest: Name of target C variable
            typ: Type of value
            declare_dest: If True, also declare the variable 'dest'
            error: What happens on error
            raise_exception: If True, also raise TypeError on failure
            likely: If the cast is likely to succeed (can be False for unions)
        N
PyObject *r  z({} != Py_None)z(likelyr?      r  else {r   PyListPyDictPySetPyFrozenSet	PyUnicodePyRangeCPyFloatPyLongPyBoolFzunexpected primitive type: z({}_Check({}))z(PyBytes_Check({}))z(PyByteArray_Check({}))r   z(PyTuple_Check({}))r   z(PyObject_TypeCheck({}, {}))z (Py_TYPE({src}) == {targets[0]})z% || (Py_TYPE({src}) == {targets[%d]})z(%s)c                :    g | ]}                     |          S ra   )r   )r   irrX   s     rY   rW  z%Emitter.emit_cast.<locals>.<listcomp>  s'    %S%S%SBd&;&;B&?&?%S%S%Sr[   )rt  targetsz({} == Py_None)r   r   r  z(CPyz_Check())z	(Py_TYPE(z) == z.boxed_type)r   z*) == VecTApi.boxed_type && ((VecTObject *)z)->vec.buf->item_type == z4) == VecNestedApi.boxed_type && ((VecNestedObject *)z && ((VecNestedObject *)z)->vec.buf->depth == zCast not implemented: %s)1rs   r5   r4   r=   rC   r   emit_arg_checkrO  r   emit_cast_error_handlerr1   r)   r7   r,   r9   r6   r+   r0   r&   r*   r(   r'   r:   r   rU   r   r   class_irr   r
   r   ranger3   r2   r   rsplitr#   emit_union_castr!   emit_tuple_castr$   r>   r   rQ  depthvec_item_type_cunwrap_item_typer?   rV   )rX   rt  r]  r  rn  ro  rp  rq  rr  rs  rm  r9  r   concretefull_strr  
short_nameapi_namer  item_type_c	unwrapped
type_values   `                     rY   	emit_castzEmitter.emit_castg  s   D (  	(22 	;OPS;T;T 	,X66J)))J,, 
 9NN#7#7#7#7888) /.e...E##CsELL4E4ExPPP 6t 6 6 6 6 6AAA,,UCsOTTTs### s##j	;!#&&j	; !%%j	; 's++	j	;
 !%%j	; #3''j	; #3''j	; !%%j	; )--j	; $C((j	;  53D333444!#&& B!#C(( B!"3'' B (-- B&"3'' B$$S)) 
B"$S)) B#"3'' B+?+D+D B!*3// B!AACAAAAA$E +*%***T3VS0I0I8TTTOO2422C222H===((T3PPPNN3 %% @	; 53D333444)E +*%***T3S#0F0FQQQOO2422C222H===((T3PPPNN3$S)) v	; 53D333444-E +*%***T3S#0F0FQQQOO2422C222H===((T3PPPNN3 %% l	; =$**S//;;D;;;<<<)E +*%***T3S0A0A8LLLOO2422C222H===((T3PPPNN3Y'' b	; 53D333444+CL99H
  s8}}/MPQ/QQQ6==..s|<<  >q#h--00 L LA G! KKHHx==1$$%0H %S%S%S%S(%S%S%S (    +*%***T3x@@@OO2422C222H===((T3PPPNN3$$ G	; 53D333444%E +*%***T3S0A0A8LLLOO2422C222H===((T3PPPNN3!#&& =	; 53D333444T3H===NNd--s---... $s#####$ $!#&& 6	; 53D333444a004J5:55c555E +*%***T3x@@@OO2422C222H===((T3PPPNN3V$$ *	;  T3eXx     V$$ &	;  dCuhOOOOOT"" #	; 53D333444+/>>HIIKKE DCDDhDDD!"22377S S S&)S SDOS S S   0022	 222!$%7	%B!C!CJJ!%!5!5c!:!:JN N N+.N NISN N+.N NEJN N N 
  +*%***T3x@@@OO2422C222H===((T3PPPNN3:4s::::r[   rp   c                D   |rt          |t                    rH|                     |j        |j        |j        ||           |                     d|j        z             d S |                     d|                     |           d| d           t          |t                    r|                     d|z             d S t          |t                    r|                     d|j        z             d S t          |t                    r]|                     d|z             |                     |j        |j        |j                   |                     d|j        z             d S t          |t                    s
J |            |                     d|j        z             d S )N)r  rt  goto %s;CPy_TypeError("", ); z
%s = NULL;
return %s;)rU   r|   emit_type_error_tracebackr}   r~   r   r   rv   rl  rs   ru   emit_tracebackr   r   )rX   ro  rt  r]  r  rp  s         rY   r  zEmitter.emit_cast_error_handlerH  s     	Q%!899 ..%u'8%:OUX^a /    zEK7888NNOT-=-=c-B-BOOsOOOPPPe]++ 
	7NN<$./////{++ 	7NN:344444677 	7NN<$./// 153DeF[\\\NN:344444e]33::U:::NN<%+566666r[   r#   c	           
     2   |r|                      d| d           |                                 }	|ru|                      d| d           |                      | d|                     |           d           |                      d|	 d           |                      d           |j        D ]:}
|                     |||
dddd	           |                      d| d
|	 d           ;|                     |||||           |                     |	           dS )zTEmit cast to a union type.

        The arguments are similar to emit_cast.
        rx  r  r@   == NULL) {r  goto r   F)rn  rp  rq  rs  z != NULL) goto N)r   r   r  rX  r  r  r   )rX   rt  r]  r  rn  ro  rq  rr  rp  
good_labelitems              rY   r  zEmitter.emit_union_cast`  sb     	1NN////000^^%%
 	 NN3#333444NNdAAt'9'9#'>'>AAABBBNN0:000111NN3I 
	F 
	FDNN" %     NND$DDzDDDEEEE$$UCsOLLL
#####r[   c           	         |r|                      d| d           |                                 }|                     d                    |t	          |j                            | dd| dd           t          |j                  D ]C\  }}	|                     d| d	| d
||	ddd           |                      d| d| d           D|                      | d| d           |                     |           dS )zTEmit cast to a tuple type.

        The arguments are similar to emit_cast.
        rx  r  zJif (unlikely(!(PyTuple_Check({r}) && PyTuple_GET_SIZE({r}) == {size}))) {{)rsizez = NULL;r  r   zPyTuple_GET_ITEM(r   r?  F)rn  rp  rq  r@  z == NULL) goto r  N)	r   r   r   rO  r   r  rP  r  r   )
rX   rt  r]  r  rn  ro  rr  	out_labelr  r  s
             rY   r  zEmitter.emit_tuple_cast  s]     	1NN////000 NN$$	X__C	NN `    I   	
 	
 	
 !++ 
	E 
	EGAtNN/C//1///" %     NNC$CCyCCCDDDD$))3)))***	"""""r[   r9  c                4   |rG|                      d| d           |                      | d|                     |           d           |dk    r/|                      d                    |rdnd|                     d S |r|                      d           d S d S )	Nr@  r  r  r  r   z{}if {}z} else rz  )r   r  rO  )rX   rt  r]  r  r9  rq  s         rY   r  zEmitter.emit_arg_check  s     	CNN3#333444NNdAAt'9'9#'>'>AAABBBB;;NN9++,IIIr5QQRRRRR 	%NN8$$$$$	% 	%r[   )rn  ro  rp  rq  borrowr  c          
     Z   |pt                      }t          |t                     r| d|                     |           d}	nIt          |t                    rd|j        z  }	n)t          |t
                    s
J |            d|j        z  }	|r!d|                     |           d| d}
|
|	z   }	t          |          st          |          r|r| 
                    d| d           |                     |||d	| d
|           |r| 
                    d| d| d           n| 
                    d| d| d           | 
                    d           | 
                    |	           | 
                    d           d)S t          |          r|r| 
                    d| d           |                     |||d| d|           | 
                    |	           | 
                    d           | d}| 
                    d| d| d           d)S t          |          r}|r| 
                    d| d           |                     |||d| d|           | 
                    |	           | 
                    d           | 
                    d| d           d)S t          |          rj|rJ |r| 
                    d| d           | 
                    | d| d           t          |t                     s|                     |||	           d)S d)S t!          |          rj|rJ |r| 
                    d| d           | 
                    | d| d           t          |t                     s|                     |||	           d)S d)S t#          |          rj|rJ |r| 
                    d| d           | 
                    | d| d           t          |t                     s|                     |||	           d)S d)S t%          |          rj|rJ |r| 
                    d| d           | 
                    | d | d           t          |t                     s|                     |||	           d)S d)S t'          |          rW|rJ |r| 
                    d!| d           | 
                    | d"| d           |                     d#| d$|	d           d)S t          |t*                    r=|                     |           |r.| 
                    |                     |           d%| d           |r\| 
                    d#| d&           | 
                    | d|                     |           d           | 
                    d'           |                                 }|                     |||d(|d)*           | 
                    d+| d,           | 
                    |	           | 
                    d'           |j        s| 
                    | d-           t7          |j                  D ]\  }}|                                 }| 
                    d.| d/| d0| d           |                                 }|j        r|                     |||||d(|1           n6|s|                     |t>                     |                      |||d(2           | 
                    | d3| d| d           | 
                    d           |r| 
                    d           d)S d)S t          |tB                    r|r.| 
                    |                     |           d%| d           |r\| 
                    d#| d&           | 
                    | d|                     |           d           | 
                    d'           tE          j#        |j$                  }|| 
                    | d| d4| d           n|%                                }|&                                }|tN          v rtQ          tN          |                   }n| )                    |          }|d5k    r| 
                    | d6| d0| d           n!| 
                    | d7| d0| d0| d           | 
                    d8| d9           | 
                    |	           | 
                    d           |r| 
                    d           d)S d)S J d;|z              )<a  Emit code for unboxing a value of given type (from PyObject *).

        By default, assign error value to dest if the value has an
        incompatible type and raise TypeError. These can be customized
        using 'error' and 'raise_exception'.

        Generate a new reference unless 'borrow' is True.

        Args:
            src: Name of source C variable
            dest: Name of target C variable
            typ: Type of value
            declare_dest: If True, also declare the variable 'dest'
            error: What happens on error
            raise_exception: If True, also raise TypeError on failure
            optional: If True, NULL src value is allowed and will map to error value
            borrow: If True, create a borrowed reference

        r  r  r  r  r  r  r  z
CPyTagged z(likely(PyLong_Check(z)))ry  z = CPyTagged_BorrowFromObject(rg  z = CPyTagged_FromObject(rz  r   zchar z(unlikely(!PyBool_Check(z))) {z} elsez == Py_Truez
(unlikely(z != Py_None)) {z = 1;zint64_t z = CPyLong_AsInt64(zint32_t z = CPyLong_AsInt32(zint16_t z = CPyLong_AsInt16(zuint8_t z = CPyLong_AsUInt8(zdouble z = PyFloat_AsDouble(r@  z == -1.0 && PyErr_Occurred()) {r   r  } else {TN)rn  ro  rr  r5  z == NULL)) {z.empty_struct_error_flag = 0;rx  z = PyTuple_GET_ITEM(r   )rp  ro  rn  r  rn  rN  z.unbox(r   z = VecTApi.unbox(z = VecNestedApi.unbox(zif (VEC_IS_ERROR(r6  FzUnboxing not implemented: %s)*rs   rU   r  ru   rv   r   r   rl  r0   r8   r   r  r&   r3   r/   /emit_unbox_failure_with_overlapping_error_valuer.   r-   r;   r+   r   r!   r[  r   r   r  r  rP  r  
emit_unboxr`  r<   r  r$   r>   r   rQ  r  r  r?   rV   r  )rX   rt  r]  r  rn  ro  rp  rq  r  failure	raise_exc
conversion	cast_tempr  rQ  temptemp2specialized_api_namer  r  r  s                        rY   r  zEmitter.emit_unbox  sA   > (e]++ 	1<<$"4"4S"9"9<<<GG{++ 	1 5;.GGe]33::U:::"U[0G 	*L$*:*:3*?*?LLCLLLI')GS!! S	?%<S%A%A S	? 53D333444T30P0P0P0PRZ[[[ MQdQQ#QQQRRRRKdKKCKKKLLLNN8$$$NN7###NN3&s++ H	? 0t///T30V30V0V0VX`aaaNN7###NN8$$$,,,JNN8$88:88899999$$ 	? 0t///T30RS0R0R0RT\]]]NN7###NN8$$$NN-$---..... %% w	? 31$111222NNd>>s>>>???e]33 YDDT3PWXXXXXY Y %% o	? 31$111222NNd>>s>>>???e]33 YDDT3PWXXXXXY Y %% g	? 31$111222NNd>>s>>>???e]33 YDDT3PWXXXXXY Y %% _	? 31$111222NNd>>s>>>???e]33 YDDT3PWXXXXXY Y %% W	? 20000111NNd?????@@@OOI4III7TWXXXXXV$$ P	?%%c*** =$**S//;;D;;;<<<  +7c777888$EE4+=+=c+B+BEEEFFFz***((I  Y$ed !    NNC9CCCDDD
 NN7###NN:&&&9 G$EEEFFF )#) 4 4 : :9~~''RDRRcRRQRRRSSS((' NOO!(7#%)% $     " C))$0ABBBNN4	NMMM$88!888889999NN3 $s#####$ $T"" 	? =$**S//;;D;;;<<< +7c777888$EE4+=+=c+B+BEEEFFFz***#7#;CM#J#J #/$OO+?OOOOOPPPP		0022	 222!$%7	%B!C!CJJ!%!5!5c!:!:JA::NNd#R#RS#R#RJ#R#R#RSSSSNNd#`#`##`#`#`#`W\#`#`#`aaaNN:t:::;;;NN7###NN3 $s#####$ $ ?83>>>>r[   r$   c                    |                                 }|                     |          }|J d| }|                                rd| d}|S )Nz(size_t)r  z | 1))r  
type_c_ptris_optional)rX   r  rQ  r  r  s        rY   r  zEmitter.vec_item_type_cy  se    ((**	__Y//
%%%,
,,
?? 	/.Z...Jr[   RPrimitive | RInstancec                    t          |t                    r"|j        rdt          |j                 d         z   S t          |t
                    r|                     |j                  S d S )N&r   )rU   r    rj  rB   r   r   r   r  )rX   r  s     rY   r  zEmitter.type_c_ptr  sb    c:&& 	73+< 	7sx0333Y'' 	7((666tr[   
can_borrowc                \   |rd}nd}t          |          st          |          r|                     | | d| d           dS t          |          r>|                     | | d| d           |s|                     |t                     dS dS t          |          r;|                     | | d           |s|                     |t                     dS dS t          |          st          |          st          |          r|                     | | d| d           dS t          |          r|                     | | d	| d           dS t          |          r|                     | | d
| d           dS t          |t                    r@|                     |           |j        s|                     | | d           dS |                     | | dt#          |j                   d           |                     d| d           |                     d           t%          t#          |j                            D ]}|j        s"|                     d| d| d| d|            +|                                 }|                     | d| ||j        |         d           |                     d| d| d| d           dS t          |t,                    rt/          j        |j                  }	|	|	}
nW|                                dk    rd}
n<d}
|                     |          }|                     | | d|
 d| d| d	           dS |                     | | d|
 d| d           dS |j        rJ |                     | | d| d           dS )zEmit code for boxing a value of given type.

        Generate a simple assignment if no boxing is needed.

        The source reference count is stolen for the result (no need to decref afterwards).
        rx  r   z = CPyTagged_StealAsObject(rg  r  z ? Py_True : Py_False;z = Py_None;z = PyLong_FromLong(z = PyLong_FromLongLong(z = PyFloat_FromDouble(z% = CPyTuple_LoadEmptyTupleConstant();z = PyTuple_New(r5  z
 == NULL))z    CPyError_OutOfMemory();zPyTuple_SET_ITEM(r   rN  Tr  Nr   VecNestedApiVecTApiz.box(r  )r0   r8   r   r&   r   r`  r<   r3   r.   r-   r;   r/   r+   rU   r!   r[  r  r   r  r  r   emit_boxr$   r>   r   rQ  r  r  )rX   rt  r]  r  rn  r  declarationr  
inner_namer  apirQ  s               rY   r  zEmitter.emit_box  s     	&KKKS!! 9	<%<S%A%A 9	<NNkS4SSCSSSTTTTT&s++ 6	< OO{PDPPSPPPQQQ ;!!$(9:::::; ;$$ /	< OO{=D===>>> ;!!$(9:::::; ; %% (	<)<S)A)A (	<EXY\E]E] (	<NNkK4KKCKKKLLLLL %% &	<NNkO4OOOOOPPPPP %% $	<NNkN4NNsNNNOOOOOV$$ "	<%%c***9 X+ZtZZZ[[[[[+VtVVC	NNVVVWWW?t???@@@<=== s39~~.. X XA> X'R4'R'R1'R'R'R'Rq'R'RSSSS%)^^%5%5
mmmmZ1\`aaa'V4'V'V1'V'V
'V'V'VWWWWX X T"" 	<#7#;CM#J#J #/*q$ !0055	+VtVVVV#VVVVVWWWNNkE4EECEEcEEEFFFFF~%%%NNk:4::C:::;;;;;r[   r  c                (   t          |t                    rQt          |j                  dk    rdS |                     ||| j        d          }|                     d| d           nt          |t                    r|                     d| d           nf|j        r0|                     d| d|                     |           d           n/|                     d| d|                     |           d           | 	                    |d	           dS )
zMEmit code for checking a native function return value for uncaught exception.r   Nr4  r@  rA  z.len < 0) { ==  && PyErr_Occurred()) {r   )
rU   r!   r   r  rI  r  r   r$   rB  r   )rX   r   r   r  conds        rY   emit_error_checkzEmitter.emit_error_check  s4   eV$$ 	N5;1$$66ueTEWY]^^0d0001111t$$ 	NNN5%5556666  	N NN`%``T-?-?-F-F```aaaaNNL%LLT-?-?-F-FLLLMMM%%%%%r[   c                z   |j         sdS t          |t                    rT|j        dk    rI|                     d| d           |                     d| d           |                     d           dS t          |t
                    r7t          |j                  D ] \  }}|                     | d| |           !dS t          |t                    r|                     d	| d
           dS | 
                    |          dk    r|                     d	| d           dS J dt          |          z              )zEmit code for GC visiting a C variable reference.

        Assume that 'target' represents a C expression that refers to a
        struct member, such as 'self->x'.
        Nbuiltins.intif (CPyTagged_CheckLong(r6  z Py_VISIT(CPyTagged_LongAsObject(z));r   rN  z	Py_VISIT(r_  rx  rg  Fz&emit_gc_visit() not implemented for %s)rj  rU   r    r   r   r!   rP  r  emit_gc_visitr$   r   reprrX   r  r   r  rQ  s        rY   r  zEmitter.emit_gc_visit  sy    " 	QFz** 	Quz^/K/KNNCfCCCDDDNNIfIIIJJJNN3v&& 		Q )%+ 6 6 @ @9""f#3#3#3#3Y????@ @t$$ 	QNN5v55566666ZZ,..NN1v11122222PBT%[[PPPPr[   c                2   |j         sdS t          |t                    r|j        dk    r|                     d| d           |                     d| d           |                     | d|                     |           d           |                     d           |                     d	           dS t          |t                    r7t          |j                  D ] \  }}| 	                    | d
| |           !dS t          |t                    r|                     d| d           dS |                     |          dk    r4|                     |          dk    r|                     d| d           dS J dt          |          z              )zEmit code for clearing a C attribute reference for GC.

        Assume that 'target' represents a C expression that refers to a
        struct member, such as 'self->x'.
        Nr  r  r6  CPyTagged __tmp = r  r  *Py_XDECREF(CPyTagged_LongAsObject(__tmp));r   rN  z	Py_CLEAR(r_  rx  r  rg  Fz&emit_gc_clear() not implemented for %s)rj  rU   r    r   r   r  r!   rP  r  emit_gc_clearr$   r   r  r  s        rY   r  zEmitter.emit_gc_clear  s    " 	QFz** 	Quz^/K/KNNCfCCCDDDNN9999:::NNfII)?)?)F)FIIIJJJNNGHHHNN3v&& 		Q )%+ 6 6 @ @9""f#3#3#3#3Y????@ @t$$ 	QNN5v55566666ZZ,..43I3I%3P3PTZ3Z3ZNN1v11122222PBT%[[PPPPr[   c                   t          |t                    r7t          |j                  D ] \  }}|                     | d| |           !dS |j        s"|                     | d|j         d           dS t          |t                    r|j	        dk    r|                     d| d           |                     d| d           |                     | d| 
                    |           d           |                     d           |                     d	           |                     | d| 
                    |           d           |                     d
           dS |                     ||           dS )a  Emit attribute clear before object is added into freelist.

        Assume that 'target' represents a C expression that refers to a
        struct member, such as 'self->x'.

        Unlike emit_gc_clear(), initialize attribute value to match a freshly
        allocated object.
        rN  r  r  r  r  r6  r  r  r  r   N)rU   r!   rP  r  emit_reuse_clearrj  r   r  r    r   r  r  r  s        rY   r  zEmitter.emit_reuse_clear  s    eV$$ 	. )%+ 6 6 C C9%%&6&61&6&6	BBBBC C$ 	.NNf==):===>>>>>z** 		.uz^/K/KNNCfCCCDDDNN9999:::NNfII)?)?)F)FIIIJJJNNGHHHNN:&&&NNfII)?)?)F)FIIIJJJNN3vu-----r[   r}   r   r   c                2    |                      d|||          S )NCPy_AddTraceback)_emit_traceback)rX   r}   r~   r   s       rY   r  zEmitter.emit_traceback0  s      ##$6[Rabbbr[   c               n    d}d|                      |           d}|                     ||||||          S )NCPy_TypeErrorTraceback")type_strrt  )rl  r  )rX   r}   r~   r   r  rt  funcr  s           rY   r  z!Emitter.emit_type_error_traceback5  sR     (/t'',,///##+{OhTW $ 
 
 	
r[   r  r  c                \   | j         j        r|d         dk    s
J d            |                     d|          }d||                    dd          |d         |d         |fz  }|r|sJ |d| d| z  }|d	z  }|                     |           t
          r|                     d
           d S d S )Nr   r   z,Traceback cannot have a negative line numberglobalsz%s("%s", "%s", %d, %s\z\\r   rg  z7assert(PyErr_Occurred() != NULL && "failure w/o err!");)r   re   r   r   r   rD   )	rX   r  r}   r~   r   r  rt  globals_staticr   s	            rY   r  zEmitter._emit_tracebackD  s     </ 	["1%***,Z***)))[AA&f--AA*
 
  	+JJJ***S***Dt 	VNNTUUUUU	V 	Vr[   c                    |                      d| d|                     |           d           |                      |           |                      d           d S )Nr@  r  r  r   )r   r  )rX   r]  r  r  s       rY   r  z7Emitter.emit_unbox_failure_with_overlapping_error_value_  sb     	YdYY(:(:3(?(?YYYZZZwsr[   r   
error_stmtc                   |                      |j        j        d t                    }t           |                    | j                   }| d}d| }d}	dt          |           d}
|j        r|j        j	        t          k    rdnd}d	}|                     d
| d| d| d| d| d|	 d|
 d|j         d| d| d           |                     d| d           |                     |           |S )Nr   _wrapperz(PyCFunction)zMETH_FASTCALL | METH_KEYWORDSz
PyDoc_STR(r?  truefalseCO_COROUTINEz
PyObject* z = CPyFunction_New(z, "z", "r  r   rg  zif (unlikely(!r  )r   rK   r~   r   r   r  rd   native_function_doc_initializer
class_namekindr   r   r   )rX   r  r   r   r  r   r  wrapper_namecfunc
func_flagsdochas_self_arg
code_flagss                rY   emit_cpyfunction_instancez!Emitter.emit_cpyfunction_instancef  s    !!"'"5tM!RR1288DJ//11)))'''4
A:2>>AAA!#a27<CT3T3TvvZa#
 d  d  d&  d  dX  d  dSW  d  d\a  d  deo  d  dsv  d  dz|  {B  d  d  FP  d  d  T`  d  d  d	
 	
 	
 	8888999z"""r[   )NNN)
r   rc   r   r   r   r   r   rg   rQ   rR   )rQ   rR   )rv   r   rQ   rV   )r   r   rQ   rV   )r   rV   rQ   rV   )r   r   r   rV   rQ   rV   )r   )r   rV   r   r   rQ   rR   )r   rV   rQ   rR   )rv   r   rQ   rR   )r   r   rQ   rR   )r   rV   r   rV   rQ   rR   )rQ   rV   )r~   rV   rQ   rV   )r   r   rQ   rV   )r   rV   r   rg   r   rV   rQ   rV   )r   r   rQ   rV   )r   r"   rQ   rV   )r  rV   r   r"   rQ   rR   )r  r   rQ   rV   )r  r!   rQ   r  )r   r!  rQ   rV   )r   rV   r   r   r   r!  rQ   rV   )r   rV   r   rV   r   r"   r   r   r   rV   rQ   rR   )
r   rV   r   r"   r   r   r   rV   rQ   rR   )r   rV   r   rV   r   r"   r   r   r   rV   r-  rP   rQ   rR   )r   r"   r<  rV   r=  rV   r   rV   r   rV   r   r   r;  rP   rQ   rR   )r   r"   r   rV   r=  rV   rQ   rV   )r  r!   rJ  rV   rK  rL  r=  rV   rH  rP   rQ   rV   )r  r!   rQ   rV   )rY  r!   rQ   rR   )r]  rV   r   r"   r\  rP   rQ   rR   )
r]  rV   r   r"   rc  rP   r\  rP   rQ   rR   )r  r"   rQ   rV   )rt  rV   r]  rV   r  r"   rn  rP   ro  ru  rp  rP   rq  rP   rr  rv  rs  rP   rQ   rR   )ro  rp   rt  rV   r]  rV   r  r"   rp  rP   rQ   rR   )rt  rV   r]  rV   r  r#   rn  rP   ro  rp   rq  rP   rr  rv  rp  rP   rQ   rR   )rt  rV   r]  rV   r  r!   rn  rP   ro  rp   rr  rv  rQ   rR   )rt  rV   r]  rV   r  r"   r9  rV   rq  rP   rQ   rR   )rt  rV   r]  rV   r  r"   rn  rP   ro  ru  rp  rP   rq  rP   r  rP   rQ   rR   )r  r$   rQ   rV   )r  r  rQ   rg   )FF)rt  rV   r]  rV   r  r"   rn  rP   r  rP   rQ   rR   )r   rV   r   r"   r  rV   rQ   rR   )r}   rV   r~   rV   r   r   rQ   rR   )r}   rV   r~   rV   r   r   r  r"   rt  rV   rQ   rR   )r   r   )r  rV   r}   rV   r~   rV   r   r   r  rV   rt  rV   rQ   rR   )r]  rV   r  r"   r  rV   rQ   rR   )
r  r   r   rV   r   rV   r  rV   rQ   rV   )>r]   r^   r_   r`   rZ   r   r   rv   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  r2  r/  rE  r7  rI  r  rS  r[  r`  ri  rl  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ra   r[   rY   r   r      s       ''
 04/3#! ! ! ! !"   ! ! ! !& & & &2 2 2 2" " " ") ) ) )(      ! ! ! !	. 	. 	. 	.1 1 1 1* * * *
5 5 5 54 4 4 4   4= = = =
 FS ; ; ; ; ;"M M M M      K K K K	 	 	 	- - - -8 8 8 8   *       ( ( ( (P P P PL L L L       2 + + + + + +,D D D D* !%" " " " " "HV V V V1 1 1 1 
 
 
 
 EJ @ @ @ @ @ @8 ;@e$A $A $A $A $A $AN    #%) $!%_; _; _; _; _; _;B7 7 7 70$$ $$ $$ $$L(# (# (# (#T% % % % #%) $~? ~? ~? ~? ~? ~?@       _dG< G< G< G< G<R& & & &$Q Q Q Q0Q Q Q Q4. . . .2c c c c

 
 
 
* V V V V V6        r[   r   )indented
componentsr  r  rP   rQ   rV   c                  |rdnd}g }g }d}| D ]}|r)|dz   t          |          z   t          |          z   dk     r+|                    |           |t          |          dz   z  }X|                    |d                    |          z              |g}t          |          }|sdd                    |          z  S |                    |d                    |          z              dd	                    |          z   d
z   |z   dz   S )a4  Construct an initializer for a C array variable.

    Components are C expressions valid in an initializer.

    For example, if components are ["1", "2"], the result
    would be "{1, 2}", which can be used like this:

        int a[] = {1, 2};

    If the result is long, split it into multiple lines.
    ry  r   r   r   F   r   z{%s}z{
    z,
    r   r   )r   r   r   )r  r  r   rescurrentcur_lencs          rY   c_array_initializerr  z  s#    !(WWbF
CGG   	'A+F3c!ff<rAANN1s1vvz!GGJJv		' 2 22333cG!ffGG +		'****JJv		'***+++y~~c***T1F:S@@r[   r  r   c                z    t          |           }|dS | d}t          |                    dd                    S )Nr  z
--

asciibackslashreplace)errors)r   r   encode)r  text_sig	docstrings      rY   r  r    sJ    !$''Hv%%%I	 0 0AS 0 T TUUUr[   )r  r  r  rP   rQ   rV   )r  r   rQ   rV   )_r`   
__future__r   r   r   r   collections.abcr   typingr   mypyc.codegen.cstringr   mypyc.codegen.literalsr   mypyc.commonr   r	   r
   r   r   r   r   r   r   r   r   mypyc.ir.class_irr   r   mypyc.ir.func_irr   r   r   r   mypyc.ir.opsr   r   r   r   r   r   mypyc.ir.rtypesr   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?   mypyc.namegenr@   rA   mypyc.primitives.registryrB   mypyc.sametyperC   rD   __annotations__rE   rG   rc   rp   rs   ru   r|   r   r   r  r  ra   r[   rY   <module>r     s   $ $ $ " " " " " "  



  $ $ $ $ $ $       6 6 6 6 6 6 + + + + + +                          < ; ; ; ; ; ; ; T T T T T T T T T T T T               " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "F 7 6 6 6 6 6 6 6 3 3 3 3 3 3 ' ' ' ' ' '      mKm	
    ) ) ) ) ) ) ) )@#? #? #? #? #? #? #? #?L> > > > > > > >* * * * *L * * *    ,   	/ 	/ 	/ 	/ 	/l 	/ 	/ 	/    L   x x x x x x x xv% DI A A A A A A@V V V V V Vr[   