
    X-Ph+                    ,   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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 ddlmZmZ ddlmZ dd	lmZmZ dd
lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z< ddl=m>Z> dZ?de@d<    G d d          ZA G d d          ZB G d d          ZC G d deC          ZD G d deC          ZE G d deC          ZF G d deC          ZG G d d          ZHdd d(d'ZIdS ))zUtilities for emitting C code.    )annotationsN)CallableFinal)Literals)ATTR_PREFIXBITMAP_BITSFAST_ISINSTANCE_MAX_SUBCLASSESHAVE_IMMORTALNATIVE_PREFIX
REG_PREFIXSTATIC_PREFIXTYPE_PREFIX)ClassIRall_concrete_classes)FuncDecl)
BasicBlockValue)	RInstance
RPrimitiveRTupleRTypeRUnionint_rprimitiveis_bit_rprimitiveis_bool_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_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)NameGeneratorexported_name)is_same_typeFr   DEBUG_ERRORSc                  (    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] | Noner7   set[str] | Noner8   boolr9   returnNonec                   t          |t                    r|gn|| _        || _        |pt	                      | _        || _        || _        d S N)
isinstancestrr:   r<   setr7   r8   r9   )selfr:   r<   r7   r8   r9   s         R/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mypyc/codegen/emit.py__init__zHeaderDeclaration.__init__O   sM     )s33=TFF		(1CEE(    rC   )r:   r;   r<   r=   r7   r>   r8   r?   r9   r?   r@   rA   __name__
__module____qualname____doc__rI    rJ   rH   r6   r6   ?   sQ         $ "&)
 )-") ) ) ) ) ) ) )rJ   r6   c                       e Zd ZdZ	 	 dddZdS )EmitterContextz-Shared emitter state for a compilation group.Nnamesr1   
group_name
str | None	group_mapdict[str, str | None] | Noner@   rA   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_counterrS   rT   rV   rF   
group_depsdeclarationsr   literals)rG   rS   rT   rV   s       rH   rI   zEmitterContext.__init__b   sI     
$"b$'EE ;= 

rJ   NN)rS   r1   rT   rU   rV   rW   r@   rA   rK   rP   rJ   rH   rR   rR   _   s;        77
 "&26	# # # # # # #rJ   rR   c                      e Zd ZdZdS )ErrorHandlerz3Describes handling errors in unbox/cast operations.NrL   rM   rN   rO   rP   rJ   rH   r_   r_      s        ====rJ   r_   c                      e Zd ZdZdS )AssignHandlerzAssign an error value on error.Nr`   rP   rJ   rH   rb   rb      s        ))))rJ   rb   c                      e Zd ZdZddZdS )	GotoHandlerzGoto label on error.labelrE   r@   rA   c                    || _         d S rC   re   rG   re   s     rH   rI   zGotoHandler.__init__       


