Ë
    pPêj�  ã                  óè   — d 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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 ddlmZmZmZ ddlmZ ddl m!Z! dd„Z"dd	„Z#	 	 	 	 	 	 	 	 	 	 dd
„Z$dd„Z%dd„Z&dd„Z'y)aƒ  Transform 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_MAGICÚERR_MAGIC_OVERLAPPINGÚ	ERR_NEVERÚNO_TRACEBACK_LINE_NOÚ
BasicBlockÚBranchÚCallCÚComparisonOpÚFloatÚGetAttrÚIntegerÚLoadErrorValueÚOpÚ
RegisterOpÚReturnÚSetAttrÚTupleGetÚValue)ÚRTupleÚbool_rprimitiveÚis_float_rprimitive)Úerr_occurred_op)ÚCFunctionDescriptionc                óê   — d }| j                   D ]8  }t        |«       |�Œt        d„ |j                  D «       «      sŒ.t	        | «      }Œ: |r(t        | j                   || j                  |«      | _         y y )Nc              3  ó<   K  — | ]  }|j                  «       –— Œ y ­w©N)Ú	can_raise)Ú.0Úops     ú_/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/mypyc/transform/exceptions.pyú	<genexpr>z,insert_exception_handling.<locals>.<genexpr>1   s   è ø€ Ò&J¸" r§|¡|§~Ñ&Jùs   ‚)ÚblocksÚadjust_error_kindsÚanyÚopsÚadd_default_handler_blockÚsplit_blocks_at_errorsÚtraceback_name)ÚirÚstrict_traceback_checksÚerror_labelÚblocks       r$   Úinsert_exception_handlingr1   *   so   € ð &*€KØ—‘ò 8ˆÜ˜5Ô!ØÑ¤3Ñ&JÀÇ	Á	Ô&JÕ#JÜ3°BÓ7‰Kð8ñ Ü*Ø�I‰I�{ B×$5Ñ$5Ð7Nó
ˆ�	ð ó    c                óø   — t        «       }| j                  j                  |«       t        | j                  «      }|j
                  j                  |«       |j
                  j                  t        |«      «       |S r    )r   r&   Úappendr   Úret_typer)   r   )r-   r0   r#   s      r$   r*   r*   9   sV   € Ü‹L€EØ‡I�I×Ñ�UÔÜ	˜Ÿ™Ó	$€BØ	‡I�I×Ñ�RÔØ	‡I�I×Ñ”V˜B“ZÔ Ø€Lr2   c           	     óp  — g }| D �]­  }|j                   }g |_         |}|j                  |«       |j                  xs |}d |_        |D �]g  }	|	}
|j                   j                  |	«       t        |	t        «      sŒ2|	j
                  t        k7  sŒFt        «       }|j                  |«       |	j
                  t        k(  rt        j                  }d}�n9|	j
                  t        k(  rt        j                  }d}�n|	j
                  t        k(  r#t        j                  }d}t        dt        «      }
nÜ|	j
                  t         k(  rµt#        |j                   |
«      }t        «       }|j                  |«       t        |||t        j                  d¬«      }|j                   j                  |«       |}t%        t&        g |
j(                  «      }
|j                   j                  |
«       t        j                  }d}nJ d|	j
                  z  «       ‚|	j
                  t        k7  r|	j*                  rJ d«       ‚t        |
||||	j(                  ¬«      }||_        |	j(                  t.        k7  r0|�.|r|	j(                  dk\  s
J d|	› �«       ‚||	j(                  f|_        |j                   j                  |«       |}�Œj �Œ° |S )	NFTr   )Ú
true_labelÚfalse_labelr#   Úrarezunknown error kind %dzvoid op generating errors?)r7   r8   r#   Úlinez@Cannot add a traceback entry with a negative line number for op )r)   r4   Úerror_handlerÚ
isinstancer   Ú
error_kindr	   r   r   r   ÚIS_ERRORr   ÚBOOLr   r   r   r   Ú$insert_overlapping_error_value_checkÚprimitive_callr   r:   Úis_voidÚnegatedr
   Útraceback_entry)r&   Údefault_error_handlerÚ	func_namer.   Ú
