
    \j              	         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<   dddddddddZUdeSd<    G d d          ZV G d  d!          ZW G d" d#          ZX G d$ d%eX          ZY G d& d'eX          ZZ G d( d)eX          Z[ G d* d+eX          Z\ G d, d-          Z]dd.d9d5Z^d:d8Z_dS );z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_MAPVEC_I64VEC_I32VEC_I16VEC_U8	VEC_FLOATVEC_BOOLVEC_T
VEC_NESTED)VecI64VecI32VecI16VecU8VecFloatVecBoolVecT	VecNestedVEC_MACRO_PREFIXc                  (    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] | NonerY   set[str] | NonerZ   boolr[   returnNonec                   t          |t                    r|gn|| _        || _        |pt	                      | _        || _        || _        d S N)
isinstancestrr\   r^   setrY   rZ   r[   )selfr\   r^   rY   rZ   r[   s         V/var/www/app.qaans.com/backend/venv/lib/python3.11/site-packages/mypyc/codegen/emit.py__init__zHeaderDeclaration.__init__s   sM     )s33=TFF		(1CEE(    re   )r\   r]   r^   r_   rY   r`   rZ   ra   r[   ra   rb   rc   __name__
__module____qualname____doc__rk    rl   rj   rX   rX   c   sQ         $ "&)
 )-") ) ) ) ) ) ) )rl   rX   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_checksra   
group_name
str | None	group_mapdict[str, str | None] | Nonerb   rc   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_counterru   rw   ry   rh   
group_depsdeclarationsr   literalsrv   )ri   ru   rv   rw   ry   s        rj   rk   zEmitterContext.__init__   sS     
$"b$'EE ;= 

'>$$$rl   )NN)
ru   r@   rv   ra   rw   rx   ry   rz   rb   rc   rm   rr   rl   rj   rt   rt      s;        77 "&26 ?  ?  ?  ?  ?  ?  ?rl   rt   c                      e Zd ZdZdS )ErrorHandlerz3Describes handling errors in unbox/cast operations.Nrn   ro   rp   rq   rr   rl   rj   r   r      s        ====rl   r   c                      e Zd ZdZdS )AssignHandlerzAssign an error value on error.Nr   rr   rl   rj   r   r      s        ))))rl   r   c                      e Zd ZdZddZdS )	GotoHandlerzGoto label on error.labelrg   rb   rc   c                    || _         d S re   r   ri   r   s     rj   rk   zGotoHandler.__init__       


rl   N)r   rg   rb   rc   rm   rr   rl   rj   r   r      s.             rl   r   c                      e Zd ZdZdd
ZdS )TracebackAndGotoHandlerz+Add traceback item and goto label on error.r   rg   source_pathmodule_nametraceback_entrytuple[str, int]rb   rc   c                >    || _         || _        || _        || _        d S re   )r   r   r   r   )ri   r   r   r   r   s        rj   rk   z TracebackAndGotoHandler.__init__   s)     
&&.rl   N)
r   rg   r   rg   r   rg   r   r   rb   rc   rm   rr   rl   rj   r   r      s.        55/ / / / / /rl   r   c                      e Zd ZdZddZdS )	ReturnHandlerz!Return a constant value on error.valuerg   rb   rc   c                    || _         d S re   )r   )ri   r   s     rj   rk   zReturnHandler.__init__   r   rl   N)r   rg   rb   rc   rm   rr   rl   rj   r   r      s.        ++     rl   r   c                  V   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dd2Zefdd6Zdd7Zdd:Zdd;Zdd=Zdd>Zdd?ZddBZddCZddDZddHZ ddKZ!ddLZ"ddOZ#ddPZ$ddSZ%dTdUddYZ&ddZZ'd[d\ddaZ(ddbZ)ddcZ*ddeZ+dTdfddiZ,dTdTdjddlZ-ddnZ.dTdd[dTdd[doddyZ/dd{Z0dd}Z1dd~Z2ddZ3dTdd[dTdTdddZ4ddZ5ddZ6	 dddZ7ddZ8ddZ9ddZ:ddZ;ddZ<ddZ=	 	 dddZ>ddZ?ddZ@ddddZAdS )EmitterzHelper for C code generation.Ncontextrt   value_namesdict[Value, str] | Nonecapi_versiontuple[int, int] | Nonefilepathrx   rb   rc   c                    || _         |pt          j        d d         | _        |j        | _        |pi | _        g | _        d| _        || _        d S )N   r   )	r   sysversion_infor   ru   r   	fragments_indentr   )ri   r   r   r   r   s        rj   rk   zEmitter.__init__   sS     (@C,<RaR,@]
&,"$& rl   c                &    | xj         dz  c_         d S )N   r   ri   s    rj   indentzEmitter.indent   s    rl   c                @    | xj         dz  c_         | j         dk    sJ d S )Nr   r   r   r   s    rj   dedentzEmitter.dedent   s+    |q      rl   r   r   rg   c                    d|j         z  S )NzCPyL%sr   r   s     rj   r   zEmitter.label   s    %+%%rl   regr   c                ,    t           | j        |         z   S re   )r   r   )ri   r   s     rj   r   zEmitter.reg   s    D,S111rl   namec                    t           |z   S re   )r   )ri   r   s     rj   attrzEmitter.attr   s    T!!rl   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 re   rr   ).0x	formatteds     rj   	<genexpr>z,Emitter.object_annotation.<locals>.<genexpr>   s'      ::!qI~::::::rl   )z/*z*/  
   )maxsplit    z /* z */)	r   lenpprintpformatmaxanysplittextwrapr   )ri   r   r   
line_width
first_linerestcomment_continuedr   s          @rj   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>>>>()((((rl   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   )ri   r   r   comments       rj   	emit_linezEmitter.emit_line  s    ??3 	KKMMM7:$((d333BdlS047'ADHIII== 	KKMMMMM	 	rl   linesc                :    |D ]}|                      |           d S re   )r   )ri   r   r   s      rj   
emit_lineszEmitter.emit_lines  s0     	! 	!DNN4    	! 	!rl   BasicBlock | strc                    t          |t                    r|}n)|j        dk    s|j        sd S |                     |          }| j                            | d           d S )Nr   z: ;
)rf   rg   r   
referencedr   r   )ri   r   texts      rj   
emit_labelzEmitter.emit_label  sh    eS!! 	%DD{au'7::e$$Dnnn-----rl   emitterc                D    | j                             |j                    d S re   )r   extend)ri   r   s     rj   emit_from_emitterzEmitter.emit_from_emitter  s!    g/00000rl   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)ri   r   r   s      rj   emit_printfzEmitter.emit_printf  sb    kk$&&}tyy&3,$t**1L'M'MMNNN()))))rl   c                J    | j         xj        dz  c_        d| j         j        z  S )Nr   z__tmp%dr   r|   r   s    rj   	temp_namezEmitter.temp_name"  s(    !!Q&!!4<444rl   c                J    | j         xj        dz  c_        d| j         j        z  S )Nr   z__LL%dr   r   s    rj   	new_labelzEmitter.new_label&  s(    !!Q&!!$,333rl   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   ry   getrw   r}   addrA   )ri   r   groupstarget_group_names       rj   get_module_group_prefixzEmitter.get_module_group_prefix*  sq    $ '"JJ{33 	!2dl6M!M!ML#''(9:::Am,=>>AAAA2rl   ClassIR | FuncDeclc                6    |                      |j                  S )z#Get the group prefix for an object.)r   r   )ri   r   s     rj   get_group_prefixzEmitter.get_group_prefixD  s     ++CO<<<rl   clr   c                    | j         j                            |j                  }|r1|| j         j        k    r#| j         j                            |           dS dS dS )a/  Record `cl`'s defining group as a cross-group dep, if any.

        Call this when emitting code that refers to `cl`'s struct
        layout: the .c file consuming that layout needs the defining
        group's `__native_*.h` included, and group_deps drives which
        headers get pulled in.
        N)r   ry   r   r   rw   r}   r   )ri   r   target_groups      rj   register_group_depzEmitter.register_group_depI  sd     |-11".AA 	6LDL,CCCL#''55555	6 	6CCrl   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   ru   private_name)ri   r  r  r  
lib_prefix
star_maybesuffixs          rj   static_namezEmitter.static_nameU  sf      &ORR4+G+G+O+O
 '.SSB
((2r:::j:&:&:::rl   c                P    |                      |j        |j        t                    S )Nr  )r  r   r   r   )ri   r   s     rj   type_struct_namezEmitter.type_struct_namef  s!    LLLrl   rtyper"   c                    |j         S re   )_ctyperi   r  s     rj   ctypezEmitter.ctypei  s
    |rl   c                R    |                      |          }|d         dk    r|S |dz   S )z*Adds a space after ctype for non-pointers.r  r   )r  )ri   r  r  s      rj   ctype_spacedzEmitter.ctype_spacedl  s1    

5!!9L3;rl   targetc                    t          |t                    r2|                     | d           |                     | d           d S |                     | d|                     |           d           d S )Nz
.len = -1;.items = NULL; = ;)rf   r$   r   c_undefined_value)ri   r  r  s      rj   set_undefined_valuezEmitter.set_undefined_valuet  s    eT"" 	KNNf000111NNf44455555NNfII)?)?)F)FIIIJJJJJrl   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_unboxedrf   r    c_undefinedr!   tuple_undefined_valuer$   r  r  s     rj   r  zEmitter.c_undefined_value{  s     	;6z** 	;$$v&& 	;--e444t$$ 	;:tzz%((::::erl   c                ,    |                      |          S re   )r  r  s     rj   c_error_valuezEmitter.c_error_value  s    %%e,,,rl   fnr   c                H    t            |                    | j                   S re   )r   cnameru   ri   r'  s     rj   native_function_namezEmitter.native_function_name  s!    7$*!5!5777rl   c                Z    |                      |           |                     |           S )a  Return the C expression for a call to `fn`'s native (CPyDef_) entry.

        For cross-group references under `separate=True`, this prepends the
        exports-table indirection (e.g. `exports_other.CPyDef_foo`). Same as
        `native_function_name()` for in-group calls.
        )r   r+  r*  s     rj   native_function_callzEmitter.native_function_call  s1     ''++LT-F-Fr-J-JLLLrl   c                r    |                      |           t           |                    | j                   S )zReturn the C expression for a call to `fn`'s Python-wrapper (CPyPy_) entry.

        Like `native_function_call`, but for the PyObject-level wrapper that
        boxes/unboxes arguments. Used from slot generators (tp_init, etc.).
        )r   r   r)  ru   r*  s     rj   wrapper_function_callzEmitter.wrapper_function_call  s6     ''++KVKRXXdj5I5IKKKrl   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  )ri   r0  resultityps        rj   tuple_c_declarationzEmitter.tuple_c_declaration  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rl   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	   )ri   r:  ns      rj   bitmap_fieldzEmitter.bitmap_field  s,    [ 668Arl   c                |    d|                     | j                   d}|                     |          }d| | d| S )z5Return reference to the attribute definedness bitmap.r!   *))->)r4  ru   r?  )ri   r   r   r:  castr   s         rj   attr_bitmap_exprzEmitter.attr_bitmap_expr  sN    22>>$*--222  '''4''''''rl   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)ri   r   r   r  r   r   s         rj   emit_attr_bitmap_setzEmitter.emit_attr_bitmap_set  s+     	%%eS%T%OOOOOrl   c                <    |                      d||||d           dS )z}Mark an attribute as undefined in the attribute bitmap.

        Unlike emit_attr_bitmap_set, clear unconditionally.
        r   TrF  NrH  )ri   r   r  r   r   s        rj   emit_attr_bitmap_clearzEmitter.emit_attr_bitmap_clear  s+    
 	%%b#ub$d%KKKKKrl   rG  ra   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	   rD  )ri   r   r   r  r   r   rG  checkr:  maskr=  s              rj   rI  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	  	 rl   F)unlikely	attr_exprcomparerU  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!  rA  z && !((rB  z & if () {)	rQ  error_overlaprR  r:  r	   r?  r4  ru   r   )ri   r  rV  rW  r   r   r   rU  rS  r:  bitobj_exprs               rj   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)))*****rl   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_exceptionrN  z.len < 0z!=z	.len >= 0r   )rf   r!   tuple_undefined_check_condr&  r$   )ri   r  r   rW  s       rj   rQ  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Crl   Tra  tuple_expr_in_cc_type_compare_valCallable[[RType], str]rb  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   r5  formatr%   r\  	enumeraterf   r!   rc  r$   )
ri   r0  rd  re  rW  rb  r7  	item_typer8  rS  s
             rj   rc  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//Lrl   c                B    d|j          d|                     |           S )z0Undefined tuple value suitable in an expression.r!  z) )r4  c_initializer_undefined_value)ri   r0  s     rj   r$  zEmitter.tuple_undefined_value(  s)    U6%UU)K)KF)S)SUUUrl   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 rr   )rm  )r   tri   s     rj   
<listcomp>z9Emitter.c_initializer_undefined_value.<locals>.<listcomp>3  s'    ZZZtAA!DDZZZrl   z{ -1, NULL })rf   r!   r5  r%   r#  r   r$   r  )ri   r  itemss   `  rj   rm  z%Emitter.c_initializer_undefined_value,  s    eV$$ 
	1; = =^7<<<<IIZZZZekZZZ[[E#####t$$ 	1!>))%000rl   
tuple_typec                ,   |j         | j        j        vrt                      }|j        D ]1}t          |t                    r|                    |j                    2t          | 	                    |          |d          | j        j        |j         <   d S d S )NT)rY   rZ   )
r4  r   r~   rh   r5  rf   r!   r   rX   r9  )ri   rs  rY   r8  s       rj   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Brl   )raredestrv  c               B   t          |          r6|r|                     d|z             dS |                     d|z             dS t          |t                    r7t	          |j                  D ] \  }}|                     | d| |           !dS t          |t                    r/t          |j	                 }|                     | 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);rh  z_INCREF();zCPy_INCREF(%s);zCPy_INCREF_NO_IMM(%s);N)r0   r   rf   r!   rj  r5  emit_inc_refr$   rV   r  r"  may_be_immortalr   )ri   rw  r  rv  r7  rk  r  s          rj   rz  zEmitter.emit_inc_refH  sf    U## 	@ ?6=>>>>>6=>>>>>v&& 	@ )%+ 6 6 = =9!!T..Q..)<<<<= =t$$ 	@%el3FNNf66d66677777! 	@$ @M @047888887$>?????	@ 	@rl   is_xdecrv  r}  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                    r/t          |j	                 }|                     | 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(ry  zDECREF(rh  r|  z_DECREF(CPy_zDECREF_NO_IMM(Fzdec_ref not implemented for N)r0   r   rf   r!   rj  r5  emit_dec_refr$   rV   r  r"  r{  r   is_refcounted)	ri   rw  r  r}  rv  r   r7  rk  r  s	            rj   r  zEmitter.emit_dec_refc  s    "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%el3FNNf66d66677777! 
	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rl   r8  c                r    t          |          }|d|                     |          z  S t          |          S )Nz