rJ   N)re   rE   r@   rA   rK   rP   rJ   rH   rd   rd      s.             rJ   rd   c                      e Zd ZdZdd
ZdS )TracebackAndGotoHandlerz+Add traceback item and goto label on error.re   rE   source_pathmodule_nametraceback_entrytuple[str, int]r@   rA   c                >    || _         || _        || _        || _        d S rC   )re   rl   rm   rn   )rG   re   rl   rm   rn   s        rH   rI   z TracebackAndGotoHandler.__init__   s)     
&&.rJ   N)
re   rE   rl   rE   rm   rE   rn   ro   r@   rA   rK   rP   rJ   rH   rk   rk      s.        55/ / / / / /rJ   rk   c                      e Zd ZdZddZdS )	ReturnHandlerz!Return a constant value on error.valuerE   r@   rA   c                    || _         d S rC   )rs   )rG   rs   s     rH   rI   zReturnHandler.__init__   ri   rJ   N)rs   rE   r@   rA   rK   rP   rJ   rH   rr   rr      s.        ++     rJ   rr   c                     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dd2Zdd5Zdd8Zdd9Zdd:Zdd;Zdd>ZddBZddEZddFZddIZddJZ ddMZ!dNdOddSZ"ddTZ#dUdVdd[Z$dd\Z%dd]Z&dd_Z'dNd`ddcZ(dNdNddddfZ)ddhZ*dNddUdNddUdiddsZ+dduZ,ddwZ-ddxZ.ddzZ/dNddUdNdNd{dd}Z0	 dddZ1ddZ2ddZ3ddZ4ddZ5ddZ6	 	 dddZ7ddZ8dS )EmitterzHelper for C code generation.NcontextrR   value_namesdict[Value, str] | Nonecapi_versiontuple[int, int] | Noner@   rA   c                    || _         |pt          j        d d         | _        |j        | _        |pi | _        g | _        d| _        d S )N   r   )rw   sysversion_inforz   rS   rx   	fragments_indent)rG   rw   rx   rz   s       rH   rI   zEmitter.__init__   sL     (@C,<RaR,@]
&,"$&rJ   c                &    | xj         dz  c_         d S )N   r   rG   s    rH   indentzEmitter.indent   s    rJ   c                @    | xj         dz  c_         | j         dk    sJ d S )Nr   r   r   r   s    rH   dedentzEmitter.dedent   s+    |q      rJ   re   r   rE   c                    d|j         z  S )NzCPyL%srg   rh   s     rH   re   zEmitter.label   s    %+%%rJ   regr   c                ,    t           | j        |         z   S rC   )r   rx   )rG   r   s     rH   r   zEmitter.reg   s    D,S111rJ   namec                    t           |z   S rC   )r   )rG   r   s     rH   attrzEmitter.attr   s    T!!rJ   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 rC   rP   ).0x	formatteds     rH   	<genexpr>z,Emitter.object_annotation.<locals>.<genexpr>   s'      ::!qI~::::::rJ   )z/*z*/  
   )maxsplit    z /* z */)	r   lenpprintpformatmaxanysplittextwrapr   )rG   r   r   
line_width
first_linerestcomment_continuedr   s          @rH   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>>>>()((((rJ   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   )rG   r   r   comments       rH   	emit_linezEmitter.emit_line   s    ??3 	KKMMM7:$((d333BdlS047'ADHIII== 	KKMMMMM	 	rJ   linesc                :    |D ]}|                      |           d S rC   )r   )rG   r   r   s      rH   
emit_lineszEmitter.emit_lines   s0     	! 	!DNN4    	! 	!rJ   BasicBlock | strc                    t          |t                    r|}n)|j        dk    s|j        sd S |                     |          }| j                            | d           d S )Nr   z: ;
)rD   rE   re   
referencedr   r   )rG   re   texts      rH   
emit_labelzEmitter.emit_label   sh    eS!! 	%DD{au'7::e$$Dnnn-----rJ   emitterc                D    | j                             |j                    d S rC   )r   extend)rG   r   s     rH   emit_from_emitterzEmitter.emit_from_emitter   s!    g/00000rJ   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)rG   r   r   s      rH   emit_printfzEmitter.emit_printf   sb    kk$&&}tyy&3,$t**1L'M'MMNNN()))))rJ   c                J    | j         xj        dz  c_        d| j         j        z  S )Nr   z__tmp%drw   rY   r   s    rH   	temp_namezEmitter.temp_name   s(    !!Q&!!4<444rJ   c                J    | j         xj        dz  c_        d| j         j        z  S )Nr   z__LL%dr   r   s    rH   	new_labelzEmitter.new_label   s(    !!Q&!!$,333rJ   rm   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   )rw   rV   getrT   rZ   addr2   )rG   rm   groupstarget_group_names       rH   get_module_group_prefixzEmitter.get_module_group_prefix  sq    $ '"JJ{33 	!2dl6M!M!ML#''(9:::Am,=>>AAAA2rJ   ClassIR | FuncDeclc                6    |                      |j                  S )z#Get the group prefix for an object.)r   rm   )rG   r   s     rH   get_group_prefixzEmitter.get_group_prefix  s     ++CO<<<rJ   idmodulerU   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   rS   private_name)rG   r   r   r   
lib_prefix
star_maybesuffixs          rH   static_namezEmitter.static_name   sf      &ORR4+G+G+O+O
 '.SSB
((2r:::j:&:&:::rJ   clr   c                P    |                      |j        |j        t                    S )N)r   )r   r   rm   r   )rG   r   s     rH   type_struct_namezEmitter.type_struct_name1  s!    LLLrJ   rtyper   c                    |j         S rC   )_ctyperG   r   s     rH   ctypezEmitter.ctype4  s
    |rJ   c                R    |                      |          }|d         dk    r|S |dz   S )z*Adds a space after ctype for non-pointers.r   r   )r   )rG   r   r   s      rH   ctype_spacedzEmitter.ctype_spaced7  s1    

