
    i                    $   U d Z ddlmZ ddlmZmZ ddlmZmZ ddl	m
Z
 ddlmZmZmZmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZ dd	lmZmZm Z m!Z!m"Z"m#Z#m$Z$ dd
l%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddZ6ddZ7ee&e,ege8f         Z9ee8e:e8e9f         f         Z;dd fdd fde6fde6fde6fd e6fd!efd"efd#e7fd$e7fd%
Z<d&e=d'<   d(efd)efd)efd*efd+Z>d&e=d,<   d-d.efiZ?d&e=d/<   i d0d1efd2d3efd4d5efd6d7efd8d9efd:d;efd<d=efd>d?efd@d?efdAdBefdCdBefdDdEefdFdEefdGdHefdIdHefdJdKefdLdKefi dMdNefdOdNefdPdQefdRdQefdSdTefdUdTefdVdWefdXdWefdYdZefd[dZefd\d]efd^d]efd_d`efdad`efdbdcefdddcefdedfefdgefdhefdiefdjefdkefdlefdmefdnefdoefdpefdqefdrefdrefdsefdtZ@d&e=du<   dve6fdwe6fdxe6fdyZAd&e=dz<   d{d|e>fd}d~e?fdde@fddeAfgZBdhZCddZDddZEddZFddZGddZHddZIddZJddZKddZLddZMddZNddZOddZPddZQddZRddZSddZTddZUddZVddZWddZXddZYddZZddZ[ddZ\ddĄZ]ddǄZ^ddȄZ_ddɄZ`ddʄZadd̈́Zbdd΄ZcddЄZddd҄ZeddӄZfddԄZgddׄZhdS )z8Code generation for native classes and related wrappers.    )annotations)CallableMapping)ARG_STAR	ARG_STAR2)c_string_initializer)EmitterHeaderDeclarationReturnHandlernative_function_doc_initializer)native_function_header)
generate_bin_op_wrappergenerate_bool_wrappergenerate_contains_wrappergenerate_dunder_wrappergenerate_get_wrappergenerate_hash_wrappergenerate_ipow_wrappergenerate_len_wrappergenerate_richcompare_wrappergenerate_set_del_item_wrapper)BITMAP_BITSBITMAP_TYPECPYFUNCTION_NAMENATIVE_PREFIXPREFIX
REG_PREFIXshort_id_from_name)ClassIRVTableEntries)FUNC_CLASSMETHODFUNC_STATICMETHODFuncDeclFuncIRget_text_signature)RTupleRTypeobject_rprimitive)NameGenerator)is_same_typeclr   fnr$   emitterr	   returnstrc                H    t            |                    |j                   S N)r   cnamenamesr+   r,   r-   s      V/root/projects/qq-shell/venv/lib64/python3.11/site-packages/mypyc/codegen/emitclass.pynative_slotr6   2   s!    6RXXgm44666    c                    |                      |j        dz             }|sJ t           |                    |j                   S )N	__wrapper)
get_methodnamer   r2   r3   )r+   r,   r-   
wrapper_fns       r5   dunder_attr_slotr=   6   sG    rw455J>Z--gm<<>>>r7   tp_initc                $    t          | ||          S r1   )generate_init_for_classctes      r5   <lambda>rE   D   s    ,CAq!,L,L r7   tp_callc                $    t          | ||          S r1   )generate_call_wrapperrA   s      r5   rE   rE   E   s    ,A!Q,J,J r7   tp_strtp_reprtp_iternexttp_itertp_hashtp_descr_gettp_getattrotp_setattro)
__init____call____str____repr____next____iter____hash____get____getattr____setattr__	SlotTable	SLOT_DEFSmp_subscriptmp_ass_subscript	mp_length)__getitem____setitem____delitem____len__AS_MAPPING_SLOT_DEFS__contains__sq_containsAS_SEQUENCE_SLOT_DEFS__bool__nb_bool__int__nb_int	__float__nb_float__neg__nb_negative__pos__nb_positive__abs__nb_absolute
__invert__	nb_invert__add__nb_add__radd____sub__nb_subtract__rsub____mul__nb_multiply__rmul____mod__nb_remainder__rmod____truediv__nb_true_divide__rtruediv____floordiv__nb_floor_divide__rfloordiv__
__divmod__	nb_divmod__rdivmod__
__lshift__	nb_lshift__rlshift__
__rshift__	nb_rshift__rrshift____and__nb_and__rand____or__nb_or__ror____xor__nb_xor__rxor__
__matmul__nb_matrix_multiply__rmatmul____iadd__nb_inplace_addnb_inplace_subtractnb_inplace_multiplynb_inplace_remaindernb_inplace_true_dividenb_inplace_floor_dividenb_inplace_lshiftnb_inplace_rshiftnb_inplace_andnb_inplace_ornb_inplace_xornb_inplace_matrix_multiplynb_powernb_inplace_power)__isub____imul____imod____itruediv____ifloordiv____ilshift____irshift____iand____ior____ixor____imatmul____pow____rpow____ipow__AS_NUMBER_SLOT_DEFSam_awaitam_aiteram_anext)	__await__	__aiter__	__anext__AS_ASYNC_SLOT_DEFS
as_mappingPyMappingMethodsas_sequencePySequenceMethods	as_numberPyNumberMethodsas_asyncPyAsyncMethodsrW   c                    dS )NPyVectorcall_Call r4   s      r5   rH   rH      s    r7   attrc                R    |                      d          r| dk    s| dk    rd| z   S | S )zuMap dunder method name to sort key.

    Sort reverse operator methods and __delitem__ after others ('x' > '_').
    __rr   rb   x)
startswith)r   s    r5   slot_keyr      s;    
 	 4<#7#7DM<Q<QTzKr7   tabledict[str, str]c                   i }i }t          |                                d           D ]a\  }\  }}|                     |          }|rB|d         | k    s	|t          v r-||v r||         ||<   D || |d         |          }|||<   |||<   b|S )Nc                ,    t          | d                   S )Nr   )r   )r   s    r5   rE   z generate_slots.<locals>.<lambda>   s    xPQRSPT~~ r7   )key   r   )sorteditemsget_method_and_classALWAYS_FILL)	r+   r   r-   fields	generatedr;   slot	generator
