NL ihUdZddlmZddlZddlZddlZddlmZmZddl m Z ddl m Z m Z mZmZmZmZmZmZddlmZmZddlmZdd lmZmZdd lmZmZmZm 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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9dd l:m;Z;mZ>d Z?de@d<GddZAGddZBGddZCGddeCZDGddeCZEGddeCZFGddeCZGGddZHd d d"d!ZIy)#zUtilities for emitting C code.) annotationsN)CallableFinal)Literals) ATTR_PREFIX BITMAP_BITSFAST_ISINSTANCE_MAX_SUBCLASSES HAVE_IMMORTAL NATIVE_PREFIX REG_PREFIX STATIC_PREFIX TYPE_PREFIX)ClassIRall_concrete_classes)FuncDecl) BasicBlockValue) RInstance RPrimitiveRTupleRTypeRUnionint_rprimitiveis_bool_or_bit_rprimitiveis_bytes_rprimitiveis_dict_rprimitiveis_fixed_width_rtypeis_float_rprimitiveis_frozenset_rprimitiveis_int16_rprimitiveis_int32_rprimitiveis_int64_rprimitiveis_int_rprimitiveis_list_rprimitiveis_native_rprimitiveis_none_rprimitiveis_object_rprimitiveis_optional_typeis_range_rprimitiveis_set_rprimitiveis_short_int_rprimitiveis_str_rprimitiveis_tuple_rprimitiveis_uint8_rprimitiveobject_rprimitiveoptional_value_type) NameGenerator exported_name) is_same_typeFr DEBUG_ERRORSc<eZdZdZ ddddd ddZy)HeaderDeclarationanA 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) dependenciesis_type needs_exportct|tr|gn||_||_|xs t |_||_||_yN) isinstancestrdecldefnsetr7r8r9)selfr>r?r7r8r9s X/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/mypyc/codegen/emit.py__init__zHeaderDeclaration.__init__Os=)s3TF  (1CE (r;) r>zstr | list[str]r?zlist[str] | Noner7zset[str] | Noner8boolr9rEreturnNone__name__ __module__ __qualname____doc__rCrDrBr6r6?s[ $"& ) )-" ) ) ) & )  ) )  )rDr6c,eZdZdZ d ddZy)EmitterContextz-Shared emitter state for a compilation group.Ncd|_||_||_|xsi|_t |_i|_t|_y)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 rN) temp_counternames group_name group_mapr@ group_deps declarationsrliterals)rArRrSrTs rBrCzEmitterContext.__init__bsA $"b$'E;=  rDNN)rRr1rS str | NonerTzdict[str, str | None] | NonerFrGrHrMrDrBrOrO_s87 "&26 ###0 #  #rDrOceZdZdZy) ErrorHandlerz3Describes handling errors in unbox/cast operations.NrIrJrKrLrMrDrBr[r[s=rDr[ceZdZdZy) AssignHandlerzAssign an error value on error.Nr\rMrDrBr^r^s)rDr^ceZdZdZddZy) GotoHandlerzGoto label on error.c||_yr;labelrArcs rBrCzGotoHandler.__init__  rDN)rcr=rFrGrHrMrDrBr`r`s rDr`c,eZdZdZ ddZy)TracebackAndGotoHandlerz+Add traceback item and goto label on error.c<||_||_||_||_yr;)rc source_path module_nametraceback_entry)rArcrirjrks rBrCz TracebackAndGotoHandler.__init__s# &&.rDN) rcr=rir=rjr=rktuple[str, int]rFrGrHrMrDrBrgrgs25//'*/9</O^/ /rDrgceZdZdZddZy) ReturnHandlerz!Return a constant value on error.c||_yr;)value)rArps rBrCzReturnHandler.__init__rerDN)rpr=rFrGrHrMrDrBrnrns +rDrnceZdZdZ dA dBdZdCdZdCdZdDdZdEdZdFdZ dGd Z dHdd dId Z dJd Z dKd Z dLdZdMdZdNdZdNdZdOdZdPdZefdQdZdRdZdSdZdSdZdSdZdSdZdTdZdUdZdVdZdWdZ dXdZdYdZ dZd Z!d!d" d[d#Z"d\d$Z#d%d& d]d'Z$d^d(Z%dSd)Z&d_d*Z'd!d+d`d,Z(d!d!d- dad.Z)dbd/Z*d!dd%d!dd%d0 dcd1Z+ ddd2Z, ded3Z- dfd4Z.dgd5Z/d!dd%d!d!d6 dhd7Z0 di djd8Z1dkd9Z2dld:Z3dld;Z4dld<Z5 dmd=Z6 dnd>Z7 do dpd?Z8 dqd@Z9y)rEmitterzHelper for C code generation.Nc||_|xstjdd|_|j|_|xsi|_g|_d|_y)Nr)contextsys version_info capi_versionrR value_names fragments_indent)rAruryrxs rBrCzEmitter.__init__sK  (@C,<,z,Emitter.object_annotation..s:!qI~:s)z/*z*/ )maxsplit z /* z */) r{lenpprintpformatmaxanysplittextwrapr)rAobjline line_width first_linerestcomment_continuedrs @rBobject_annotationzEmitter.object_annotations\\CI- NN3CZQS >)C( (rD)annc|jdr|j||j||nd}|jj |j dz|z|zdz|j dr|jyy)N}rrr{) startswithrrrzappendr{endswithr)rArrcomments rB emit_linezEmitter.emit_liness ??3  KKM7:$((d3B dllS047'ADHI ==  KKM rDc4|D]}|j|yr;)r)rAlinesrs rB emit_lineszEmitter.emit_liness !D NN4  !rDct|tr|}n-|jdk(s |jsy|j|}|jj |dy)Nrz: ; )r<r=rc referencedrzr)rArctexts rB emit_labelzEmitter.emit_labelsN eS !D{{au'7'7::e$D en-rDcN|jj|jyr;)rzextend)rAemitters rBemit_from_emitterzEmitter.emit_from_emitters g//0rDc |jdd}|jddjd|zgt|zz|jdy)Nrz\nz printf(%s);, z"%s"zfflush(stdout);)replacerjoinlist)rAfmtargss rB emit_printfzEmitter.emit_printfsHkk$& }tyy&3,$t*1L'MMN ()rDcr|jxjdz c_d|jjzS)Nrz__tmp%drurQrs rB temp_namezEmitter.temp_names, !!Q&!4<<4444rDcr|jxjdz c_d|jjzS)Nrz__LL%drrs rB new_labelzEmitter.new_labels, !!Q&!$,,3333rDc|jj}|j|}|rM||jjk7r4|jjj |dt |dSy)aGet 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)rurTgetrSrUaddr2)rArjgroupstarget_group_names rBget_module_group_prefixzEmitter.get_module_group_prefixsi$''"JJ{3 !2dll6M6M!M LL # # ' '(9 :m,=>?qA ArDc8|j|jS)z#Get the group prefix for an object.)rrj)rArs rBget_group_prefixzEmitter.get_group_prefixs++COO<d}|jD]-}|j|j |d|d|d z }/|jd |jd|jd |jd |S) Nz#ifndef MYPYC_DECLARED_z#define MYPYC_DECLARED_ztypedef struct z {rzint empty_struct_error_flag;f;rz} z#endifr) struct_namertypesrr)rArtupleresultityps rBtuple_c_declarationzEmitter.tuple_c_declarationNs%f&8&8%9 :%f&8&8%9 :f001 5  v||  ! MM8 9A||  !2!23!7 8!A>?Q   F../q12 h b rDc0|tz}|dk(ryd|dzS)z.Return C field name used for attribute bitmap.rbitmapr)r)rAindexns rB bitmap_fieldzEmitter.bitmap_fieldcs' [  6AwrDcvd|j|jd}|j|}d||d|S)z5Return reference to the attribute definedness bitmap.( *))->)rrRr)rArrrcastrs rBattr_bitmap_exprzEmitter.attr_bitmap_exprjsE2>>$**-.c2  '4&S''rDc2|j|||||dy)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. FclearN_emit_attr_bitmap_update)rArprrrrs rBemit_attr_bitmap_setzEmitter.emit_attr_bitmap_setps %%eS%T%OrDc2|jd||||dy)z}Mark an attribute as undefined in the attribute bitmap. Unlike emit_attr_bitmap_set, clear unconditionally. rTr Nr )rArrrrs rBemit_attr_bitmap_clearzEmitter.emit_attr_bitmap_clearzs %%b#ub$d%KrDc\|r(|j||d}|jd|d|jj|}d|tdz zz} |j |||} |r|j| d| dn|j| d| d|r|jdyy) N== if (unlikely()) {rz &= ~rz |= r)error_value_checkr bitmap_attrsrrr) rArprrrrr checkrmaskrs rBr z Emitter._emit_attr_bitmap_updates **5%>E NN]5'7 8%%d+UkAo./&&sB6  NNfXU4&2 3 NNfXT$q1 2  NN3  rDF)unlikelycP|j|||}|rd|d}|jrj|jj|} d| tdz zz} |j | }d|j |jd|} |d| d|d| d}|jd |d y) Nz unlikely()rrrz && !((rz & if () {) r error_overlaprrrrrrRr) rAr attr_exprcomparerrrrrrbitobj_exprs rBemit_undefined_attr_checkz!Emitter.emit_undefined_attr_checks&&uiA wa(E   OO))$/Eq12C$$U+D2>>$**56c#?HgWXJc$s3%qAE eWD)*rDct|tr |j|||j|dS|d|d|j|S)NFcheck_exceptionr)r<rtuple_undefined_check_condr)rArrpr s rBrzEmitter.error_value_checksZ eV $22ud00'53 WAgYa(:(:5(A'BC CrDTr%c t|jdk(rdj|||tS|jrd}|jd}nAt |jD]"\}}|jr|j|}nJdt |tr|j||d|z||S|d|d|d||} |jr|r| dz } | S)Nrz {}.empty_struct_error_flag {} {}z¬ expecting tuple with error overlap.frz && PyErr_Occurred()) rrformatrr enumerater<rr') rArtuple_expr_in_cc_type_compare_valr r&r item_typerrs rBr'z"Emitter.tuple_undefined_check_conds  v||  !5<<*<^*L    A QI#FLL1 G3(( & QI G GFFu i (22?r!X57I7 ''r!AgYa8J98U7VWE##//LrDcDd|jd|j|S)z0Undefined tuple value suitable in an expression.rz) )rc_initializer_undefined_value)rArs rBrzEmitter.tuple_undefined_values(6%%&b)K)KF)S(TUUrDc t|tr^|jsdtjdSdj |jDcgc]}|j |c}}d|dS|j|Scc}w)zKUndefined value represented in a form suitable for variable initialization.z{ z }r)r<rrrrrr0r)rArtitemss rBr0z%Emitter.c_initializer_undefined_valuesy eV $;;^778<<IIekkZtAA!DZ[Es# #))%0 0[s BcT|j|jjvrt}|jD].}t |t s|j|j0t|j||d|jj|j<yy)NT)r7r8) rrurVr@rr<rrr6r)rA tuple_typer7rs rBdeclare_tuple_structzEmitter.declare_tuple_structs  ! !)B)B B5L!'' 6c6* $$S__5 6 AR((46=> v & )%++ 6 = 9!!TF"QC.)< =!!$$M04787$>? "rDis_xdecr7c|rdnd}t|r4|r|jd|d|dy |jd|d|dy t|tr8t |j D]\}}|j |d||||!y |js_|r|jd |d|dy |jsts|jd |d|dy |jd |d |dy y ) 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_zDecRef();zDECREF(r)r<CPy_zDECREF_NO_IMM(N) r#rr<rr+r emit_dec_refrr:r )rAr;rr=r7rrr.s rBrCzEmitter.emit_dec_refs C U #A3gdV2>?A3gdV2>? v & )%++ 6 Y 9!!TF"QC.)WSW!X Y!!aSvR89(( NNT!GD6#<=NNT!N4&#CD"rDcZt|}|d|j|zSt|S)Nz %s or None)r0 pretty_namer=)rAr value_types rBrEzEmitter.pretty_name&s1(-  !$"2"2:">> >3xrD) declare_desterrorraise_exceptionoptionalsrc_typelikelyc L |xs t}|rt|rt|st|} | Jt | |r|r|j d|dd} | rd| d} |j |||| j|||jd|d|dd |j||||||j d yt|sdt|sYt|sNt|sCt|s8t|s-t!|s"t#|st%|s t'|r|r|j d|dt|rd } nt|rd } nwt|rd } nit|rd} n[t|rd} nMt|rd} n?t!|rd} n1t#|s t'|rd} nt%|rd} n Jd|d} | rd| d} |j |||| j| |||jd|d|dd |j||||||j d yt)|r|r|j d|dd} | rd| d} |j |||| j||||jd|d|dd |j||||||j d yt+|r|r&|j |j-|d|dd} | rd| d} |j |||| j|||jd|d|dd |j||||||j d yt/|t0r3|r|j d|dt3|j4} | rt7| t8dzkDr,dj||j;|j4} ngd}t=dt7| D] }|d|zz } t7| dkDrd|z}|j|| Dcgc]}|j;|c}} | rd| d} |j |||| ||jd|d|dd |j||||||j d yt?|r|r|j d|dd} | rd| d} |j |||| j|||jd|d|dd |j||||||j d yt|s tA|rX|r|j d|d|j |||d ||j |d|d|r|j d yyt/|tBr|jE||||||||yt/|tFr|rJ|jI||||||yJd!|zcc}w)"auEmit 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 *rz({} != Py_None)z(likelyr  = else {rPyListPyDictPySet PyFrozenSet PyUnicodePyRangeCPyFloatPyLongPyBoolzunexpected primitive type: z({}_Check({}))z,(PyBytes_Check({}) || PyByteArray_Check({}))rz(PyTuple_Check({}))rz(PyObject_TypeCheck({}, {}))z (Py_TYPE({src}) == {targets[0]})z% || (Py_TYPE({src}) == {targets[%d]})z(%s))srctargetsz({} == Py_None)rzCast not implemented: %s)%r^r(r'r0r3remit_arg_checkr*remit_cast_error_handlerr$rr*rr,r)rr#rrrr-rr<rrclass_irrr rranger&r%remit_union_castremit_tuple_cast)rAr[r;rrGrHrIrJrKrLrFrrconcretefull_strrirs rB emit_castzEmitter.emit_cast,s1D( (2;OPS;T,X6J) ))J,NNZvQ#78)%eWA.E##CsELL4ExP$tfCuA 6A,,UCsOTs# s #!#& %&s+ %"3'"3' %(-#C(D634!#&!#C(!"3' (-&"3'$$S)"$S)#"3'+?+D!*3/!A ;C5AAu$E!%*   T3 VS0I8 T OOd4&C52H =  ( (T3 P NN3   %D634BE!%*   T3 S#0F Q OOd4&C52H =  ( (T3 P NN3   %$**S/!2!D6;<)E!%*   T3 S0A8 L OOd4&C52H =  ( (T3 P NN3  Y 'D634+CLL9H s8}/MPQ/QQ6==..s||<>q#h-0LA G! KKHLx=1$%0H (%SBd&;&;B&?%S(!%*   T3x @ OOd4&C52H =  ( (T3 P NN3   $D634%E!%*   T3 S0A8 L OOd4&C52H =  ( (T3 P NN3  !# &*>s*CD634   T3H = NNdV3se1- .s# V $  T3 eXx V $ <  dCuh O :4s: :5C&TsX! c|rt|trS|j|j|j|j |||j d|jzy|j d|j|d|dt|tr|j d|zyt|tr|j d|jzyt|trd|j d|z|j|j|j|j |j d|jzyt|tsJ||j d|jzy)N)rr[goto %s;CPy_TypeError("", ); z %s = NULL; return %s;)r<rgemit_type_error_tracebackrirjrkrrcrEr^r`emit_tracebackrnrp)rArHr[r;rrIs rBr^zEmitter.emit_cast_error_handlers> %!89..%%u'8'8%:O:OUX^a/zEKK78 NN_T-=-=c-B,C3se3O P e] + NN<$. / { + NN: 3 4 6 7 NN<$. /    1 153D3DeF[F[ \ NN: 3 4e]3 :U :3 NN<%++5 6rDc |r|jd|d|j} |ra|jd|d|j|d|j|d|jd| d|jd|jD]2} |j ||| dddd |jd|d | d4|j ||||||j | y ) zTEmit cast to a union type. The arguments are similar to emit_cast. rNrr == NULL) {rPgoto rF)rGrIrJrLz != NULL) goto N)rrrr3rfr^r) rAr[r;rrGrHrJrKrI good_labelitems rBrazEmitter.emit_union_casts  NNZvQ/ 0^^%  NNT#l3 4 NNdV3t'9'9#'>&?qA B NNU:,a0 1 NN3 II FD NN" %   NNT$zl!D E F $$UCsOL  #rDc |r|jd|d|j}|jdj|t |j |dd|ddt |j D];\}} |jd|d |d || d d d |jd |d|d=|j|d|d|j|y)zTEmit cast to a tuple type. The arguments are similar to emit_cast. rNrzJif (unlikely(!(PyTuple_Check({r}) && PyTuple_GET_SIZE({r}) == {size}))) {{)rsizez = NULL;rqrzPyTuple_GET_ITEM(rrF)rGrIrJrz == NULL) goto rPN) rrrr*rrr+rfr) rAr[r;rrGrHrK out_labelrrss rBrbzEmitter.emit_tuple_casts  NNZvQ/ 0NN$   X _ _C N ` fH I;a   !+ EGAt NN#C51#Q/" %   NNT$ykC D E $s3%q)*  "rDc|r;|jd|d|j|d|j|d|dk7r&|jdj|rdnd|y|r|jdyy) NrrprPrrz{}if {}z} else rQ)rrr*)rAr[r;rrrJs rBr]zEmitter.emit_arg_check=sw  NNT#l3 4 NNdV3t'9'9#'>&?qA B B; NN9++Ir5Q R  NN8 $rD)rGrHrIrJborrowc < |xs t}t|tr|d|j|d} nFt|trd|jz} n&t|t sJ|d|j z} |rd|j|d|d} | | z} t|s t|r|r|jd|d|j|||d |d ||r|jd |d |d n|jd |d|d |jd|j| |jdy)t|rp|r|jd|d|j|||d|d||j| |jd|d} |jd |d| dy)t|rh|r|jd|d|j|||d|d||j| |jd|jd |dy)t|rW|rJ|r|jd|d|j|d|d t|ts|j||| y)y)t!|rW|rJ|r|jd|d|j|d|d t|ts|j||| y)y)t#|rW|rJ|r|jd|d|j|d|d t|ts|j||| y)y)t%|rW|rJ|r|jd|d|j|d |d t|ts|j||| y)y)t'|rJ|rJ|r|jd!|d|j|d"|d |j)d#|d$| dy)t|t*r|j-||r&|j|j/|d%|d|rL|jd#|d&|j|d|j|d|jd'|j1} |j3|| |d(|d)*|jd+| d,|j| |jd'|j4s|j|d-t7|j4D]\} }|j1}|jd.|d/|d0| d |j1}|j8r|j;|||||d(|1n-|s|j=|t>|jA|||d(2|j|d3| d|d|jd|r|jdy)y)Jd4|z)5aEmit 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 rPrrhrlrirjrkz CPyTagged z(likely(PyLong_Check(z)))rOz = CPyTagged_BorrowFromObject(rAz = CPyTagged_FromObject(rQrzchar z(unlikely(!PyBool_Check(z))) {z} elsez == Py_Truez (unlikely(z != Py_None)) {z = 1;zint64_t z = CPyLong_AsInt64(zint32_t z = CPyLong_AsInt32(zint16_t z = CPyLong_AsInt16(zuint8_t z = CPyLong_AsUInt8(zdouble z = PyFloat_AsDouble(rz == -1.0 && PyErr_Occurred()) {rrp} else {TN)rGrHrKrz == NULL)) {z.empty_struct_error_flag = 0;rNz = PyTuple_GET_ITEM(r)rIrHrGryrGr)zUnboxing not implemented: %s)!r^r<rr`rcrnrprEr#r+rr]rr&r"/emit_unbox_failure_with_overlapping_error_valuer!r r.rrrr6rrrbrr+r emit_unboxr9r/rf)rAr[r;rrGrHrIrJryfailure raise_exc conversion cast_temprr.temptemp2s rBr~zEmitter.emit_unboxFs#<( e] +c$"4"4S"9!:! ?e]3DDT3PWX4  % <$q12 NNdV#6se2> ?e]3DDT3PWX4  % <$q12 NNdV#6se2> ?e]3DDT3PWX4  % <$q12 NNdV#6se2> ?e]3DDT3PWX4  % <a01 NNdV#7uB? @ OOd4&(HI7TW X V $  % %c *$**S/!2!D6;<cU,78$s4+=+=c+B*C1EFz*(I  Y$ed !  NN]9+]C D NN7 # NN: &99$'DEF )#)) 4 : 9~~'D61EcU"QCrRS(''OO!(7#%)%$"))$0ABNN4 NM$r!Cwa89) :* NN3 s# ?83> >5rDc *|rd}nd}t|s t|r|j||d|dyt|r3|j ||d|d|s|j |t yyt|r0|j ||d|s|j |t yyt|st|s t|r|j||d|dyt|r|j||d |dyt|r|j||d |dyt|tr&|j||j s|j||d y|j||d t#|j d|jd |d|jdt%t#|j D]~}|j&s|jd|d|d|d|-|j)}|j+|d|||j |d|jd|d|d|dy|j&rJ|j||d|dy)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). rNrz = CPyTagged_StealAsObject(rArPz ? Py_True : Py_False;z = Py_None;z = PyLong_FromLong(z = PyLong_FromLongLong(z = PyFloat_FromDouble(z% = CPyTuple_LoadEmptyTupleConstant();z = PyTuple_New(rz == NULL))z CPyError_OutOfMemory();zPyTuple_SET_ITEM(rr)Tr|rN)r#r+rrrr9r/r&r!r r.r"rr<rr6rrr`rremit_box) rAr[r;rrG can_borrow declarationr inner_names rBrzEmitter.emit_boxs &KK S !%!!$(9:  %)>):4&1#RuBqc'RS%)^^%5  RsmZ1\` a):4&1#R |SU'VW X~~ %% NNk]4&C5: ;rDct|trMt|jdk(ry|j |||j d}|j d|dn[|jr(|j d|d|j |dn'|j d|d|j |d|j|dy) zMEmit code for checking a native function return value for uncaught exception.rNrrr ==  && PyErr_Occurred()) {r) r<rrrr'rrrr)rArprrconds rBemit_error_checkzEmitter.emit_error_check#s eV $5;;1$66ueTEWEWY]^dV401   NNT%T-?-?-F,GG_` a NNT%T-?-?-F,GtL M %rDc|jsyt|trK|jdk(r<|j d|d|j d|d|j dyt|t r5t |jD]\}}|j|d||y|j|d k(r|j d |d yJd 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.intif (CPyTagged_CheckLong(rz Py_VISIT(CPyTagged_LongAsObject(z));rr)rNz Py_VISIT(rAz&emit_gc_visit() not implemented for %s) is_refcountedr<rrrrr+r emit_gc_visitrreprrAtargetrrr.s rBrzEmitter.emit_gc_visit3s ""  z *uzz^/K NN5fXUC D NN=fXSI J NN3  v & )%++ 6 @ 9""fXRs#3Y? @ ZZ , . NNYvhb1 2 PBT%[P P5rDcl|jsyt|tr|jdk(rs|j d|d|j d|d|j |d|j |d|j d|j d yt|t r5t|jD]\}}|j|d ||y|j|d k(r*|j |d k(r|j d |dyJdt|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'. NrrrCPyTagged __tmp = rrP*Py_XDECREF(CPyTagged_LongAsObject(__tmp));rr)rNrz Py_CLEAR(rAz&emit_gc_clear() not implemented for %s) rr<rrrrrr+r emit_gc_clearrrrs rBrzEmitter.emit_gc_clearIs ""  z *uzz^/K NN5fXUC D NN/xq9 : NNfXS)?)?)F(GqI J NNG H NN3  v & )%++ 6 @ 9""fXRs#3Y? @ ZZ , .43I3I%3PTZ3Z NNYvhb1 2 PBT%[P P5rDct|tr5t|jD]\}}|j |d||y |j s"|j |d|jdy t|tr|jdk(r|j d|d|j d|d|j |d|j|d|j d|j d |j |d|j|d|j d y |j||y ) aEmit attribute clear before object is added into freelist. Assume that 'target' represents a C expression that refers to a struct member, such as 'self->x'. Unlike emit_gc_clear(), initialize attribute value to match a freshly allocated object. r)rPrrrrrrr{rN) r<rr+remit_reuse_clearrrrrrrrrs rBrzEmitter.emit_reuse_clearas0 eV $ )%++ 6 C 9%%1#&6 B C$$ NNfXS):):(;1= > z *uzz^/K NN5fXUC D NN/xq9 : NNfXS)?)?)F(GqI J NNG H NN: & NNfXS)?)?)F(GqI J NN3    vu -rDc*|jd|||S)NCPy_AddTraceback)_emit_traceback)rArirjrks rBrnzEmitter.emit_tracebackzs##$6 [RabbrDc^d}d|j|d}|j||||||S)NCPy_TypeErrorTraceback")type_strr[)rEr)rArirjrkrr[funcrs rBrmz!Emitter.emit_type_error_tracebacksI(t'',-Q/## +{OhTW$  rDc|jd|}d||jdd|d|d|fz}|r|sJ|d|d|z }|dz }|j|tr|jd yy) Nglobalsz%s("%s", "%s", %d, %s\z\\rrrrAz7assert(PyErr_Occurred() != NULL && "failure w/o err!");)rrrr4) rArrirjrkrr[globals_staticrs rBrzEmitter._emit_tracebacks)))[A&    f - A  A   *   J3 b "SE* *D   t  NNT U rDc|jd|d|j|d|j||jdy)Nrrrr)rr)rAr;rrs rBr}z7Emitter.emit_unbox_failure_with_overlapping_error_valuesD dV4(:(:3(?'@@XYZ w srDrX)rurOryzdict[Value, str] | Nonerxztuple[int, int] | NonerFrG)rFrG)rcrrFr=)rrrFr=)rr=rFr=)robjectrr=rFr=)r)rr=rrrFrG)rr=rFrG)rczBasicBlock | strrFrG)rrrrFrG)rr=rr=rFrG)rFr=)rjr=rFr=)rzClassIR | FuncDeclrFr=)rr=rrYrr=rFr=)rrrFr=)rrrFr=)rrrFr=)rrrF list[str])rintrFr=)rr=rrrrrFr=) rpr=rr=rrrrrr=rFrG) rr=rrrrrr=rFrG)rpr=rr=rrrrrr=r rErFrG)rrrr=r r=rr=rr=rrrrErFrG)rrrpr=r r=rFr=) rrr,r=r-zCallable[[RType], str]r r=r&rErFr=)rrrFr=)r5rrFrG)r;r=rrr7rErFrG) r;r=rrr=rEr7rErFrG)rrrFr=)r[r=r;r=rrrGrErHErrorHandler | NonerIrErJrErK RType | NonerLrErFrG) rHr[r[r=r;r=rrrIrErFrG)r[r=r;r=rrrGrErHr[rJrErKrrIrErFrG)r[r=r;r=rrrGrErHr[rKrrFrG) r[r=r;r=rrrr=rJrErFrG)r[r=r;r=rrrGrErHrrIrErJrEryrErFrG)FF) r[r=r;r=rrrGrErrErFrG)rpr=rrrr=rFrG)rr=rrrFrG)rir=rjr=rkrlrFrG) rir=rjr=rkrlrrr[r=rFrG)rr)rr=rir=rjr=rkrlrr=r[r=rFrG)r;r=rrrr=rFrG):rIrJrKrLrCrrrcrrrrrrrrrrrrr rrrrrrrrrrrrr r#rr'rr0r6r9rCrErfr^rarbr]r~rrrrrrnrmrr}rMrDrBrrrrs_' 04/3  - -   !&2")(! .1* 544= FS;"M-8* ( PP"P+0P6=PEHP PL  " +0 6= EH QU  2+++ +  +  + ++ +,D!%   3      DV 1 EJ@2;@eEE %E37EGKE E>#%) $!%g; g;g; g;  g;#g;g;g;g;g; g;R7!7(+7367=B7UY7 70$$ $$$$ $$  $$  $$$$$$$$ $$L(# (#(# (#  (#  (#(# (#T%#%) $`? `?`? `?  `?#`?`?`?`? `?F_d9<9<!9<(-9<=A9rs$" "+   <%*>7' e))@ # #F>>*L*, /l /LHHV DIArD