5!!9L3;rJ   c                    |j         sdS t          |t                    r|j        S t          |t                    r|                     |          S J |            )NNULL)
is_unboxedrD   r   c_undefinedr   tuple_undefined_valuer   s     rH   c_undefined_valuezEmitter.c_undefined_value?  sa     	56z** 	5$$v&& 	5--e444erJ   c                ,    |                      |          S rC   )r   r   s     rH   c_error_valuezEmitter.c_error_valueH  s    %%e,,,rJ   fnr   c                H    t            |                    | j                   S rC   )r   cnamerS   )rG   r   s     rH   native_function_namezEmitter.native_function_nameK  s!    7$*!5!5777rJ   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;f;r   z} z#endifr   )struct_namer   typesr   r   )rG   r   resultityps        rH   tuple_c_declarationzEmitter.tuple_c_declarationN  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rJ   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   )rG   r  ns      rH   bitmap_fieldzEmitter.bitmap_fieldc  s,    [ 668ArJ   c                |    d|                     | j                   d}|                     |          }d| | d| S )z5Return reference to the attribute definedness bitmap.( *))->)r  rS   r  )rG   r   r   r  castr   s         rH   attr_bitmap_exprzEmitter.attr_bitmap_exprj  sN    22>>$*--222  '''4''''''rJ   rs   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)rG   rs   r   r   r   r   s         rH   emit_attr_bitmap_setzEmitter.emit_attr_bitmap_setp  s+     	%%eS%T%OOOOOrJ   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  )rG   r   r   r   r   s        rH   emit_attr_bitmap_clearzEmitter.emit_attr_bitmap_clearz  s+    
 	%%b#ub$d%KKKKKrJ   r  r?   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  )rG   rs   r   r   r   r   r  checkr  maskr  s              rH   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	  	 rJ   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 () {)	r   error_overlapr!  r  r   r  r  rS   r   )rG   r   r%  r&  r   r   r   r$  r"  r  bitobj_exprs               rH   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)))*****rJ   c                    t          |t                    r|                     ||| j        |d          S | d| d|                     |           S )NFcheck_exceptionr   )rD   r   tuple_undefined_check_condr   )rG   r   rs   r&  s       rH   r   zEmitter.error_value_check  sl    eV$$ 	D22ud0'5 3    CCgCC(:(:5(A(ACCCrJ   Tr0  tuple_expr_in_cc_type_compare_valCallable[[RType], str]r1  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 | d| d| d ||           }	|j        r|r|	dz  }	|	S )Nr   z {}.empty_struct_error_flag {} {}Fz&not expecting tuple with error overlap.fr   z && PyErr_Occurred())	r   r  formatr   r+  	enumeraterD   r   r2  )
rG   r   r3  r4  r&  r1  r  	item_typer  r"  s
             rH   r2  z"Emitter.tuple_undefined_check_cond  sG    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   'WW!WWgWW8J8J98U8UWWE# 0 0//LrJ   c                B    d|j          d|                     |           S )z0Undefined tuple value suitable in an expression.r  z) )r  c_initializer_undefined_value)rG   r   s     rH   r   zEmitter.tuple_undefined_value  s)    U6%UU)K)KF)S)SUUUrJ   c                     t          |t                    rC|j        sdt          j         dS d                     fd|j        D                       }d| dS                      |          S )zKUndefined value represented in a form suitable for variable initialization.z{ z }r   c                :    g | ]}                     |          S rP   )r<  )r   trG   s     rH   