%s or None)r=   pretty_namerg   )ri   r8  
value_types      rj   r  zEmitter.pretty_name  s9    (--
!$"2"2:">">>>3xxrl   )declare_desterrorraise_exceptionoptionalsrc_typelikelysrcr  r  ErrorHandler | Noner  r  r  RType | Noner  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(likelyrY      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 rr   )r  )r   irri   s     rj   rq  z%Emitter.emit_cast.<locals>.<listcomp>  s'    %S%S%SBd&;&;B&?&?%S%S%Srl   )r  targetsz({} == Py_None)r   r   r  z(CPyz_Check())z	(Py_TYPE(z) == z.boxed_type)r   z4) == VecTApi.boxed_type && VEC_T_BUF(((VecTObject *)z)->vec)->item_type == zC) == VecNestedApi.boxed_type && VEC_NESTED_BUF(((VecNestedObject *)z' && VEC_NESTED_BUF(((VecNestedObject *)z)->vec)->depth == zCast not implemented: %s)1r   r5   r4   r=   rC   r   emit_arg_checkri  r   emit_cast_error_handlerr1   r)   r7   r,   r9   r6   r+   r0   r&   r*   r(   r'   r:   r  rf   r   r   class_irr   r
   r  ranger3   r2   r   rsplitr#   emit_union_castr!   emit_tuple_castr$   r>   r   rk  depthvec_item_type_cunwrap_item_typer?   rg   )ri   r  rw  r8  r  r  r  r  r  r  r  rS  r  concretefull_strr7  
short_nameapi_namer  item_type_c	unwrapped
type_values   `                     rj   	emit_castzEmitter.emit_cast  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Z Z Z03Z ZKVZ Z Z   0022	 222!$%7	%B!C!CJJ!%!5!5c!:!:JZ Z Z:=Z ZU_Z Z:=Z ZQVZ Z Z 
  +*%***T3x@@@OO2422C222H===((T3PPPNN3:4s::::rl   r   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)r8  r  goto %s;CPy_TypeError("", ); z
%s = NULL;
return %s;)rf   r   emit_type_error_tracebackr   r   r   r   r   r  r   r   emit_tracebackr   r   )ri   r  r  rw  r8  r  s         rj   r  zEmitter.emit_cast_error_handlern  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6rl   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.
        r  r  rZ   == NULL) {r  goto r   F)r  r  r  r  z != NULL) goto N)r   r   r&  rr  r  r  r   )ri   r  rw  r8  r  r  r  r  r  
good_labelitems              rj   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
#####rl   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.
        r  r  zJif (unlikely(!(PyTuple_Check({r}) && PyTuple_GET_SIZE({r}) == {size}))) {{)rsizez = NULL;r  r   zPyTuple_GET_ITEM(r   rY  F)r  r  r  rZ  z == NULL) goto r  N)	r   r   r   ri  r   r5  rj  r  r   )
ri   r  rw  r8  r  r  r  	out_labelr7  r  s
             rj   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)))***	"""""rl   rS  c                4   |rG|                      d| d           |                      | d|                     |           d           |dk    r/|                      d                    |rdnd|                     d S |r|                      d           d S d S )	NrZ  r  r  r  r   z{}if {}z} else r  )r   r&  ri  )ri   r  rw  r8  rS  r  s         rj   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$$$$$	% 	%rl   )r  r  r  r  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)))r  z = CPyTagged_BorrowFromObject(ry  z = CPyTagged_FromObject(r  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(rZ  z == -1.0 && PyErr_Occurred()) {r   r  } else {TN)r  r  r  rO  z == NULL)) {z.empty_struct_error_flag = 0;r  z = PyTuple_GET_ITEM(r   )r  r  r  r  r  rh  z.unbox(r   z = VecTApi.unbox(z = VecNestedApi.unbox(zif (VEC_IS_ERROR(rP  FzUnboxing not implemented: %s)*r   rf   r&  r   r   r   r   r  r0   r8   r   r  r&   r3   r/   /emit_unbox_failure_with_overlapping_error_valuer.   r-   r;   r+   r   r!   ru  r  r   r  r5  rj  r"  
emit_unboxrz  r<   r  r$   r>   r   rk  r  r  r?   rg   r  )ri   r  rw  r8  r  r  r  r  r  failure	raise_exc
conversion	cast_tempr7  rk  temptemp2specialized_api_namer  r  r  s                        rj   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>>>>rl   r$   c                    |                                 }|                     |          }|J d| }|                                rd| d}|S )Nz(size_t)r!  z | 1))r  
type_c_ptris_optional)ri   r8  rk  r  r  s        rj   r  zEmitter.vec_item_type_c  se    ((**	__Y//
%%%,
,,
?? 	/.Z...Jrl   RPrimitive | RInstancec                    t          |t                    r"|j        rdt          |j                 d         z   S t          |t
                    r|                     |j                  S d S )N&r   )rf   r    r  rB   r   r   r  r  )ri   r8  s     rj   r  zEmitter.type_c_ptr  sb    c:&& 	73+< 	7sx0333Y'' 	7((666trl   
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).
        r  r   z = CPyTagged_StealAsObject(ry  r  z ? Py_True : Py_False;z = Py_None;z = PyLong_FromLong(z = PyLong_FromLongLong(z = PyFloat_FromDouble(z% = CPyTuple_LoadEmptyTupleConstant();z = PyTuple_New(rO  z
 == NULL))z    CPyError_OutOfMemory();zPyTuple_SET_ITEM(r   rh  Tr  Nr   VecNestedApiVecTApiz.box(r  )r0   r8   r   r&   r   rz  r<   r3   r.   r-   r;   r/   r+   rf   r!   ru  r5  r   r  r"  r   emit_boxr$   r>   r   rk  r  r  )ri   r  rw  r8  r  r  declarationr7  
inner_namer  apirk  s               rj   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:::;;;;;rl   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   NrN  rZ  r[  z.len < 0) { ==  && PyErr_Occurred()) {r   )
rf   r!   r   r5  rc  r&  r   r$   r\  r   )ri   r   r  r  conds        rj   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%%%%%rl   c           	        |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                    r3t          |j                 }|                     d	| d
| 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(rP  z Py_VISIT(CPyTagged_LongAsObject());r   rh  rZ  z.items) { Py_VISIT(_BUF(z)); }r  z	Py_VISIT(ry  Fz&emit_gc_visit() not implemented for %s)r  rf   r    r   r   r!   rj  r5  emit_gc_visitr$   rV   r  r  reprri   r  r  r7  rk  r  s         rj   r  zEmitter.emit_gc_visit  s    " 	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%el3FNNY&YYfYY6YYYZZZZZZZ,..NN1v11122222PBT%[[PPPPrl   c                   |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                    rwt          |j                 }|                     d| d           |                     d| d| d           |                     d| 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  rP  CPyTagged __tmp = r  r  *Py_XDECREF(CPyTagged_LongAsObject(__tmp));r   rh  rZ  z	.items) {z    Py_DECREF(r  r  r  r  r  r   z	Py_CLEAR(ry  Fz&emit_gc_clear() not implemented for %s)r  rf   r    r   r   r  r!   rj  r5  emit_gc_clearr$   rV   r  r  r  r  s         rj   r  zEmitter.emit_gc_clear$  s8    " 	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%el3FNN4&444555NNDFDDDDDEEENN8&888999NN3ZZ,..43I3I%3P3PTZ3Z3ZNN1v11122222PBT%[[PPPPrl   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.
        rh  r  r  r  r  rP  r  r  r  r   N)rf   r!   rj  r5  emit_reuse_clearr  r   r#  r    r   r  r  )ri   r  r  r7  rk  s        rj   r  zEmitter.emit_reuse_clearB  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-----rl   r   r   r   c                2    |                      d|||          S )NCPy_AddTraceback)_emit_traceback)ri   r   r   r   s       rj   r  zEmitter.emit_traceback[  s      ##$6[Rabbbrl   c               n    d}d|                      |           d}|                     ||||||          S )NCPy_TypeErrorTraceback")type_strr  )r  r  )ri   r   r   r   r8  r  funcr  s           rj   r  z!Emitter.emit_type_error_traceback`  sR     (/t'',,///##+{OhTW $ 
 
 	
rl   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   ry  z7assert(PyErr_Occurred() != NULL && "failure w/o err!");)r   rv   r  r   r   rD   )	ri   r  r   r   r   r  r  globals_staticr   s	            rj   r  zEmitter._emit_tracebacko  s     </ 	["1%***,Z***)))[AA&f--AA*
 
  	+JJJ***S***Dt 	VNNTUUUUU	V 	Vrl   c                    |                      d| d|                     |           d           |                      |           |                      d           d S )NrZ  r  r  r   )r   r&  )ri   rw  r8  r  s       rj   r  z7Emitter.emit_unbox_failure_with_overlapping_error_value  sb     	YdYY(:(:3(?(?YYYZZZwsrl   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(rY  truefalseCO_COROUTINEz
PyObject* z = CPyFunction_New(z, "z", "r  r   ry  zif (unlikely(!r  )r  r\   r   r   r   r)  ru   native_function_doc_initializer
class_namekindr   r   r   )ri   r'  r   r   r   r  r)  wrapper_namecfunc
func_flagsdochas_self_arg
code_flagss                rj   emit_cpyfunction_instancez!Emitter.emit_cpyfunction_instance  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"""rl   r  
derived_cltp_funcc          	     p    |                      |          }|                     | | d| d| d           d S )Nz->tp_base->r!  ry  )r  r   )ri   r  r  r   r  type_objs         rj   emit_base_tp_function_callz"Emitter.emit_base_tp_function_call  sM     ((44&I(IIwIIIIIJJJJJrl   )NNN)
r   rt   r   r   r   r   r   rx   rb   rc   )rb   rc   )r   r   rb   rg   )r   r   rb   rg   )r   rg   rb   rg   )r   r   r   rg   rb   rg   )r   )r   rg   r   r   rb   rc   )r   rg   rb   rc   )r   r   rb   rc   )r   r   rb   rc   )r   rg   r   rg   rb   rc   )rb   rg   )r   rg   rb   rg   )r   r   rb   rg   )r   r   rb   rc   )r  rg   r  rx   r  rg   rb   rg   )r   r   rb   rg   )r  r"   rb   rg   )r  rg   r  r"   rb   rc   )r'  r   rb   rg   )r0  r!   rb   r1  )r:  r;  rb   rg   )r   rg   r   r   r:  r;  rb   rg   )r   rg   r   rg   r  r"   r   r   r   rg   rb   rc   )
r   rg   r  r"   r   r   r   rg   rb   rc   )r   rg   r   rg   r  r"   r   r   r   rg   rG  ra   rb   rc   )r  r"   rV  rg   rW  rg   r   rg   r   rg   r   r   rU  ra   rb   rc   )r  r"   r   rg   rW  rg   rb   rg   )r0  r!   rd  rg   re  rf  rW  rg   rb  ra   rb   rg   )r0  r!   rb   rg   )rs  r!   rb   rc   )rw  rg   r  r"   rv  ra   rb   rc   )
rw  rg   r  r"   r}  ra   rv  ra   rb   rc   )r8  r"   rb   rg   )r  rg   rw  rg   r8  r"   r  ra   r  r  r  ra   r  ra   r  r  r  ra   rb   rc   )r  r   r  rg   rw  rg   r8  r"   r  ra   rb   rc   )r  rg   rw  rg   r8  r#   r  ra   r  r   r  ra   r  r  r  ra   rb   rc   )r  rg   rw  rg   r8  r!   r  ra   r  r   r  r  rb   rc   )r  rg   rw  rg   r8  r"   rS  rg   r  ra   rb   rc   )r  rg   rw  rg   r8  r"   r  ra   r  r  r  ra   r  ra   r  ra   rb   rc   )r8  r$   rb   rg   )r8  r  rb   rx   )FF)r  rg   rw  rg   r8  r"   r  ra   r  ra   rb   rc   )r   rg   r  r"   r  rg   rb   rc   )r   rg   r   rg   r   r   rb   rc   )r   rg   r   rg   r   r   r8  r"   r  rg   rb   rc   )r   r   )r  rg   r   rg   r   rg   r   r   r  rg   r  rg   rb   rc   )rw  rg   r8  r"   r  rg   rb   rc   )
r'  r   r   rg   r   rg   r   rg   rb   rg   )
r  r   r  rg   r   rg   r  rg   rb   rc   )Brn   ro   rp   rq   rk   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/  r9  r?  rD  rJ  rL  rI  r_  rQ  rc  r$  rm  ru  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rr   rl   rj   r   r      s       ''
 04/3#! ! ! ! !"   ! ! ! !& & & &2 2 2 2" " " ") ) ) )(      ! ! ! !	. 	. 	. 	.1 1 1 1* * * *
5 5 5 54 4 4 4   4= = = =

6 
6 
6 
6 FS ; ; ; ; ;"M M M M      K K K K	 	 	 	- - - -8 8 8 8M M M ML L L L   *       ( ( ( (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H    #%) $!%_; _; _; _; _; _;B7 7 7 70$$ $$ $$ $$L(# (# (# (#T% % % % #%) $~? ~? ~? ~? ~? ~?@       _dG< G< G< G< G<R& & & &$Q Q Q Q2Q Q Q Q<. . . .2c c c c

 
 
 
* V V V V V6      ( NPK K K K K K K Krl   r   )indented
componentsr1  r  ra   rb   rg   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.
    r  r   r   r   F   r   z{%s}z{
    z,
    r   r   )r   r   r   )r  r  r   rescurrentcur_lencs          rj   c_array_initializerr    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@@rl   r  r   c                z    t          |           }|dS | d}t          |                    dd                    S )Nr   z
--

asciibackslashreplace)errors)r   r   encode)r  text_sig	docstrings      rj   r  r    sJ    !$''Hv%%%I	 0 0AS 0 T TUUUrl   )r  r1  r  ra   rb   rg   )r  r   rb   rg   )`rq   
__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   rV   rX   rt   r   r   r   r   r   r   r  r  rr   rl   rj   <module>r3     sZ   $ $ $ " " " " " "  



  $ $ $ $ $ $       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   ]K ]K ]K ]K ]K ]K ]K ]K@' DI A A A A A A@V V V V V Vrl   