method_clss	            r5   generate_slotsr      s    F "I#)%++--=U=U#V#V#V 
' 
'tY,,T22
 	':a=B..$+2E2Ey  (t !yZ]G<<#t"&	$Mr7   	c_emitterexternal_emitterNonec                   |j         }|                    |           }t          d|                    |            dd          |j        |<   | j        sd S t          | |           | j         o| j         }|rIt          t          | j	        |           dd          |j        |
                    | j	                  <   d S d S )NzPyTypeObject *;Tneeds_export)contexttype_struct_namer
   declarationsis_ext_classgenerate_object_structis_traitbuiltin_baser   ctornative_function_name)r+   r   r   r-   r   r;   generate_fulls          r5   generate_class_type_declr      s     G##B''D!2811"55888t" " "G
 ? 2/000O;BO(;M 
FW%bgw77:::G
 G
 G
W99"'BBCCC
 
r7   c                    | j         sJ |j        }|                     |j                  dz   }|                     |j                  }t          d| d| dd          |j        |<   dS )zGenerate a definition of a single-object per-class free "list".

    This speeds up object allocation and freeing when there are many short-lived
    objects.

    TODO: Generalize to support a free list with up to N objects.
    _free_instancezCPyThreadLocal z *r   Tr   N)reuse_freed_instancer   name_prefixr3   struct_namer
   r   )r+   r   r   r-   r   r;   r   s          r5   generate_class_reuser      s     """"G>>)/**-==D..11K!20+00000t" " "Gr7   modulec                   | j         }|                     j                  }                    | j                  }| d}| d}| d}| d}	| d}
| d}| d}| d}| d	}| d
}| d}dd| di}| j         o| j         }| j        p| j         p| j	        }| j        s||d<   |r"d| d|d<   | j
        sd| d|d<   d| d|d<   t          d | j        D             d          }|rd| |d<   |r|	|d<   ||d<   dQfd} |             |                     d          }|                     d          }|                    t          | t                                t"          D ]7\  }}}t          | |          }|rt%          | |||          }d| |d | <   8t'          |           }|r||d!<   |                     j                  }| j        rd"| j         d#}n| j        rd$}nd"| d#}| j	        r]t+          |           sM| d%}                     d&| d'd(| d)d*|  d)d+d,           ||d-<   | d.|d/<   j        d0k     r
||d1<   | |d2<   n||d/<   |rt| j        J                     t3          | j                  d3z              | j        J                     t3          | j                  d3z               |             |                     d          }t7          | ||
||            |             | j
        st9          | |            |             t;          | |            |             t=          | ||t?          |                      |             | j         r%tC          | |d4z   |
d4z   d56          }! |             nd}!tC          | ||
d76          }
 |             tE          | ||            |             |rtG          ||            |             |r5tI          |             |             tK          | |	            |             | j        rtM          | |           tO          | ||r|nd            |             g d8}"|r| j
        s|"(                    d9           | )                    d:          r_d;*                    |                     j                            |d<<   |"(                    d=           |+                    d>          sd?|d@<   t+          |           r|"(                    dA           dB,                    |"          |dC<   dDt[          |            d#|dE<                       dF.                    |            dG                               dH           |/                                D ]!\  }#}$                    dI|# dJ|$ dK           "                    d,                               dL*                    .                    |           M                     | j0        r71                    | j         dNz   |          }%                    dO|% dP                                            |rTte          | ||
|!                                            tg          | | j        |||
                                            |rti          |            dS dS )RzRGenerate C code for a class.

    This is the main entry point to the module.
    _new	_finalize_members
_getseters_vtable	_traverse_clear_dealloc_methods_trait_vtable_setup_coroutine_setuptp_name"tp_newz(destructor)
tp_deallocz(traverseproc)tp_traversez	(inquiry)tp_clearc              3  :   K   | ]}|j         d k    |j        V  dS )__del__N)r;   method).0rD   s     r5   	<genexpr>z!generate_class.<locals>.<genexpr>  s0      RRAaf	>Q>Qqx>Q>Q>Q>QRRr7   Ntp_finalize	tp_getset
tp_methodsr.   r   c                 0                                       d S r1   	emit_liner-   s   r5   r  z!generate_class.<locals>.emit_line  s    r7   __mypyc_defaults_setuprQ   &tp_tp_richcomparezsizeof()zsizeof(PyObject)z + sizeof(PyObject *)zPyMemberDef [] = {z{"__dict__", T_OBJECT_EX, z, 0, NULL},z{"__weakref__", T_OBJECT_EX, z{0}};
tp_membersz + 2*sizeof(PyObject *)tp_basicsize      tp_dictoffsettp_weaklistoffsetr   _shadowT)shadowF)Py_TPFLAGS_DEFAULTPy_TPFLAGS_HEAPTYPEPy_TPFLAGS_BASETYPEPy_TPFLAGS_HAVE_GCrR   zoffsetof({}, vectorcall)tp_vectorcall_offset_Py_TPFLAGS_HAVE_VECTORCALLtp_vectorcallr   rF   Py_TPFLAGS_MANAGED_DICT | tp_flagsz
PyDoc_STR(tp_doczstatic PyTypeObject z_template_ = {zPyVarObject_HEAD_INIT(NULL, 0). = ,z3static PyTypeObject *{t}_template = &{t}_template_;)rC   _cpyfunctionstatic PyObject *z = NULL;r.   r   )5r;   r   r3   r   setupr   r   needs_getsetersis_generatedhas_dict
is_acyclicnextvtable_entriesr:   updater   r\   SIDE_TABLESgenerate_side_table_for_classr   r   has_managed_dict
emit_linescapi_versionr  r   r   generate_new_for_classgenerate_traverse_for_classgenerate_clear_for_classgenerate_dealloc_for_classboolallow_interpreted_subclassesgenerate_vtablesgenerate_coroutine_setupgenerate_finalize_for_classgenerate_getseter_declarationsgenerate_getseters_tablegenerate_new_for_traitgenerate_methods_tableappend
has_methodformatgetjoinnative_class_doc_initializerr   r   coroutine_namestatic_namegenerate_setup_for_classgenerate_constructor_for_classgenerate_getseters)&r+   r   r-   r;   r   
setup_namenew_namefinalize_namemembers_namegetseters_namevtable_nametraverse_name
clear_namedealloc_namemethods_namevtable_setup_namecoroutine_setup_namer   r   r<  
del_methodr  defaults_fninit_fn
table_nametype	slot_defsslotstable_struct_namerichcompare_namer   	base_sizeweak_offsetshadow_vtable_nameflagsfieldvaluecpyfunctions&     `                                   r5   generate_classr|     s   
 7D..//K--bh77J###H"---M!+++L#///N )))K"---M'''J!+++L!+++L&;;;);;;'T5FO;BO(;M(N,?N2;O? $#x ACkCCC|} 	A$K[$K$K$KF=!!@[!@!@!@F:RR):RRRTXYYJ ? >} > >} -,{'F<      IKKK -- 899K mmJ''G MM.Y88999 (3 A A#
D)r9g66 	A =b*dTY[b c c)@->)@)@F%%%&3B@@ 4#3  ..//K	 -0bo000			 -&		,k,,,	 
{ ++B88 + #9990<000A)AAAF[FFF	
 	
 	
  ,|$-!F!F!F~'))&/F?#*5F&'!*~ x###07CCcIJJJw"""0'BBSHIII	--