<listcomp>z9Emitter.c_initializer_undefined_value.<locals>.<listcomp>  s'    ZZZtAA!DDZZZrJ   )rD   r   r  r   r   r   r   )rG   r   itemss   `  rH   r<  z%Emitter.c_initializer_undefined_value  s    eV$$ 	1; = =^7<<<<IIZZZZekZZZ[[E#####))%000rJ   
tuple_typec                ,   |j         | j        j        vrt                      }|j        D ]1}t          |t                    r|                    |j                    2t          | 	                    |          |d          | j        j        |j         <   d S d S )NT)r7   r8   )
r  rw   r[   rF   r  rD   r   r   r6   r  )rG   rB  r7   r  s       rH   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BrJ   )raredestrE  c                  t          |          r6|r|                     d|z             dS |                     d|z             dS t          |t                    r7t	          |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);r7  zCPy_INCREF(%s);zCPy_INCREF_NO_IMM(%s);N)
r$   r   rD   r   r9  r  emit_inc_refr   may_be_immortalr
   )rG   rF  r   rE  r  r:  s         rH   rH  zEmitter.emit_inc_ref  s    U## 	@ ?6=>>>>>6=>>>>>v&& 	@ )%+ 6 6 = =9!!T..Q..)<<<<= =! 	@$ @M @047888887$>?????	@ 	@rJ   is_xdecrE  rK  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 |j        sj|r|                     d	| d| d           dS |j        st          s|                     d	| d| d           dS |                     d	| d
| d           dS 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(r7  rJ  CPy_zDECREF_NO_IMM(N)
r$   r   rD   r   r9  r  emit_dec_refr   rI  r
   )rG   rF  r   rK  rE  r   r  r:  s           rH   rQ  zEmitter.emit_dec_ref  s    "CCU## 	E @>A>>d>>>????? >A>>d>>>?????v&& 	E )%+ 6 6 Y Y9!!T..Q..)WSW!XXXXY Y! 	E 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	E 	ErJ   r  c                r    t          |          }|d|                     |          z  S t          |          S )Nz
%s or None)r0   pretty_namerE   )rG   r  
value_types      rH   rS  zEmitter.pretty_name&  s9    (--
!$"2"2:">">>>3xxrJ   )declare_desterrorraise_exceptionoptionalsrc_typelikelysrcrU  rV  ErrorHandler | NonerW  rX  rY  RType | NonerZ  c          
         |pt                      }|rt          |          rt          |          st          |          }
