NL idZddlmZddlmZddlmZmZmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZddlmZmZmZddlmZddl m!Z!ddZ"dd Z# dd Z$dd Z%dd Z&dd Z'y)aTransform that inserts error checks after opcodes. When initially building the IR, the code doesn't perform error checks for exceptions. This module is used to insert all required error checks afterwards. Each Op describes how it indicates an error condition (if at all). We need to split basic blocks on each error check since branches can only be placed at the end of a basic block. ) annotations)FuncIR) ERR_ALWAYS ERR_FALSE ERR_MAGICERR_MAGIC_OVERLAPPING ERR_NEVERNO_TRACEBACK_LINE_NO BasicBlockBranchCallC ComparisonOpFloatGetAttrIntegerLoadErrorValueOp RegisterOpReturnSetAttrTupleGetValue)RTuplebool_rprimitiveis_float_rprimitive)err_occurred_op)CFunctionDescriptioncd}|jD]8}t||td|jDs.t |}:|r't |j||j |_yy)Nc3<K|]}|jywN) can_raise).0ops `/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/mypyc/transform/exceptions.py z,insert_exception_handling..1s&J"r||~&Js)blocksadjust_error_kindsanyopsadd_default_handler_blocksplit_blocks_at_errorstraceback_name)ir error_labelblocks r$insert_exception_handlingr0*si&*K85!  3&J &J#J3B7K8*299k2CTCTU ct}|jj|t|j}|j j||j jt ||Sr )r r&appendrret_typer)r)r-r/r#s r$r*r*7sV LEIIU  $B IIR IIVBZ Lr1c :g}|D]}|j}g|_|}|j||jxs|}d|_|D]L}|} |jj|t|ts2|j t k7sFt} |j| |j tk(rtj} d} n9|j tk(rtj} d} n|j tk(r#tj} d} tdt} n|j t k(rt#|j| } t}|j|t| || tjd}|jj||}t%t&g| j(} |jj| tj} d} nJd|j z|j tk7r|j*rJdt| || | |j(}| |_|j(t.k7r|||j(f|_|jj|| }O|S)NFTr) true_label false_labelr#rarezunknown error kind %dzvoid op generating errors?)r6r7r#line)r)r3 error_handler isinstancer error_kindr r rr IS_ERRORrBOOLrrrr$insert_overlapping_error_value_checkprimitive_callrr9is_voidnegatedr traceback_entry)r&default_error_handler func_name new_blocksr/r) cur_blockr.r#target new_blockvariantrBcomp new_block2branchs r$r+r+@s=$&JA&ii  )$))B-B "6 &BF MM  $"j)bmmy.H&L !!),==I-$ooG#G]]i/$kkG"G]]j0$kkG"G%Q8F]]&;;? vVD!+J%%j1##-$-!;;! FMM((0 *I+ORMFMM((0$ooG"GI"9BMM"II5==J.!zzG+GG>{ g\^\c\c")7722y7L.7-AF* $$V,% m6 &A&F r1c t|jg|j|j|j|j |Sr )r c_function_name return_typesteals is_borrowedr<)descargsr9s r$r@r@s>         r1cR|jD]}t|tr:|jjj |j r t|_t|ts^|jjj |j st|_y)zInfer more precise error_kind attributes for ops. We have access here to more information than what was available when the IR was initially built. N) r)r;r class_typeclass_iris_always_definedattrr r<r)r/r#s r$r'r'sq ii* b' "}}%%77@ ) b' "}}%%77@ ) *r1c|j}t|tr)t|d}|j |t ||St |jrtt|j}n tt|j|}t||tj}|j ||S)z6Append to ops to check for an overlapping error value.r)rtype)typer;rrr3r?rrfloat c_undefinedrintrEQ)r)rHtypitemerrvaluer#s r$r?r?s ++C#v" 43C>> v{{ +U3??34Hs3??33?H &(LOO < 2 r1N)r-rreturnNone)r-rrdr )r&list[BasicBlock]rDr rEz str | Nonerdrf)rSrrTz list[Value]r9r_rdr )r/r rdre)r)zlist[Op]rHrrdr)(__doc__ __future__rmypyc.ir.func_irr mypyc.ir.opsrrrrr r r r r rrrrrrrrrrrmypyc.ir.rtypesrrrmypyc.primitives.exc_opsrmypyc.primitives.registryrr0r*r+r@r'r?r1r$ros ##,IH4: VI I5?ILVIIX  *r1