++r8[*gwWWW	} 	'M7CCCIKKK Z999	"2|ZjAQAQSZ[[[	* 	&-=%	1;3JG\`. . . IKKKK!%&r+<k7[`aaa	 %967KKK	 #JwGGG	 &r7333	 ^W===		{ 6r8W5552|=-RZZdT[\\\IKKKPPPE +R] +)***	}}Z   4)C)J)JNN7=))*
 *
%& 	2333zz/** 	4 !4F9G$$ 0.///E**F:G$@$D$DGGGF8ZW-E-Eb-I-IZZZ[[[6777 2 2u0e000001111d=DD&&r** 	E 	
 	
   
 E))"'N*BFKKCkCCCDDD  [+?QSZ[[[&r27GZV]^^^ (2w'''''( (r7   	attributer3   r)   c                L    |                     | j        | j         d|           S )N_get_private_namemodule_namer;   r+   r}  r3   s      r5   getter_namer    *    bn.J.Jy.J.JKKKr7   c                L    |                     | j        | j         d|           S )N_set_r  r  s      r5   setter_namer    r  r7   c                b   t                      }g }|g dz  }|                     d          r|                    d           g }t          | j                  D ]Y}|j        sN|j        r|                    t          |j                  dz
            |vryt          dt          |j                  t                    D ]P}|                    |          }||vr5|                    t           d| d           |                    |           Q|j                                        D ]\  }}||vr|                    |                    |           |                    |           d           |                    |           t#          |t$                    r|                    |           [|                    d|                     |j                   d           |                    d	           t-          |d
          |j        j        |                     |j                  <   d S )N)ztypedef struct {PyObject_HEADzCPyVTableItem *vtable;rR   zvectorcallfunc vectorcall;r   r    r   z}  T)is_type)setrV  rU  reversedbase_mror   bitmap_attrsbitmap_fieldlenranger   r   
attributesr   ctype_spacedr   add
isinstancer&   declare_tuple_structr   r3   r
   r   r   )	r+   r-   
seen_attrslinesr  baseir   rtypes	            r5   r   r     s:   55JE	LLLLE	}}Z   31222L%% < <} 	<  6''D,=(>(>(BCC<WW"1c$*;&<&<kJJ 6 6&33A66|33!LLK)A)A$)A)A)ABBB(//555#4466 < <e z))LLG$8$8$?$?!VdASAS!V!V!VWWWNN4(((!%00 <44U;;;	LL7r~~gm44777888	LLBStC C CGO !>!>???r7   r  rj  re  r)  rL  c                    d fd}d fd}                     d                    |t          dt           j                  d	t           j                  z  z                                   j                                        D ]\  }}                     d
 ||           dt          dt          |                     d                                d                     ||          t          dt          |j                                                                      d                                t           | d                                d            j	        r!s                     t           | d           g }	 j                                        D ]X\  }} ||          }
 ||          }t          ||
g            t          ||            |	                    ||
|f           Yt           j        ||	                                d                                d           |	s|n| dt          |	          d	z   S )a  Emit the vtables and vtable setup functions for a class.

    This includes both the primary vtable and any trait implementation vtables.
    The trait vtables go before the main vtable, and have the following layout:
        {
            CPyType_T1,         // pointer to type object
            C_T1_trait_vtable,  // pointer to array of method pointers
            C_T1_offset_table,  // pointer to array of attribute offsets
            CPyType_T2,
            C_T2_trait_vtable,
            C_T2_offset_table,
            ...
        }
    The method implementations are calculated at the end of IR pass, attribute
    offsets are {offsetof(native__C, _x1), offsetof(native__C, _y1), ...}.

    To account for both dynamic loading and dynamic class creation,
    vtables are populated dynamically at class creation time, so we
    emit empty array definitions to store the vtables and a function to
    populate them.

    If shadow is True, generate "shadow vtables" that point to the
    shadow glue methods (which should dispatch via the Python C-API).

    Returns the expression to use to refer to the vtable, which might be
    different than the name, if there are trait vtables.
    traitr   r.   r/   c                    d                                         j                  |                     j                  rdnd          S )Nz{}_{}_trait_vtable{}r(  r  rW  r   r3   )r  r  r-   r)  s    r5   trait_vtable_namez+generate_vtables.<locals>.trait_vtable_name  sM    %,,W]++gm,,'IIR
 
 	
r7   c                    d                                         j                  |                     j                            S )Nz{}_{}_offset_tabler  )r  r  r-   s    r5   trait_offset_table_namez1generate_vtables.<locals>.trait_offset_table_name  s@    #**W]++U->->w}-M-M
 
 	
r7   zstatic CPyVTableItem {}[{}];r   r$  zstatic CPyVTableItem [z];zstatic size_t {}[{}];static boolz(void){z
_shadow();	return 1;}z + )r  r   r.   r/   )r  rW  maxr  rA  trait_vtablesr   r  r   rM  generate_vtablegenerate_offset_tablerU  )r  rj  re  r-   r)  r  r  r  vtable	subtablesr;   offset_names   `  ``       r5   rN  rN    s   >
 
 
 
 
 
 
 

 
 
 
 
 
 
 &--QD$7 8 81s4CU?V?V;V VWW	
 	
   +1133 

 

vV$5$5e$<$<VVs1c&kk?R?RVVV	
 	
 	
 	#**''..As5;K7L7L0M0M 	
 	
 	
 	
 m$$$A(9AAABBBc( K K]I,=IIIJJJI+1133 5 5v  ''--e44gr6:::k7E4@@@%{34444D'gy&QQQk"""c'T;;-T-TIQR@R-T-TTr7   r  r  c           	        |                     d|  d           |j        D ]I}|                     d|                    |j                   d|                    |           d           J|j        s|                     d           |                     d           |                     d                    | 	                     d
S )z0Generate attribute offset row of a trait vtable.zsize_t _scratch[] = {z	offsetof(, z),0r   /memcpy({name}, {name}_scratch, sizeof({name}));r;   N)r  r  r   r3   r   rW  )r  r-   r  r+   r   s        r5   r  r  )  s     H 7HHHIII  _ _]bnnW]&C&C]]w||TXGYGY]]]^^^^ #d9@@F]@^^    r7   entriesr    r  list[tuple[ClassIR, str, str]]c           
        |                     d| d           |rp|                     d           |D ]C\  }}}|                     d                    |                    |          ||                     D|                     d           | D ]}}|r|j        r|j        n|j        }	|                     d                    |                    |j        j                  t          |	                    |j	                                       ~| s|                     d           |                     d           |                     d	                    |
                     d S )NzCPyVTableItem r  z/* Array of trait vtables */z8(CPyVTableItem){}, (CPyVTableItem){}, (CPyVTableItem){},z/* Start of real vtable */z(CPyVTableItem){}{}{},NULLr   r  r  )
