o
    tBhc                     @  s  U d Z ddlm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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-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9 dZ:de;d< G dd dZ<G dd dZ=G dd dZ>G dd de>Z?G dd de>Z@G dd de>ZAG dd de>ZBG dd  d ZCdS )!zUtilities for emitting C code.    )annotationsN)Callable)Final)Literals)ATTR_PREFIXFAST_ISINSTANCE_MAX_SUBCLASSESNATIVE_PREFIX
REG_PREFIXSTATIC_PREFIXTYPE_PREFIXuse_vectorcall)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_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object_rprimitiveoptional_value_type)NameGeneratorexported_name)is_same_typeFr   DEBUG_ERRORSc                   @  s(   e Zd ZdZ	d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] | Noner1   set[str] | Noner2   boolr3   returnNonec                C  s8   t |tr|gn|| _|| _|pt | _|| _|| _d S N)
isinstancestrr4   r6   setr1   r2   r3   )selfr4   r6   r1   r2   r3    rA   i/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/mypyc/codegen/emit.py__init__J   s
   	
zHeaderDeclaration.__init__r<   )r4   r5   r6   r7   r1   r8   r2   r9   r3   r9   r:   r;   __name__
__module____qualname____doc__rC   rA   rA   rA   rB   r0   :   s    r0   c                   @  s    e Zd ZdZ		ddddZdS )EmitterContextz-Shared emitter state for a compilation group.Nnamesr,   
group_name
str | None	group_mapdict[str, str | None] | Noner:   r;   c                 C  s6   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_counterrJ   rK   rM   r?   
group_depsdeclarationsr   literals)r@   rJ   rK   rM   rA   rA   rB   rC   ]   s   
	zEmitterContext.__init__NN)rJ   r,   rK   rL   rM   rN   r:   r;   rD   rA   rA   rA   rB   rI   Z   s
    rI   c                   @     e Zd ZdZdS )ErrorHandlerz3Describes handling errors in unbox/cast operations.NrE   rF   rG   rH   rA   rA   rA   rB   rU   }       rU   c                   @  rT   )AssignHandlerzAssign an error value on error.NrV   rA   rA   rA   rB   rX      rW   rX   c                   @     e Zd ZdZd	ddZdS )
GotoHandlerzGoto label on error.labelr>   r:   r;   c                 C  
   || _ d S r<   r[   r@   r[   rA   rA   rB   rC         
zGotoHandler.__init__N)r[   r>   r:   r;   rD   rA   rA   rA   rB   rZ          rZ   c                   @  s   e Zd ZdZdd
dZdS )TracebackAndGotoHandlerz+Add traceback item and goto label on error.r[   r>   source_pathmodule_nametraceback_entrytuple[str, int]r:   r;   c                 C  s   || _ || _|| _|| _d S r<   )r[   rb   rc   rd   )r@   r[   rb   rc   rd   rA   rA   rB   rC      s   
z TracebackAndGotoHandler.__init__N)
r[   r>   rb   r>   rc   r>   rd   re   r:   r;   rD   rA   rA   rA   rB   ra      r`   ra   c                   @  rY   )
ReturnHandlerz!Return a constant value on error.valuer>   r:   r;   c                 C  r\   r<   )rg   )r@   rg   rA   rA   rB   rC      r_   zReturnHandler.__init__N)rg   r>   r:   r;   rD   rA   rA   rA   rB   rf      r`   rf   c                   @  s  e Zd ZdZ		ddddZdddZdddZdddZdddZdddZ	dddd Z
dd"d#Zdd%d&Zdd(d)Zdd,d-Zdd.d/Zdd0d1Zdd3d4Zdd7d8Zefdd=d>ZddAdBZddEdFZddGdHZddIdJZddKdLZddOdPZddTdUZddWdXZ	Yddd]d^ZddbdcZddddeZddfdgZ ddidjZ!dYdkddndoZ"dYdYdpddrdsZ#ddudvZ$dYddwdYddwdxdddZ%dddZ&dddZ'dddZ(dddZ)dYddwdYdYddddZ*	YddddZ+dddZ,dddZ-dddZ.dddZ/dddZ0		ddddZ1dS )EmitterzHelper for C code generation.NcontextrI   value_namesdict[Value, str] | Nonecapi_versiontuple[int, int] | Noner:   r;   c                 C  s<   || _ |ptjd d | _|j| _|pi | _g | _d| _d S )N   r   )ri   sysversion_inforl   rJ   rj   	fragments_indent)r@   ri   rj   rl   rA   rA   rB   rC      s   

zEmitter.__init__c                 C  s   |  j d7  _ d S )N   rr   r@   rA   rA   rB   indent      zEmitter.indentc                 C  s    |  j d8  _ | j dksJ d S )Nrs   r   rt   ru   rA   rA   rB   dedent   s   zEmitter.dedentr[   r   r>   c                 C  s
   d|j  S )NzCPyL%sr]   r^   rA   rA   rB   r[      r_   zEmitter.labelregr   c                 C  s   t | j|  S r<   )r	   rj   )r@   ry   rA   rA   rB   ry      s   zEmitter.regnamec                 C  s   t | S r<   )r   )r@   rz   rA   rA   rB   attr   s   zEmitter.attr linec                 C  sF   | dr	|   | j| jd | d  |dr!|   d S d S )N} 
{)
startswithrx   rq   appendrr   endswithrv   )r@   r}   rA   rA   rB   	emit_line   s   