new_blocksr0   r)   Ú	cur_blockr/   r#   ÚtargetÚ	new_blockÚvariantrC   ÚcompÚ
new_block2Úbranchs                    r$   r+   r+   B   sf  € ð $&€Jð ó E&ˆØ�i‰iˆØˆŒ	Øˆ	Ø×Ñ˜)Ô$ð ×)Ñ)ÒBÐ-BˆØ"ˆÔàó :	&ˆBØˆFØ�M‰M× Ñ  Ô$Ü˜"œjÕ)¨b¯m©m¼yÓ.Hä&›L�	Ø×!Ñ! )Ô,à—=‘=¤IÒ-ä$Ÿo™o�GØ#’GØ—]‘]¤iÒ/ä$Ÿk™k�GØ"’GØ—]‘]¤jÒ0Ü$Ÿk™k�GØ"�Gô % Q¬Ó8‘FØ—]‘]Ô&;Ò;Ü?À	ÇÁÈvÓV�DÜ!+£�JØ×%Ñ% jÔ1Ü#ØØ#-Ø$-Ü!Ÿ;™;Ø!ô�Fð —M‘M×(Ñ(¨Ô0Ø *�IÜ+¬O¸RÀÇÁÓM�FØ—M‘M×(Ñ(¨Ô0Ü$Ÿo™o�GØ"‘GàIÐ"9¸B¿M¹MÑ"IÓI˜5ð —=‘=¤JÒ.Ø!ŸzšzÐGÐ+GÓG˜>äØ {À	ÈgÐ\^×\cÑ\cô�ð ")�”Ø—7‘7Ô2Ò2°yÐ7LÙ.àŸG™G qšLðcà]Ð^`Ð]aÐbócØ(à.7¸¿¹Ð-A�FÔ*Ø—‘×$Ñ$ VÔ,Ø%’	òu:	&ðE&ðN Ðr2   c           
     ó    — t        | j                  g | j                  | j                  | j                  | j
                  || j                  ¬«      S )N)Údependencies)r   Úc_function_nameÚreturn_typeÚstealsÚis_borrowedr=   rP   )ÚdescÚargsr:   s      r$   rA   rA   •   sG   € ÜØ×ÑØ
Ø×ÑØ�‰Ø×ÑØ�‰ØØ×&Ñ&ô	ð 	r2   c                óR  — | j                   D ]˜  }t        |t        «      r:|j                  j                  j                  |j                  «      rt        |_        t        |t        «      sŒ^|j                  j                  j                  |j                  «      sŒŽt        |_        Œš y)z Infer 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_typeÚclass_irÚis_always_definedÚattrr	   r=   r   )r0   r#   s     r$   r'   r'   ¢   sq   € ð �i‰iò *ˆÜ�bœ'Ô"Ø�}‰}×%Ñ%×7Ñ7¸¿¹Ô@Ü )�”Ü�bœ'Õ"Ø�}‰}×%Ñ%×7Ñ7¸¿¹Õ@Ü )�•ñ*r2   c                ó�  — |j                   }t        |t        «      r)t        |d«      }| j	                  |«       t        | |«      S t        |j                   «      rt        t        |j                  «      «      }n t        t        |j                  «      |¬«      }t        ||t        j                  «      }| j	                  |«       |S )z6Append to ops to check for an overlapping error value.r   )Úrtype)Útyper<   r   r   r4   r@   r   r   ÚfloatÚc_undefinedr   Úintr   ÚEQ)r)   rI   ÚtypÚitemÚerrvaluer#   s         r$   r@   r@   ±   s’   € à
�+‰+€CÜ�#”vÔÜ˜ Ó"ˆØ�
‰
�4ÔÜ3°C¸Ó>Ð>ô ˜vŸ{™{Ô+ÜœU 3§?¡?Ó3Ó4‰Häœs 3§?¡?Ó3¸3Ô?ˆHÜ˜& (¬L¯O©OÓ<ˆØ�
‰
�2ŒØˆ	r2   N)r-   r   r.   ÚboolÚreturnÚNone)r-   r   rg   r   )
r&   úlist[BasicBlock]rE   r   rF   z
str | Noner.   rf   rg   ri   )rU   r   rV   zlist[Value]r:   ra   rg   r   )r0   r   rg   rh   )r)   zlist[Op]rI   r   rg   r   )(Ú__doc__Ú
__future__r   Úmypyc.ir.func_irr   Úmypyc.ir.opsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úmypyc.ir.rtypesr   r   r   Úmypyc.primitives.exc_opsr   Úmypyc.primitives.registryr   r1   r*   r+   rA   r'   r@   © r2   r$   ú<module>rr      s’   ðñ	õ #å #÷÷ ÷ ÷ ÷ ó ÷, IÑ HÝ 4Ý :ó
óðPØðPà%ðPð ðPð "ð	Pð
 óPóf
ó*ôr2   