r  rW  r   shadow_methodr  get_group_prefixdeclr   r2   r3   )
r  re  r-   r  r)  r  r   offset_tableentryr  s
             r5   r  r  9  s    C{CCCDDD 88999*3 	 	&E5,JQQ,,U33UL    
 	6777 
 
(.X53FX$$EL$++(():;;W]++ 	
 	
 	
 	
  "&!!!dGNNT_N``aaaaar7   rm  FuncIR | Nonerw  
str | Nonec                f   |                     t          | j        |                     |                     d           t          | j        j        j        d         j        z   }|                     d| d           |                     |j                  }|                     | d           | 	                    |j                  }| j
        r|                     d| d           |                     d| d	           |                     | d
           |                     d           | j        s|                     d           |t          |d|           |                     d           |                     d           |                     d|                     |j                   d           |                     d           |                     d           |r|                     d|                    |            d           |                     d| d           |                     d           |                     d| d           |                     d           n|                     d| d           t          | |           |                     d          rM|                     d                              |j                  }|                     dt$           | d           t'          | j                  D ]h}	|	j                                        D ]L\  }
}|                    |          }|dk    r,|                    d|                    |
           |           Mi|t          |d|           |                     d           |                     d           dS )zAGenerate a native function that allocates an instance of a class.r  r   z$PyTypeObject *type = (PyTypeObject*)r   z *self;if (z_free_instance != NULL) {zself = z_free_instance;z_free_instance = NULL;zPy_SET_REFCNT(self, 1);zPyObject_GC_Track(self);Nselfzreturn (PyObject *)self;r  zself = (z *)type->tp_alloc(type, 0);if (self == NULL)    return NULL;if (type != ) {zself->vtable = } else {rR   zself->vectorcall = r  self->)r  r   r;  r   sigargsr;   r   r3   r   r   r?  emit_attr_defaults_func_callr   emit_clear_bitmapsrV  method_declr2   r   r  r  r  r   c_undefined_valueset_undefined_valuer   )r+   rm  re  rw  r-   type_arg_namer   prefixr;   r  r   r  rz  s                r5   r]  r]  \  s    ,RXw??@@@c!21!5!::MM]MMMNNN..//K---...^^GM**F	 CCCCDDD;F;;;<<<V;;;<<<3444} 	:8999"(fgFFF4555#[!>!>[[[\\\)***())) <K)A)A")E)EKKKLLLA,>AAABBB*%%%:K:::;;;#:K:::;;;r7###	}}Z   A~~j))//>>?????@@@%% R R?0022 	R 	RKD%--e44E ++,IW\\$5G5G,I,I5QQQ	R $[&'BBB0111cr7   c                    t          dt          | j                  t                    D ]0}|                    |          }|                    d| d           1dS )zMEmit C code to clear bitmaps that track if attributes have an assigned value.r   r  z = 0;N)r  r  r  r   r  r  )r+   r-   r  ry  s       r5   r  r    sg    1c"/**K88 1 1$$Q''/5///00001 1r7   	self_namec                    |                     d                    t          |                     |j                  |          ddd           dS )z{Emit C code to initialize attribute defaults by calling defaults_fn.

    The code returns NULL on a raised exception.
    z!if ({}{}((PyObject *){}) == 0) {{Py_DECREF(self);return NULL;r  N)rF  rW  r   r2   r3   )rm  r  r-   s      r5   r  r    s[    
 +22;,,W];;Y	
 	
 	    r7   r`  type_argnative_prefixnew_argsc                
   dfd}|                      d          }|s(                    d| d| d            |             d S |r"                    |j                  t          z   nt
          }|}	|dk    r|	d	|z   z  }	                    d| |                    j                   d|	 d            |                                 d
                    |            d                               d           d S )Nr.   r   c                 \                          d                                 d           d S )Nr  r  r  r  s   r5   emit_null_checkz6emit_setup_or_dunder_new_call.<locals>.emit_null_check  s3    -...,-----r7   __new__zPyObject *self = ();r  r  zif (Py_TYPE(self) != r  z    return self;r:  )	r:   r  r  r  r   r   r2   r3   r   )
r+   r`  r  r  r  r-   r  new_fnr  all_argss
        `    r5   emit_setup_or_dunder_new_callr    sM   . . . . . . ]]9%%F GjGG8GGGHHHFS_W%%fk22]BBY_FH2~~D8O#\&\&,,w}2M2M\\PX\\\]]]O Mg.F.Fr.J.JMMMNNN()))))r7   r#   rn  c           	     d   |                     t          ||                      |                     d           d |j        j        D             }d|                    |           z   }d                    |          }|                     d          o\t          |j        j                  dk    o?|j        j        d         j        t          k    o|j        j        d         j        t          k    }	t          | |||	 ||           d                    d	g|z             }
||	rt          nt          }|	rdnd}|                     d                    |                    |j                  ||                    |j                  |
|                     |                     d           |                     d           |                     d           |                     d           nt          |j        j                  dk    r|                     d|                    |            d|
 d           |                     d           |                     d           |                     d           |                     d           |                     d           |                     d           d
S )zQGenerate a native function that allocates and initializes an instance of a class.r  c                ,    g | ]}t           |j        z   S r   )r   r;   )r  args     r5   
<listcomp>z2generate_constructor_for_class.<locals>.<listcomp>  s    <<<zCH$<<<r7   z(PyObject *)r  r     r   r   r  Nz!= NULL ? 0 : -1r  zchar res = {}{}{}({}){};zif (res == 2) {r  r  r  z
int res = z
->tp_init(r  if (res < 0) {return self;)r  r   r  r  r   rY  rV  r  kindr   r   r  r   r   rW  r  r  r2   r3   )r+   r,   rn  r`  re  r-   fn_argsr  r  use_wrapperr  r  casts                r5   r^  r^    s    /G<<>???c<<<<<G 8 8 < <<Hyy!!H 	i   	-!	-FKN8+	- FKN9,	  ""j(OXW^___99fX'((D&9M%08!!b&--((66gm,, 	
 	
 	
 	+,,,,---.)))# 