zEmitter.emit_linelinesc                 G  s   |D ]}|  | qd S r<   )r   )r@   r   r}   rA   rA   rB   
emit_lines   s   zEmitter.emit_linesBasicBlock | strc                 C  s0   t |tr|}n| |}| j| d d S )Nz: ;
)r=   r>   r[   rq   r   )r@   r[   textrA   rA   rB   
emit_label   s   

zEmitter.emit_labelemitterc                 C  s   | j |j  d S r<   )rq   extend)r@   r   rA   rA   rB   emit_from_emitter   rw   zEmitter.emit_from_emitterfmtargsc                 G  s<   | dd}| ddd| gt|   | d d S )Nr   z\nzprintf(%s);, z"%s"zfflush(stdout);)replacer   joinlist)r@   r   r   rA   rA   rB   emit_printf   s   "zEmitter.emit_printfc                 C     | j  jd7  _d| j j S )N   z__tmp%dri   rO   ru   rA   rA   rB   	temp_name      zEmitter.temp_namec                 C  r   )Nr   z__LL%dr   ru   rA   rA   rB   	new_label   r   zEmitter.new_labelrc   c                 C  sD   | j j}||}|r || j jkr | 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|   )ri   rM   getrK   rP   addr-   )r@   rc   groupstarget_group_namerA   rA   rB   get_module_group_prefix   s   
zEmitter.get_module_group_prefixobjClassIR | FuncDeclc                 C  s   |  |jS )z#Get the group prefix for an object.)r   rc   )r@   r   rA   rA   rB   get_group_prefix   s   zEmitter.get_group_prefixidmodulerL   prefixc                 C  sD   |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   rJ   private_name)r@   r   r   r   
lib_prefix
star_maybesuffixrA   rA   rB   static_name  s   
zEmitter.static_nameclr   c                 C  s   | j |j|jtdS )N)r   )r   rz   rc   r   )r@   r   rA   rA   rB   type_struct_name     zEmitter.type_struct_namertyper   c                 C  s   |j S r<   )_ctyper@   r   rA   rA   rB   ctype  s   zEmitter.ctypec                 C  s"   |  |}|d dkr|S |d S )z*Adds a space after ctype for non-pointers.r   r   )r   )r@   r   r   rA   rA   rB   ctype_spaced  s   
zEmitter.ctype_spacedc                 C  s6   |j sdS t|tr|jS t|tr| |S J |)NNULL)
is_unboxedr=   r   c_undefinedr   tuple_undefined_valuer   rA   rA   rB   c_undefined_value"  s   