|
J t	          |
|          r|r                     d| d           d}|	rd| d}                     ||||                    |          |                                d| d| dd	            	                    |||||                                d
           dS t          |          st          |          st          |          syt          |          sjt          |          s[t          |          sLt!          |          s=t#          |          s.t%          |          st'          |          st)          |          rl|r                     d| d           t          |          rd}nt          |          rd}nt          |          rd}nt          |          rd}nt          |          rd}nst          |          rd}nat!          |          rd}nOt#          |          st)          |          rd}n.t%          |          s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 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 t1          |tB                    r "                    ||||||||           dS t1          |tF                    r |rJ  $                    ||||||           dS J d#|z              )$au  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(       = else {r   PyListPyDictPySetPyFrozenSet	PyUnicodePyRangeCPyFloatPyLongPyBoolFzunexpected primitive type: z({}_Check({}))z,(PyBytes_Check({}) || 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 rP   )r   )r   irrG   s     rH   r@  z%Emitter.emit_cast.<locals>.<listcomp>  s'    %S%S%SBd&;&;B&?&?%S%S%SrJ   )r[  targetsz({} == Py_None)r   zCast not implemented: %s)%rb   r(   r'   r0   r3   r   emit_arg_checkr8  r   emit_cast_error_handlerr%   r   r*   r    r,   r)   r   r$   r   r   r   r   r-   r   rD   r   r   class_irr   r	   r   ranger&   r   emit_union_castr   emit_tuple_cast)rG   r[  rF  r  rU  rV  rW  rX  rY  rZ  rT  r"  r   concretefull_strr  s   `               rH   	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##s	;!#&&s	; !%%s	; 's++	s	;
 !%%s	; #3''s	; #3''s	; !%%s	; "#&&s	; !%%s	; $C((s	;  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!#C(( B,=c,B,B 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 %% H	; 53D333444BE +*%***T3S#0F0FQQQOO2422C222H===((T3PPPNN3 %% >	; =$**S//;;D;;;<<<)E +*%***T3S0A0A8LLLOO2422C222H===((T3PPPNN3Y'' 4	; 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$$ 	; 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#####$ $V$$ 	;  T3eXx     V$$ 	;  dCuhOOOOO:4s::::rJ   r_   c                4   |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  r[  goto %s;CPy_TypeError("", ); z
%s = NULL;
return %s;)rD   rk   emit_type_error_tracebackrl   rm   rn   r   re   rS  rb   rd   emit_tracebackrr   rs   )rG   rV  r[  rF  r  rW  s         rH   rp  zEmitter.emit_cast_error_handler  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333NN<%+566666rJ   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  r)   == NULL) {ra  goto r   F)rU  rW  rX  rZ  z != NULL) goto N)r   r   r   rA  rw  rp  r   )rG   r[  rF  r  rU  rV  rX  rY  rW  
good_labelitems              rH   rs  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
#####rJ   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   r(  F)rU  rW  rX  r)  z == NULL) goto ra  N)	r   r   r   r8  r   r  r9  rw  r   )
rG   r[  rF  r  rU  rV  rY  	out_labelr  r  s
             rH   rt  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)))***	"""""rJ   r"  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  ra  r  r   z{}if {}z} else rb  )r   r   r8  )rG   r[  rF  r  r"  rX  s         rH   ro  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$$$$$	% 	%rJ   )rU  rV  rW  rX  borrowr  c          
        |pt                      }t          |t                     r| d|                     |           d}	nAt          |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          |          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-           t9          |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 J d5|z              )6a  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
            borrow: If True, create a borrowed reference

        ra  r  ry  r}  rz  r{  r|  z
CPyTagged z(likely(PyLong_Check(z)))r`  z = CPyTagged_BorrowFromObject(rO  z = CPyTagged_FromObject(rb  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  z} else {TN)rU  rV  rY  r  z == NULL)) {z.empty_struct_error_flag = 0;r_  z = PyTuple_GET_ITEM(r   )rW  rV  rU  r  rU  r7  FzUnboxing not implemented: %s)"rb   rD   r   rd   re   rr   rs   rS  r$   r+   r   ro  r   r   r&   r#   /emit_unbox_failure_with_overlapping_error_valuer"   r!   r.   r   r   r   rD  r   r   rt  r  r9  r   
emit_unboxrH  r/   rw  )rG   r[  rF  r  rU  rV  rW  rX  r  failure	raise_exc
conversion	cast_tempr  r:  temptemp2s                    rH   r  zEmitter.emit_unboxG  s'	   < (e]++ 	1<<$"4"4S"9"9<<<GG{++ 	1 5;.GGe]33333"U[0G 	*L$*:*:3*?*?LLCLLLI')GS!! v	?%<S%A%A v	? 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$$ k	?(9#(>(> k	? 0t///T30V30V0V0VX`aaaNN7###NN8$$$,,,JNN8$88:88899999$$ b	? 0t///T30RS0R0R0RT\]]]NN7###NN8$$$NN-$---..... %% Z	? 31$111222NNd>>s>>>???e]33 YDDT3PWXXXXXY Y %% R	? 31$111222NNd>>s>>>???e]33 YDDT3PWXXXXXY Y %% J	? 31$111222NNd>>s>>>???e]33 YDDT3PWXXXXXY Y %% B	? 31$111222NNd>>s>>>???e]33 YDDT3PWXXXXXY Y %% :	? 20000111NNd?????@@@OOI4III7TWXXXXXV$$ 3	?%%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#####$ $ ?83>>>>rJ   
can_borrowc                   |rd}nd}t          |          st          |          r|                     | | d| d           dS t          |          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|                     |           |                     | | 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 |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(rO  ra  z ? Py_True : Py_False;z = Py_None;z = PyLong_FromLong(z = PyLong_FromLongLong(z = PyFloat_FromDouble(z = PyTuple_New(r  z
 == NULL))z    CPyError_OutOfMemory();zPyTuple_SET_ITEM(r   r7  Tr  r  N)r$   r+   r   r   r   r   rH  r/   r&   r"   r!   r.   r#   r   rD   r   rD  r   r  rr  r   r   emit_box)	rG   r[  rF  r  rU  r  declarationr  
inner_names	            rH   r  zEmitter.emit_box  s     	&KKKS!! '	<%<S%A%A '	<NNkS4SSCSSSTTTTT$$ $	<(9#(>(> $	< 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***NNkR4RRCIRRRSSSNN;4;;;<<<NN89993sy>>** T T~ TNN#Nt#N#Nq#N#NC#N#N1#N#NOOOO!%!1!1JMMS--A--SYq\X\M]]]NN#Rt#R#Rq#R#RJ#R#R#RSSSST T ~%%%NNk:4::C:::;;;;;rJ   r  c                   t          |t                    rQt          |j                  dk    rdS |                     ||| j        d          }|                     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   Nr  r)  r*   ==  && PyErr_Occurred()) {r   )	rD   r   r   r  r2  r   r   r+  r   )rG   rs   r   r  conds        rH   emit_error_checkzEmitter.emit_error_check   s    eV$$ 	N5;1$$66ueTEWY]^^0d0001111  	N NN`%``T-?-?-F-F```aaaaNNL%LLT-?-?-F-FLLLMMM%%%%%rJ   targetc                   |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 | 	                    |          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(r  z Py_VISIT(CPyTagged_LongAsObject(z));r   r7  r_  z	Py_VISIT(rO  Fz&emit_gc_visit() not implemented for %s)is_refcountedrD   r   r   r   r   r9  r  emit_gc_visitr   reprrG   r  r   r  r:  s        rH   r  zEmitter.emit_gc_visit0  sB    " 	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????@ @ZZ,..NN1v11122222PBT%[[PPPPrJ   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 | 
                    |          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  r  zCPyTagged __tmp = r  ra  z*Py_XDECREF(CPyTagged_LongAsObject(__tmp));r   r7  r_  r   z	Py_CLEAR(rO  Fz&emit_gc_clear() not implemented for %s)r  rD   r   r   r   r   r   r9  r  emit_gc_clearr   r  r  s        rH   r  zEmitter.emit_gc_clearF  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????@ @ZZ,..43I3I%3P3PTZ3Z3ZNN1v11122222PBT%[[PPPPrJ   rl   rn   ro   c                2    |                      d|||          S )NCPy_AddTraceback)_emit_traceback)rG   rl   rm   rn   s       rH   r  zEmitter.emit_traceback^  s      ##$6[RabbbrJ   c               n    d}d|                      |           d}|                     ||||||          S )NCPy_TypeErrorTraceback")type_strr[  )rS  r  )rG   rl   rm   rn   r  r[  funcr  s           rH   r~  z!Emitter.emit_type_error_tracebackc  sR     (/t'',,///##+{OhTW $ 
 
 	
rJ   r  r  c                   |                      d|          }d||                    dd          |d         |d         |fz  }|r|sJ |d| d| z  }|dz  }|                     |           t          r|                     d	           d S d S )
Nglobalsz%s("%s", "%s", %d, %s\z\\r   r   r   rO  z7assert(PyErr_Occurred() != NULL && "failure w/o err!");)r   r   r   r4   )	rG   r  rl   rm   rn   r  r[  globals_staticr   s	            rH   r  zEmitter._emit_tracebackr  s     )))[AA&f--AA*
 
  	+JJJ***S***Dt 	VNNTUUUUU	V 	VrJ   c                    |                      d| d|                     |           d           |                      |           |                      d           d S )Nr)  r  r  r   )r   r   )rG   rF  r  r  s       rH   r  z7Emitter.emit_unbox_failure_with_overlapping_error_value  sb     	YdYY(:(:3(?(?YYYZZZwsrJ   r]   )rw   rR   rx   ry   rz   r{   r@   rA   )r@   rA   )re   r   r@   rE   )r   r   r@   rE   )r   rE   r@   rE   )r   r   r   rE   r@   rE   )r   )r   rE   r   r   r@   rA   )r   rE   r@   rA   )re   r   r@   rA   )r   rv   r@   rA   )r   rE   r   rE   r@   rA   )r@   rE   )rm   rE   r@   rE   )r   r   r@   rE   )r   rE   r   rU   r   rE   r@   rE   )r   r   r@   rE   )r   r   r@   rE   )r   r   r@   rE   )r   r   r@   r   )r  r	  r@   rE   )r   rE   r   r   r  r	  r@   rE   )rs   rE   r   rE   r   r   r   r   r   rE   r@   rA   )
r   rE   r   r   r   r   r   rE   r@   rA   )rs   rE   r   rE   r   r   r   r   r   rE   r  r?   r@   rA   )r   r   r%  rE   r&  rE   r   rE   r   rE   r   r   r$  r?   r@   rA   )r   r   rs   rE   r&  rE   r@   rE   )r   r   r3  rE   r4  r5  r&  rE   r1  r?   r@   rE   )r   r   r@   rE   )rB  r   r@   rA   )rF  rE   r   r   rE  r?   r@   rA   )
rF  rE   r   r   rK  r?   rE  r?   r@   rA   )r  r   r@   rE   )r[  rE   rF  rE   r  r   rU  r?   rV  r\  rW  r?   rX  r?   rY  r]  rZ  r?   r@   rA   )rV  r_   r[  rE   rF  rE   r  r   rW  r?   r@   rA   )r[  rE   rF  rE   r  r   rU  r?   rV  r_   rX  r?   rY  r]  rW  r?   r@   rA   )r[  rE   rF  rE   r  r   rU  r?   rV  r_   rY  r]  r@   rA   )r[  rE   rF  rE   r  r   r"  rE   rX  r?   r@   rA   )r[  rE   rF  rE   r  r   rU  r?   rV  r\  rW  r?   rX  r?   r  r?   r@   rA   )FF)r[  rE   rF  rE   r  r   rU  r?   r  r?   r@   rA   )rs   rE   r   r   r  rE   r@   rA   )r  rE   r   r   r@   rA   )rl   rE   rm   rE   rn   ro   r@   rA   )rl   rE   rm   rE   rn   ro   r  r   r[  rE   r@   rA   )r   r   )r  rE   rl   rE   rm   rE   rn   ro   r  rE   r[  rE   r@   rA   )rF  rE   r  r   r  rE   r@   rA   )9rL   rM   rN   rO   rI   r   r   re   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.  r   r2  r   r<  rD  rH  rQ  rS  rw  rp  rs  rt  ro  r  r  r  r  r  r  r~  r  r  rP   rJ   rH   rv   rv      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         - - - -8 8 8 8   *       ( ( ( (P P P PL L L L       2 + + + + + +,D D D D !%           DV V V V
1 
1 
1 
1
 
 
 
 EJ @ @ @ @ @ @2 ;@eE E E E E E>    #%) $!%h; h; h; h; h; h;T7 7 7 70$$ $$ $$ $$L(# (# (# (#T% % % % #%) $`? `? `? `? `? `?F _d5< 5< 5< 5< 5<n& & & & Q Q Q Q,Q Q Q Q0c c c c

 
 
 
* V V V V V2     rJ   rv   )indented
componentsr   r  r?   r@   rE   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          rH   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@@rJ   )r  r   r  r?   r@   rE   )JrO   
__future__r   r   r~   r   typingr   r   mypyc.codegen.literalsr   mypyc.commonr   r   r	   r
   r   r   r   r   mypyc.ir.class_irr   r   mypyc.ir.func_irr   mypyc.ir.opsr   r   mypyc.ir.rtypesr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   mypyc.namegenr1   r2   mypyc.sametyper3   r4   __annotations__r6   rR   r_   rb   rd   rk   rr   rv   r  rP   rJ   rH   <module>r     s   $ $ $ " " " " " "  



  " " " " " " " " + + + + + +	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 < ; ; ; ; ; ; ; % % % % % % * * * * * * * *                                                             > 7 6 6 6 6 6 6 6 ' ' ' ' ' '     ) ) ) ) ) ) ) )@ #  #  #  #  #  #  #  #F> > > > > > > >* * * * *L * * *    ,   	/ 	/ 	/ 	/ 	/l 	/ 	/ 	/    L   l l l l l l l l^ DI A A A A A A A ArJ   