RV[		A		Ww'?'?'C'CWWtWWWXXX*+++,---.)))#n%%%cr7   c                   |                      |j                   d}|                    d           |                    | d           |                    d           | j        s| j        s|                     d          rG|                    d                    t          |                    |j                                       n|                    d           |                    d           |S )	zGenerate an init function suitable for use as tp_init.

    tp_init needs to be a function that returns an int, and our
    __init__ methods return a PyObject. Translate NULL to -1,
    everything else to 0.
    _init
static intz0(PyObject *self, PyObject *args, PyObject *kwds)r  r  z/return {}{}(self, args, kwds) != NULL ? 0 : -1;	return 0;r  )	r   r3   r  rM  r   rV  rW  r   r2   )r+   rn  r-   	func_names       r5   r@   r@     s     >>'-00777Il###TTTUUUc	& '"/ 'R]]9=U=U '=DDgm44 	
 	
 	
 	
 	+&&&cr7   r  c                ,   |                     d           |                     | d           |                     d           | j        sk|                     d|                    |            d           |                     d           |                     d           |                     d           d	}d
}t          | ||d||           |r7| j        s0| j        s)|                                 s|                     d          r|                     d           nc|                     dt           |                    |j	                   d           |
                    dd           |                     d           |                     d           d S )Nr9  4(PyTypeObject *type, PyObject *args, PyObject *kwds)r  r  r  zUPyErr_SetString(PyExc_TypeError, "interpreted classes cannot inherit from compiled");r  r  z(PyObject*)typez
args, kwdsFr  r  zPyObject *ret = z(self, args, kwds);zif (ret == NULL)r  )r  rM  r   r  r   is_serializablerV  r   r2   r3   rF  )r+   r  re  r`  rn  r-   r  r  s           r5   rH  rH     s    )***XXXYYYc* K)A)A")E)EKKKLLLc	
 	
 	
 	.)))# HH!"j(E8WUUU*** ?* 	*
 ==##* 	.))))
 	XvXw}}W]'C'CXXX	
 	
 	
 	-/ABBB.)))cr7   c                   |                     d           |                     | d           |                     d           |                     d|                    |            d           |                     d           |                     d           |                     d           |                     d	           |                     d
           |                     d	           d S )Nr9  r  r  r  r  z\PyErr_SetString(PyExc_TypeError, "interpreted classes cannot inherit from compiled traits");r  zGPyErr_SetString(PyExc_TypeError, "traits may not be directly created");r  r  )r  r   )r+   r  r-   s      r5   rS  rS  L  s   )***XXXYYYcGW%=%=b%A%AGGGHHH	F   j!!!_```cn%%%cr7   c                   |                     d           |                     | d|                     |j                   d           |                     d           t          | j                  D ]M}|j                                        D ]1\  }}|                    d|                    |           |           2Nt          | |          r|                     d           n_| j
        rX|                     |j                  }|                    d| dt                     |                    d	| dt                     |                     d
           |                     d           dS )z>Emit function that performs cycle GC traversal of an instance.r  r  z# *self, visitproc visit, void *arg)r  r  z8PyObject_VisitManagedDict((PyObject *)self, visit, arg);&*((PyObject **)((char *)self + sizeof()));*((PyObject **)((char *)self + sizeof(PyObject *) + sizeof(r  r  N)r  r   r3   r  r  r  r   emit_gc_visitr   rE  r>  r(   r+   r  r-   r  r   r  r   s          r5   rI  rI  \  s   l###YYr~~gm44YYY   c%% H H?0022 	H 	HKD%!!"?7<<+=+="?"?GGGG	HG$$ 