zEmitter.c_undefined_valuec                 C  s
   |  |S r<   )r   r   rA   rA   rB   c_error_value+  r_   zEmitter.c_error_valuefnr   c                 C  s   t  || j S r<   )r   cnamerJ   )r@   r   rA   rA   rB   native_function_name.  r   zEmitter.native_function_namertupler   	list[str]c              	   C  s   d|j  d|j  d|j  dg}t|jdkr|d nd}|jD ]}|| | d| d |d	7 }q$|d
|j  d | |}|d| || |d	| |d |d |S )Nz#ifndef MYPYC_DECLARED_z#define MYPYC_DECLARED_ztypedef struct  {r   zint empty_struct_error_flag;f;r   z} zstatic {} {} = {{ {} }};r|   z#endif)
struct_namelentypesr   r   tuple_undefined_value_helperformatr   r   r   )r@   r   resultitypvaluesrA   rA   rB   tuple_c_declaration1  s(   






zEmitter.tuple_c_declarationr9   c                 C  s
   t | jS r<   )r   rl   ru   rA   rA   rB   r   L  r_   zEmitter.use_vectorcallF	attr_exprcompareunlikelyc                 C  sh   t |trd| ||| j|}nd| d| d| | d}|r)d| d}| d| d d S )Nz({})(r   )z	(unlikelyzif r   )r=   r   r   tuple_undefined_check_condr   r   )r@   r   r   r   r   checkrA   rA   rB   emit_undefined_attr_checkO  s   