TUUUU	 	
nnW]33E[EEEGX	
 	
 	
 	Z+ZZZ	
 	
 	
 k"""cr7   c                   |                     d           |                     | d|                     |j                   d           |                     d           t          | j                  D ]M}|j                                        D ]1\  }}|                    d|                    |           |           2Nt          | |          r|                     d           n_| j
        rX|                     |j                  }|                    d| dt                     |                    d	| dt                     |                     d
           |                     d           d S )Nr  r   *self)r  r  z,PyObject_ClearManagedDict((PyObject *)self);r  r  r  r  r  )r  r   r3   r  r  r  r   emit_gc_clearr   rE  r>  r(   r  s          r5   rJ  rJ  v  s   l###KKR^^GM%B%BKKKLLLc%% H H?0022 	H 	HKD%!!"?7<<+=+="?"?GGGG	HG$$ 
HIIII	 	
nnW]33E[EEEGX	
 	
 	
 	Z+ZZZ	
 	
 	
 k"""cr7   dealloc_func_nameclear_func_namehas_tp_finalizec                   |                     d           |                     | d|                     |j                   d           |                     d           |r|                     d           |                     d           |                     d           |                     d           |                     d	           |                     d
           |                     d           |                     d           |                     d           |                     d           |                     d           | j        s|                     d           | j        rt          | |           |                     d| d           |                     | d           |                     d           |                     d           |                     d           |                     d           d S )Nstatic voidr  r  r  z#PyObject *type, *value, *traceback;z'PyErr_Fetch(&type, &value, &traceback);z>int res = PyObject_CallFinalizerFromDealloc((PyObject *)self);zif (PyErr_Occurred() != NULL) {z(PyErr_WriteUnraisable((PyObject *)self);z	res = -1;r  z&PyErr_Restore(type, value, traceback);r  z
goto done;zPyObject_GC_UnTrack(self);zCPy_TRASHCAN_BEGIN(self, r  z(self);z)Py_TYPE(self)->tp_free((PyObject *)self);zCPy_TRASHCAN_END(self)zdone: ;)r  r   r3   r?  r   emit_reuse_dealloc)r+   r  r  r  r-   s        r5   rK  rK    s    m$$$*SSR^^GM-J-JSSSTTTc ?@@@CDDDZ[[[
 	;<<<DEEE+&&&#BCCC*+++,'''#= 86777	 (2w'''F2CFFFGGG111222ABBB.///i   cr7   c                   |                      |j                  }|                    d| d           |                    | d           t          | |           t	          | j                  D ]M}|j                                        D ]1\  }}|                    d|	                    |           |           2N|                    d           |                    d           dS )zEmit code to deallocate object by putting it to per-type free list.

    The free "list" currently can have up to one object.
    r  z_free_instance == NULL) {z_free_instance = self;r  zreturn;r  N)
r   r3   r  r  r  r  r  r   emit_reuse_clearr   )r+   r-   r  r  r   r  s         r5   r  r    s   
 ^^GM**F?V???@@@777888 r7###%% K K?0022 	K 	KKD%$$%Bgll4.@.@%B%BEJJJJ	K i   cr7   rl  finalize_func_namec           	     r   |                     d           |                     | d           |                     d           |                     d                    |                    | j                  t          |                     |j                                       |                     d           d S )Nr  z(PyObject *self)r  z{}{}{}(self);r  )r  rW  r  r  r   r2   r3   )rl  r  r-   s      r5   rP  rP    s     m$$$+===>>>c$$Z_55W]++	
 	
   cr7   r;   c                   |                     d| d           |r|                     d| d           | j                                        D ]}|j        j        s|j        j        s|j        r#|                     d|j         d           |                     dt           |	                    |j
                   d           d	d
g}|j        j        t          k    r|                    d           n*|j        j        t          k    r|                    d           t          |          }|                     d                    d                    |          |                     |                     d          s+|                     d          s|                    dd           |                     d           |                     d           d S )Nzstatic PyMethodDef r  z({"__internal_mypyc_setup", (PyCFunction)z, METH_O, NULL},{"",z (PyCFunction)r7  METH_FASTCALLMETH_KEYWORDSMETH_STATIC
METH_CLASSz {}, PyDoc_STR({})}},r2  __setstate____getstate__z@{"__setstate__", (PyCFunction)CPyPickle_SetState, METH_O, NULL},zE{"__getstate__", (PyCFunction)CPyPickle_GetState, METH_NOARGS, NULL},{NULL}  /* Sentinel */r   )r  methodsvaluesr  is_prop_setteris_prop_getterinternalr;   r   r2   r3   r  r"   rU  r!   r   rW  rY  rV  rF  )r+   r;   r`  r-   r,   rx  docs          r5   rT  rT    s    9D999::: 
 	U
UUU	
 	
 	
 j!! R R7! 	RW%; 	r{ 	++++,,,M6M288GM3J3JMMMNNN /27<,,,LL''''W\---LL&&&-b11188E9J9JCPPQQQQ ==(( 
~1N1N 
NS	
 	
 	

 .///dr7   rp  rr  c                   |                      |j                   d| }|                    d| d| d           |                                D ]!\  }}|                    d| d| d           "|                    d           |S )	N_zstatic r  z = {r5  r6  r7  r   )r   r3   r  r   )r+   r;   rp  rr  r-   ry  rz  s          r5   rD  rD    s     nnW]++44d44D222t222333 2 2u0e000001111dKr7   c           
        | j         s| j        D ]}|                    d           |                    d                    t	          | ||j                  |                     |j                                       |                    d           |                    d                    t          | ||j                  |                     |j                                       | j        	                                D ]\  }\  }}|j
        j        r|                    d           |                    d                    t	          | ||j                  |                     |j                                       |rj|                    d           |                    d                    t          | ||j                  |                     |j                                       d S )Nr9  z{}({} *self, void *closure);r  z-{}({} *self, PyObject *value, void *closure);)r   r  r  rW  r  r3   r   r  
propertiesr   r  implicit)r+   r-   r   propgettersetters         r5   rQ  rQ  	  s   ; M 	 	D1222.55D'-88"..:W:W   
 l+++?FFD'-88"..:W:W     #%-"5"5"7"7  vv; 	 	-...*11Bgm44bnnW]6S6S 	
 	
 	
  	l+++?FFD'-88"..:W:W    r7   c                   |                     d| d           | j        s| j        D ]}|                     d| d           |                     d                    t	          | ||j                  t          | ||j                                       |                     d           | j                                        D ]\  }\  }}|j	        j
        r|                     d| d           |                     dt	          | ||j                   d           |rC|                     d	t          | ||j                   d           |                     d
           |                     d           | j        r|                     d           |                     d           |                     d           d S )Nzstatic PyGetSetDef r  r  r  z (getter){}, (setter){},z NULL, NULL},z	 (getter)r7  z	 (setter)zNULL, NULL},zNULL, NULL, NULL},z?{"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},r  r   )r  r   r  rW  r  r3   r  r   r   r  r!  r>  )r+   r;   r-   r   r"  r#  r$  s          r5   rR  rR  /  s   9D999:::; /M 	/ 	/DnDnnn---*11D'-88+b$PWP]:^:^   
 o...."$-"5"5"7"7 4 4vv; 	....)))Mk"dGM&J&JMMMNNN 	4Q+b$*N*NQQQRRRn----23333	{ ][\\\.///dr7   c                   | j         st          | j                                                  D ]q\  }\  }}t	          | |||           |                    d           t          | |||           |t          | j                  dz
  k     r|                    d           r| j                                        D ]\  }\  }}|j	        j
        r|j        j        }|                    d           t          | ||||           |r?|j        j        d         j        }|                    d           t!          | ||||           d S )Nr  r   )r   	enumerater  r   generate_getterr  generate_setterr  r   r  r!  r  ret_typegenerate_readonly_getterr  rp  generate_property_setter)	r+   r-   r  r   r  r"  r#  r$  arg_types	            r5   r_  r_  N  sc   ; & )"-*=*=*?*? @ @ 	& 	&A}eBeW555b!!!BeW5553r}%%)))!!"%%%"$-"5"5"7"7 
J 
Jvv; 	
#" T5&'BBB 	Jzq).Hb!!!$RxIII
J 
Jr7   r  r'   c           	     `   |                     |          }|                    d           |                    d                    t          | ||j                  |                     |j                                       |                    d           d| }|                     |          o|j         }|s|                    ||dd|| d           |                    d	           |                    d
t          |           dt          | j
                   d           |                    d           |                    d           |                    d| |           |                    d| d|d           |                    d           |                    d           d S )Nr9  {}({} *self, void *closure)r  r  z==r  T)unlikely%PyErr_SetString(PyExc_AttributeError,z    "attribute z of z undefined");r  r  retvaldeclare_destzreturn retval;)r   r  rW  r  r3   r   is_always_definedis_refcountedemit_undefined_attr_checkreprr;   emit_inc_refemit_box)r+   r   r  r-   
attr_field	attr_expralways_defineds          r5   r(  r(  c  s   d##J)***%,,D'-00"..2O2O	
 	
  
 c%%%I
 ))$//K8K4KN ))%D&$PR]a)bbbABBBXDJJXXDMMXXXYYY.)))#.*..666*j**He$OOO&'''cr7   c           	     b   |                     |          }|                    d           |                    d                    t          | ||j                  |                     |j                                       |                    d           |                     |          }|s|                    d           |                    d           |                    dt          | j                   dt          |           d           |                    d	           |                    d
           | 	                    |          o|j
         }|j
        rQd| }|s|                    ||dd||            |                    d| |           |s|                    d
           |r|                    d           |j        r(|                    dd|t          d          d           nZt!          |t"                    r|                    d           n/|                    dd|d           |                    dd           |                    d|           |                    d| d           |j        r|s|                    dd|| |           |rb|                    d           |                    d| |           |j        r|                    d|| |           |                    d
           |                    d           |                    d
           d S )Nr  ,{}({} *self, PyObject *value, void *closure)r  zif (value == NULL) {r1  z    "z object attribute z cannot be deleted");z