z!Emitter.emit_undefined_attr_checktuple_expr_in_cc_type_compare_valCallable[[RType], str]c                 C  s`   t |jdkrd|||tS |jd }t|tr$| ||d ||S | d| d|| S )Nr   z {}.empty_struct_error_flag {} {}z.f0z.f0 r   )r   r   r   r   r=   r   r   )r@   r   r   r   r   	item_typerA   rA   rB   r   \  s   


z"Emitter.tuple_undefined_check_condc                 C  s
   d|j  S )Ntuple_undefined_)	unique_id)r@   r   rA   rA   rB   r   p  r_   zEmitter.tuple_undefined_valuec                 C  s   g }t |jdkr| tgS |jD ])}t|ts"|| | n| |}|d || |d |d q|d d S )Nr   z{ z }r   r   )	r   r   r   r   r=   r   r   r   r   )r@   r   resitemsub_listrA   rA   rB   r   s  s   





z$Emitter.tuple_undefined_value_helper
tuple_typec                 C  s\   |j | jjvr,t }|jD ]}t|tr||j  qt| 	||dd| jj|j < d S d S )NT)r1   r2   )
r   ri   rQ   r?   r   r=   r   r   r0   r   )r@   r   r1   r   rA   rA   rB   declare_tuple_struct  s   

zEmitter.declare_tuple_struct)raredestr   c                C  s   t |r|r| d|  dS | d|  dS t|tr4t|jD ]\}}| | d| | q"dS |js@| d|  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);.fzCPy_INCREF(%s);N)r    r   r=   r   	enumerater   emit_inc_refr   )r@   r   r   r   r   r   rA   rA   rB   r     s   
zEmitter.emit_inc_refis_xdecr   r   c                C  s   |rdnd}t |r(|r| d| d| d d
S | d| d| d d
S t|trGt|jD ]\}}| j| d| |||d q2d
S |jsh|rZ| 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(r   r   CPy_N)r    r   r=   r   r   r   emit_dec_refr   )r@   r   r   r   r   xr   r   rA   rA   rB   r     s   

zEmitter.emit_dec_refr   c                 C  s&   t |}|d urd| | S t|S )Nz
%s or None)r+   pretty_namer>   )r@   r   
value_typerA   rA   rB   r     s   zEmitter.pretty_nameT)declare_desterrorraise_exceptionoptionalsrc_typelikelysrcr   r   ErrorHandler | Noner   r   r   RType | Noner   c             
     s  |pt  }|r\t|r\t|s\t|}
|
dusJ t|
|r\|r) d| d d}|	r3d| d} ||||||  d| d| dd	  	|||||  d
 dS t
|st|st|st|st|st|st|st|st|st|r|r d| d t
|rd}n@t|rd}n9t|rd}n2t|rd}n+t|rd}n$t|rd}nt|st|rd}nt|st|rd}nJ d| d}|	rd| d} |||||||  d| d| dd	  	|||||  d
 dS t|rQ|r d| d d}|	r'd| d} |||||||  d| d| dd	  	|||||  d
 dS t|r|rg  | d| d d}|	rrd| d} ||||||  d| d| dd	  	|||||  d
 dS t|tr(|r d| d t|j}|rt|td krd| |j}n,d}tdt|D ]	}|d| 7 }qt|dkrd| }|j| fdd|D d }|	rd| d} |||||  d| d| d||d	  	|||||  d
 dS t|rm|r9 d| d d!}|	rDd| d} ||||||  d| d| dd	  	|||||  d
 dS t|r|r~ d| d  |||d"|  | d| d |r d
 dS dS t|t r !|||||||| dS t|t"r|rJ  #|||||| dS J d#| )$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	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                   s   g | ]}  |qS rA   )r   ).0irru   rA   rB   
<listcomp>L  s    z%Emitter.emit_cast.<locals>.<listcomp>)r   targetsz({} == Py_None)r|   zCast not implemented: %s)$rX   r$   r#   r+   r.   r   emit_arg_checkr   r   emit_cast_error_handlerr!   r   r&   r(   r%   r   r    r   r   r   r   r)   r   r=   r   r   class_irr   r   r   ranger"   r   emit_union_castr   emit_tuple_cast)r@   r   r   r   r   r   r   r   r   r   r   r   r   concretefull_strr   rA   ru   rB   	emit_cast  s  
"

	



"


zEmitter.emit_castrU   c                 C  s   |r-t |tr| j|j|j|j||d | d|j  d S | d| | d| d t |t	r;| d|  d S t |t
rJ| d|j  d S t |trj| d|  | |j|j|j | d|j  d S t |tsqJ | d|j  d S )N)r   r   goto %s;CPy_TypeError("", ); z
%s = NULL;
return %s;)r=   ra   emit_type_error_tracebackrb   rc   rd   r   r[   r   rX   rZ   emit_tracebackrf   rg   )r@   r   r   r   r   r   rA   rA   rB   r  o  s$   



zEmitter.emit_cast_error_handlerr   c	              
   C  s   |r|  d| d |  }	|r6|  d| d |  | d| | d |  d|	 d |  d |jD ]}
| j|||
ddddd	 |  d| d
|	 d q9| ||||| | |	 dS )zTEmit cast to a union type.

        The arguments are similar to emit_cast.
        r   r   if ( == NULL) {r   goto r~   F)r   r   r   r   z != NULL) goto N)r   r   r   itemsr  r  r   )r@   r   r   r   r   r   r   r   r   
good_labelr   rA   rA   rB   r    s*   

	zEmitter.emit_union_castc           
   	   C  s   |r|  d| d |  }| dj|t|jd| dd| dd t|jD ]"\}}	| jd| d	| d
||	dddd |  d| d| d q+|  | 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)r   r   r   r  z == NULL) goto r   N)	r   r   r   r   r   r   r   r  r   )
r@   r   r   r   r   r   r   	out_labelr   r   rA   rA   rB   r    s.   

zEmitter.emit_tuple_castr   c                 C  sn   |r|  d| d |  | d| | d |dkr,|  d|r%dnd| d S |r5|  d d S d S )	Nr  r  r   r   r|   z{}if {}z} else r   )r   r   r   )r@   r   r   r   r   r   rA   rA   rB   r
    s   zEmitter.emit_arg_check)r   r   r   r   borrowr"  c             
   C  s  |pt  }t|t r| d| | d}	nt|tr!d|j }	nt|ts(J d|j }	|r?d| | d| d}
|
|	 }	t|sGt	|r|rR| 
d| d | |||d	| d
| |rn| 
d| d| d n| 
d| d| d | 
d | 
|	 | 
d d"S t|st|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|r|r
| 
d| d | 
| d| d d"S t|r5|r(| 
d| d | 
| d| d d"S t|tr| | |rQ| 
| | d| d |rp| 
d| d | 
| d| | d | 
d  |  }| j|||d!|d"d# | 
d$| d% | 
|	 | 
d  |js| 
| d& t|jD ]M\}}|  }| 
d'| d(| d)| d |  }|jr| j|||||d!|d* n|s| |t | j|||d!d+ | 
| d,| d| d q| 
d |r | 
d d"S d"S J d.| )/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
            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(r   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(r   r  r  z} else {TN)r   r   r   if (unlikely(z == NULL)) {z.empty_struct_error_flag = 0;r   z = PyTuple_GET_ITEM(r   )r   r   r   r"  r   r   FzUnboxing not implemented: %s)rX   r=   r   rZ   r[   rf   rg   r   r    r'   r   r
  r   r   r"   r   r   r   r   r   r   r  r   r   r   
emit_unboxr   r*   r  )r@   r   r   r   r   r   r   r   r"  failure	raise_exc
conversion	cast_tempr   r   temptemp2rA   rA   rB   r%    s   

















 
zEmitter.emit_unbox
can_borrowc           	      C  s  |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|rY| | | d |sW| |t dS dS t	|rl| | | d| d dS t
|r| | | d	| d dS t|tr| | | | | d
t|j d | d| d | d tdt|jD ];}|js| d| d| d| d|  q|  }| j| d| ||j| dd | d| d| d| d qdS |jrJ | | | 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(r   r   z ? Py_True : Py_False;z = Py_None;z = PyLong_FromLong(z = PyLong_FromLongLong(z = PyTuple_New(r#  z
 == NULL))z    CPyError_OutOfMemory();r   zPyTuple_SET_ITEM(r   r   Tr$  r   N)r    r'   r   r   r   r   r   r*   r"   r   r   r=   r   r   r   r   r  r   r   emit_box)	r@   r   r   r   r   r,  declarationr   
inner_namerA   rA   rB   r-  i  sB   


 
$" 
zEmitter.emit_boxrg   r&  c                 C  sp   t |ts| d| d| | d nt|jdkrdS | ||| jd}| d| d | |d dS )zMEmit code for checking a native function return value for uncaught exception.r  z == z) {r   Nz==r~   )r=   r   r   r   r   r   r   r   )r@   rg   r   r&  condrA   rA   rB   emit_error_check  s   
 zEmitter.emit_error_checktargetc                 C  s   |j sdS t|tr(|jdkr(| d| d | d| d | d dS t|trDt|jD ]\}}| | d| | q2dS | 	|d	krV| d
| d dS J dt
| )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()) {z Py_VISIT(CPyTagged_LongAsObject(z));r~   r   r   z	Py_VISIT(r   Fz&emit_gc_visit() not implemented for %s)is_refcountedr=   r   rz   r   r   r   r   emit_gc_visitr   reprr@   r2  r   r   r   rA   rA   rB   r7    s   
zEmitter.emit_gc_visitc                 C  s   |j sdS t|tr;|jdkr;| d| d | d| d | | d| | d | d | d	 dS t|trWt|jD ]\}}| 	| d
| | qEdS | 
|dkrp| |dkrp| d| d dS J dt| )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'.
        Nr3  r4  r5  zCPyTagged __tmp = r   r   z*Py_XDECREF(CPyTagged_LongAsObject(__tmp));r~   r   r   r   z	Py_CLEAR(r   Fz&emit_gc_clear() not implemented for %s)r6  r=   r   rz   r   r   r   r   r   emit_gc_clearr   r8  r9  rA   rA   rB   r:    s   

zEmitter.emit_gc_clearrb   rd   re   c                 C  s   |  d|||S )NCPy_AddTraceback)_emit_traceback)r@   rb   rc   rd   rA   rA   rB   r    s   zEmitter.emit_tracebackc                C  s,   d}d|  | d}| j||||||dS )NCPy_TypeErrorTraceback")type_strr   )r   r<  )r@   rb   rc   rd   r   r   funcr?  rA   rA   rB   r    s
   	z!Emitter.emit_type_error_tracebackr@  r?  c           	      C  sv   |  d|}d||dd|d |d |f }|r'|sJ |d| d| 7 }|d7 }| | tr9| d	 d S d S )
Nglobalsz%s("%s", "%s", %d, %s\z\\r   r   r   r   z7assert(PyErr_Occurred() != NULL && "failure w/o err!");)r   r   r   r/   )	r@   r@  rb   rc   rd   r?  r   globals_staticr}   rA   rA   rB   r<    s    	

zEmitter._emit_tracebackrS   )ri   rI   rj   rk   rl   rm   r:   r;   )r:   r;   )r[   r   r:   r>   )ry   r   r:   r>   )rz   r>   r:   r>   )r|   )r}   r>   r:   r;   )r   r>   r:   r;   )r[   r   r:   r;   )r   rh   r:   r;   )r   r>   r   r>   r:   r;   )r:   r>   )rc   r>   r:   r>   )r   r   r:   r>   )r   r>   r   rL   r   r>   r:   r>   )r   r   r:   r>   )r   r   r:   r>   )r   r   r:   r>   )r   r   r:   r   )r:   r9   )F)
r   r   r   r>   r   r>   r   r9   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:   r;   )
r   r>   r   r   r   r9   r   r9   r:   r;   )r   r   r:   r>   )r   r>   r   r>   r   r   r   r9   r   r   r   r9   r   r9   r   r   r   r9   r:   r;   )r   rU   r   r>   r   r>   r   r   r   r9   r:   r;   )r   r>   r   r>   r   r   r   r9   r   rU   r   r9   r   r   r   r9   r:   r;   )r   r>   r   r>   r   r   r   r9   r   rU   r   r   r:   r;   )r   r>   r   r>   r   r   r   r>   r   r9   r:   r;   )r   r>   r   r>   r   r   r   r9   r   r   r   r9   r   r9   r"  r9   r:   r;   )FF)r   r>   r   r>   r   r   r   r9   r,  r9   r:   r;   )rg   r>   r   r   r&  r>   r:   r;   )r2  r>   r   r   r:   r;   )rb   r>   rc   r>   rd   re   r:   r;   )rb   r>   rc   r>   rd   re   r   r   r   r>   r:   r;   )r|   r|   )r@  r>   rb   r>   rc   r>   rd   re   r?  r>   r   r>   r:   r;   )2rE   rF   rG   rH   rC   rv   rx   r[   ry   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   r  r  r  r  r
  r%  r-  r1  r7  r:  r  r  r<  rA   rA   rA   rB   rh      s    

















	







 
(

&
* 
5



rh   )DrH   
__future__r   ro   typingr   typing_extensionsr   mypyc.codegen.literalsr   mypyc.commonr   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+   mypyc.namegenr,   r-   mypyc.sametyper.   r/   __annotations__r0   rI   rU   rX   rZ   ra   rf   rh   rA   rA   rA   rB   <module>   s,    $	p #