return -1;r  r  z!=r  zif (value != NULL) {rz  tmp-1Terrorr4  zPyObject *tmp = value;r3  z	if (!tmp)z    return -1;z = tmp;r  r  )r   r  rW  r  r3   r   is_deletabler8  r;   r5  r6  r7  emit_dec_ref
is_unboxed
emit_unboxr   r*   r(   	emit_castrF  r9  error_overlapemit_attr_bitmap_setr  emit_attr_bitmap_clear)r+   r   r  r-   r;  	deletabler=  r<  s           r5   r)  r)    s   d##Jl###6==D'-00"..2O2O	
 	
  
 c%%I 0111ABBBVDMMVVT$ZZVVV	
 	
 	
 	,'''#
 ))$//K8K4KN #)Z))	 	X--eYfdTVWWW2j22E::: 	#c""" 20111 :7E5d8K8KZ^____	e.	/	/ :23333'5%dCCC;(8999&&&2z222333 E> E$$UFE2tDDD *%%%##$9Z$9$95AAA 	D**65"dCCC#k"""cr7   func_irc           	        |                     d           |                     d                    t          | ||j                  |                     |j                                       |                     d           |j        r|                     d                    |                    |          t          |                    |j                                       |	                    d|d           |
                    dd|d	           |                     d
           n8|                     dt           |                    |j                   d           |                     d           d S )Nr9  r/  r  z#{}retval = {}{}((PyObject *) self);r2  r  retboxTr3  zreturn retbox;zreturn z((PyObject *) self);r  )r  rW  r  r3   r   rF  r  r   r2   emit_error_checkr:  )r+   r   r  rM  r-   s        r5   r+  r+    sx    )***%,,D'-00"..2O2O	
 	
  
 c 
188$$U++]GMM'-<X<X 	
 	
 	

 	  5.AAA8UFFF*++++WmWW]]7=%A%AWWW	
 	
 	
 cr7   r-  c           	        |                     d           |                     d                    t          | ||j                  |                     |j                                       |                     d           |j        r_|                    dd|t          d          d           |                     t           |	                    |j                   d	           n7|                     t           |	                    |j                   d
           |                     d           |                     d           d S )Nr  r?  r  rz  r@  rA  TrB  z((PyObject *) self, tmp);z((PyObject *) self, value);r  r  )
r  rW  r  r3   r   rF  rG  r   r   r2   )r+   r   r-  rM  r-   s        r5   r,  r,    sR    l###6==D'-00"..2O2O	
 	
  
 c 
7E8=;N;N]abbbUgmmGM::UUU	
 	
 	
 	
 	WgmmGM::WWW	
 	
 	
 k"""cr7   c                <    |j         dk    o| j        o
| j        dk    S )z6Should the class get the Py_TPFLAGS_MANAGED_DICT flag?r#  PyBaseExceptionObject)rG  r>  r   )r+   r-   s     r5   rE  rE    s.     	' 	7K	7O66r7   c                    |                      d          }|2t          |d          }|dS |                    d| j        d          }n
| j         d}| d}t	          |                    dd	
                    S )NrQ   T)boundr  r   z()z
--

asciibackslashreplace)errors)r:   r%   replacer;   r   encode)r+   rn  text_sig	docstrings       r5   rZ  rZ    s    mmJ''G%gT:::6##J;;g>>>%%%I	 0 0AS 0 T TUUUr7   rk  r  c           	     &                        d                                t           | d                                d           ddfd
}dfd}| j        ry || j        d         | j                  }|                     j                  }                    t                    }                     d| d| d| d            |            S t          d | j        	                                D                       s
 |            S                      d           | j        	                                D ]}	|	j
        j        st          |	j        |	j
        j        |	j                  }
 ||	|
          }| d}                     d| d|	j         d                                d| d                                                                d| d| d                                            |            S )Nr  z(PyObject *type)r  z    return 2;r,   r$   fn_namer/   r.   c                F    j         pd}                    | ||          S )Nr  )filepathemit_cpyfunction_instance)r,   r^  r`  r-   
error_stmts      r5   emit_instancez/generate_coroutine_setup.<locals>.emit_instance  s*    #)r00Wh
SSSr7   r   c                 \                          d                                 d           d S )Nr  r  r  r  s   r5   successz)generate_coroutine_setup.<locals>.success  s1    +&&&#r7   rR   z((z
 *)type)->r6  r   c              3  .   K   | ]}|j         j        V  d S r1   )r  is_coroutine)r  r,   s     r5   r  z+generate_coroutine_setup.<locals>.<genexpr>  s'      BBrw#BBBBBBr7   z(PyTypeObject *tp = (PyTypeObject *)type;_namez
PyObject *z = PyUnicode_FromString("z");zif (unlikely(!z))z if (PyDict_SetItem(tp->tp_dict, r  z) < 0))r,   r$   r^  r/   r.   r/   r:  )r  r   r[  r  r   r3   r   r   anyr  r  rg  r   r;   	shortnameline)r+   rk  r  r-   rc  re  wrapper_namer   r   r,   r;   name_objrb  s      `        @r5   rO  rO    s    m$$$N(<NNNOOOc JT T T T T T T      
 $}RZ
%;R=NOOnnW]33||,--N{NNdNN|NNNOOOwyyBBbj.?.?.A.ABBBBB wyy@AAAj!! & &w# 	!"'27+<bgFF$}R..")))VxVV"'VVVWWW78777888*%%%]X]]]]]^^^*%%%%799r7   N)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-   r	   r.   r   )r+   r   r}  r/   r3   r)   r.   r/   )r+   r   r-   r	   r.   r   )r  r   rj  r/   re  r/   r-   r	   r)  rL  r.   r/   )
r  r/   r-   r	   r  r   r+   r   r.   r   )r  r    re  r/   r-   r	   r  r  r)  rL  r.   r   )r+   r   rm  r  re  r/   rw  r  r-   r	   r.   r   )rm  r$   r  r/   r-   r	   r.   r   )r+   r   r`  r/   r  r/   r  rL  r  r/   r-   r	   r.   r   )r+   r   r,   r#   rn  r  r`  r/   re  r/   r-   r	   r.   r   )r+   r   rn  r$   r-   r	   r.   r/   )r+   r   r  r/   re  r/   r`  r/   rn  r  r-   r	   r.   r   )r+   r   r  r/   r-   r	   r.   r   )r+   r   r  r/   r  r/   r  rL  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/   rp  r/   rr  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'   rM  r$   r-   r	   r.   r   )r+   r   r   r/   r-  r'   rM  r$   r-   r	   r.   r   )r+   r   r-   r	   r.   rL  )r+   r   r.   r/   )
r+   r   rk  r/   r  r/   r-   r	   r.   r   )i__doc__
__future__r   collections.abcr   r   
mypy.nodesr   r   mypyc.codegen.cstringr   mypyc.codegen.emitr	   r
   r   r   mypyc.codegen.emitfuncr   mypyc.codegen.emitwrapperr   r   r   r   r   r   r   r   r   r   mypyc.commonr   r   r   r   r   r   r   mypyc.ir.class_irr   r    mypyc.ir.func_irr!   r"   r#   r$   r%   mypyc.ir.rtypesr&   r'   r(   mypyc.namegenr)   mypyc.sametyper*   r6   r=   r/   SlotGeneratortupler[   r\   __annotations__rd   rg   r   r   rC  r   rH   r   r   r   r   r|  r  r  r   rN  r  r  r]  r  r  r  r^  r@   rH  rS  rI  rJ  rK  r  rP  rT  rD  rQ  rR  r_  r(  r)  r+  r,  rE  rZ  rO  r   r7   r5   <module>r     s(
   > > > " " " " " " - - - - - - - - * * * * * * * * 6 6 6 6 6 6            : 9 9 9 9 9                                         5 4 4 4 4 4 4 4              = < < < < < < < < < ' ' ' ' ' ' ' ' ' ' ' '7 7 7 7? ? ? ? '673S89CsM1223	 LLMJJK+&K(,K(12 45!#34!#34 	     #$;<&(EF&(EF12	# #      %3]D]4^#_  _ _ _ _6"126" 126" *56	6"
 676" 676" 676" ; 786" 126" 236" 676"  786" 676"  786"   78!6"" !89#6"$ $&=>%6"& %'>?'6" 6"( &(?@)6"* ')@A+6", ; 78-6". K!89/6"0 ; 7816"2 K!8936"4 ; 7856"6 K!8976"8 1296": 23;6"< w/0=6"> 01?6"@ 12A6"B 23C6"D ')@AE6"F (*ABG6"J !#:;K6" 6"L '(?@&(?@')@A-/FG/1HI')@A')@A!#:;!89!#:;02IJ 3445#%:;k6" 6" 6"  6 6 6 6r k*k*k*! !      %';<')>?#%89!#56	 l         &
 
 
 
*   &z( z( z( z(zL L L LL L L L   DSU SU SU SUl     b  b  b  bF> > > >B1 1 1 1   * * * *:4 4 4 4n   2) ) ) )X       4   .% % % %P   *    ! ! ! !H   # # # #L   >J J J J*   87 7 7 7t   4   .	 	 	 	
V 
V 
V 
V+ + + + + +r7   