Ë
    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 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 e e ee!f   df   Z"e edf   Z#e$e ee"e#f   ef   Z%dd„Z&dd	„Z'	 	 	 	 	 	 	 	 	 	 dd
„Z(dd„Z)	 	 	 	 	 	 	 	 	 	 	 	 dd„Z*	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Z+	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Z,	 	 	 	 	 	 	 	 	 	 	 	 dd„Z-	 	 	 	 	 	 	 	 	 	 	 	 dd„Z.dd„Z/y)aX  Transformation for inserting reference count inc/dec opcodes.

This transformation happens towards the end of compilation. Before this
transformation, reference count management is not explicitly handled at all.
By postponing this pass, the previous passes are simpler as they don't have
to update reference count opcodes.

The approach is to decrement reference counts soon after a value is no
longer live, to quickly free memory (and call __del__ methods), though
there are no strict guarantees -- other than that local variables are
freed before return from a function.

Function arguments are a little special. They are initially considered
'borrowed' from the caller and their reference counts don't need to be
decremented before returning. An assignment to a borrowed value turns it
into a regular, owned reference that needs to freed before return.
é    )Úannotations)ÚIterable)ÚAnalysisDictÚanalyze_borrowed_argumentsÚanalyze_live_regsÚanalyze_must_defined_regsÚcleanup_cfgÚget_cfg)ÚFuncIRÚ
all_values)ÚAssignÚ
BasicBlockÚBranchÚCallCÚ	ControlOpÚDecRefÚGotoÚIncRefÚIntegerÚ	KeepAliveÚLoadAddressÚOpÚRegisterÚ
RegisterOpÚUndefÚValue.c                ó&  — t        | j                  «      }t        | j                  | j                  «      }|D �ch c]  }|j                  sŒ|’Œ }}t        | j                  «      }t        | j                  |«      }t        | j                  ||«      }t        | j                  |||d¬«      }t        | «      }	i }
| j                  j                  «       D ]   }t        |j                  d   t        t        f«      rDt        ||
| j                  |j                   |j                   |j"                  |j"                  |	«       t%        ||j                   |j"                  |j                   |j"                  «       Œ¢ t'        | j                  «       yc c}w )zgInsert reference count inc/dec opcodes to a function.

    This is the entry point to this module.
    T)Ústrict_errorséÿÿÿÿN)r
   Úblocksr   Úarg_regsÚis_borrowedÚsetr   r   r   Úmake_value_orderingÚcopyÚ
isinstanceÚopsr   r   Úinsert_branch_inc_and_decrefsÚbeforeÚafterÚtransform_blockr	   )ÚirÚcfgÚvaluesÚvalueÚborrowedÚargsÚliveÚborrowÚdefinedÚorderingÚcacheÚblocks               ú]/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/mypyc/transform/refcount.pyÚinsert_ref_count_opcodesr9   <   s3  € ô
 �"—)‘)Ó
€CÜ˜Ÿ™ R§Y¡YÓ/€Fà#)Ö?˜%¨U×->Ó->’Ð?€HÐ?Ü˜2Ÿ;™;Ó'€DÜ˜RŸY™Y¨Ó,€DÜ'¨¯	©	°3¸ÓA€FÜ'¨¯	©	°3¸¸fÐTXÔY€GÜ" 2Ó&€HØ€EØ—‘—‘Ó!ò VˆÜ�e—i‘i ‘m¤f¬d ^Ô4Ü)ØØØ—	‘	Ø—‘Ø—‘Ø—‘Ø—‘Øô	ô 	˜˜tŸ{™{¨D¯J©J¸¿¹ÀwÇ}Á}ÕUðVô �—	‘	Õùò+ @s   ºFÁFc                ón   — t        |t        «      xr || vxs t        |t        «      xr |j                  S ©N)r&   r   r   Úreturns_null)Úpost_must_definedÚsrcs     r8   Úis_maybe_undefinedr?   \   s6   € Ü�sœHÓ%ÒF¨#Ð5FÐ*Fò Ü�3œÓÒ3 3×#3Ñ#3ðó    c           	     ó²   — |j                   j                  rAt        |t        t        f«      s*| j                  t        |t        ||   |«      ¬«      «       y y y )N©Úis_xdec)ÚtypeÚis_refcountedr&   r   r   Úappendr   r?   )r'   Údestr4   Úkeys       r8   Úmaybe_append_dec_refrI   b   sG   € ð ‡y�y×Ò¤z°$¼Ä%Ð8HÔ'IØ�
‰
”6˜$Ô(:¸7À3¹<ÈÓ(NÔOÕPð (JÐr@   c                óf   — |j                   j                  r| j                  t        |«      «       y y r;   )rD   rE   rF   r   )r'   rG   s     r8   Úmaybe_append_inc_refrK   i   s$   € Ø‡y�y×ÒØ�
‰
”6˜$“<Õ ð r@   c                óü  — | j                   }g }t        |«      D �]X  \  }}| |f}	|||	   vsJ ‚t        |t        «      r|j                  n|}
|j                  «       }t        |«      D ]\  \  }}|||	   v s|||	   v s||d | v sŒt        ||«       |
||	   vsŒ0|
||	   v sŒ8t        |t        «      sJ |«       ‚t        ||
||	«       Œ^ t        |t        «      s|j                  |«       t        |t        «      rŒÞ|j                  «       D ]%  }|||	   vsŒ|||	   vsŒ||vsŒt        ||||	«       Œ' |
j                  r�Œ$|
||	   vs�Œ-t        |t        «      r|
j                  r�ŒKt        ||
||	«       �Œ[ || _         y r;   )r'   Ú	enumerater&   r   rG   ÚstolenrK   rI   r   rF   r   Úunique_sourcesÚis_voidr   r"   )r7   Úpre_liveÚ	post_liveÚ
pre_borrowr=   Úold_opsr'   ÚiÚoprH   rG   rN   Újr>   s                 r8   r+   r+   n   sž  € ð �i‰i€GØ€CÜ˜7Ó#ó &D‰ˆˆ2Ø�aˆjˆà˜ #™Ñ&Ð&Ð&Ü$ R¬Ô0ˆr�wŠw°bˆØ—‘“ˆô   Ó'ò 	L‰FˆAˆsØ�i ‘nÑ$¨¨z¸#©Ñ(>À#ÈÐPRÐQRÈÒBSÜ$ S¨#Ô.ð ˜z¨#™Ò.°4¸8ÀC¹=Ò3HÜ% b¬&Ô1Ð5°2Ó5Ð1Ü(¨¨dÐ4EÀsÕKð	Lô ˜"œiÔ(Ø�J‰J�rŒNô �bœ)Ô$Øà×$Ñ$Ó&ò 	GˆCà˜) C™.Ò(¨S¸
À3¹Ò-GÈCÐW]ÒL]Ü$ S¨#Ð/@À#ÕFð	Gð —”Ø˜I c™NÓ*Ü ¤JÔ/°D×4DÔ4Dä   dÐ,=¸sÖCðM&DðN €E…Ir@   c                ó²  — | t        | j                  «      dz
  f}||   }	||   }
||   }| j                  }t        |j	                  «       «      D ]†  \  }}t        |t        «      r0|j                  t        j                  k(  r|dk(  r|j                  f}nd}t        ||||
|	||«      }t        ||||
|«      }|j                  |t        |||||«      «       Œˆ y)aN  Insert inc_refs and/or dec_refs after a branch/goto.

    Add dec_refs for registers that become dead after a branch.
    Add inc_refs for registers that become unborrowed after a branch or goto.

    Branches are special as the true and false targets may have a different
    live and borrowed register sets. Add new blocks before the true/false target
    blocks that tweak reference counts.

    Example where we need to add an inc_ref:

      def f(a: int) -> None
          if a:
              a = 1
          return a  # a is borrowed if condition is false and unborrowed if true
    é   r   © N)Úlenr'   Ú
terminatorrM   Útargetsr&   r   rV   ÚIS_ERRORr/   Úafter_branch_decrefsÚafter_branch_increfsÚ
set_targetÚ	add_block)r7   r6   r    rQ   rS   Úpost_borrowr=   r5   Úprev_keyÚsource_live_regsÚsource_borrowedÚsource_definedÚtermrU   ÚtargetÚomittedÚdecsÚincss                     r8   r(   r(   ¡   sâ   € ð4 ”s˜5Ÿ9™9“~¨Ñ)Ð*€HØ Ñ)ÐØ! (Ñ+€OØ& xÑ0€Nà×Ñ€DÜ˜tŸ|™|›~Ó.ò I‰	ˆˆ6ô �dœFÔ#¨¯©´6·?±?Ò(BÀqÈAÂvØ—z‘z�m‰GàˆGä#Ø�H˜n¨oÐ?OÐQYÐ[bó
ˆô $ F¨H°jÀ/ÐS[Ó\ˆØ�‰˜œ9 T¨4°¸ÀÓGÕHñIr@   c                ór   ‡‡‡— || df   }||z
  |z
  }|r#t        ˆˆfd„t        |ˆfd„¬«      D «       «      S y)Nr   c              3  ón   •K  — | ],  }|j                   j                  r|‰vr|t        ‰|«      f–— Œ. y ­wr;   )rD   rE   r?   )Ú.0Úregrj   rg   s     €€r8   ú	<genexpr>z'after_branch_decrefs.<locals>.<genexpr>ß   s:   øè ø€ ò 
àØ�x‰x×%Ò%¨#°WÑ*<ð Ô$ ^°SÓ9Ô:ñ
ùs   ƒ25c                ó   •— ‰|    S r;   rZ   ©Úrr5   s    €r8   ú<lambda>z&after_branch_decrefs.<locals>.<lambda>á   s   ø€ °H¸Q±K€ r@   ©rH   rZ   ©ÚtupleÚsorted)	ÚlabelrQ   rg   rf   re   r5   rj   Útarget_pre_liveÚdecrefs	     `  ``  r8   r_   r_   Ó   sL   ú€ ð ˜u a˜xÑ(€OØ Ñ/°/ÑA€FÙÜô 
ä˜fÓ*?Ô@ô
ó 
ð 	
ð
 r@   c                óv   ‡— || df   }|| df   }||z
  |z  }|r t        d„ t        |ˆfd„¬«      D «       «      S y)Nr   c              3  óN   K  — | ]  }|j                   j                  sŒ|–— Œ y ­wr;   )rD   rE   ©ro   rp   s     r8   rq   z'after_branch_increfs.<locals>.<genexpr>ò   s!   è ø€ ò 
ØÈÏÉ×H^ÓH^ŒCñ
ùs   ‚%ž%c                ó   •— ‰|    S r;   rZ   rs   s    €r8   ru   z&after_branch_increfs.<locals>.<lambda>ó   s   ø€ ¸À¹€ r@   rv   rZ   rw   )rz   rQ   rS   rf   r5   r{   Útarget_borrowedÚincrefs       `   r8   r`   r`   ç   sZ   ø€ ð ˜u a˜xÑ(€OØ  ¨ Ñ*€OØ Ñ/°?ÑB€FÙÜñ 
Ü! &Ó.CÔDô
ó 
ð 	
ð r@   c                óF  — | s|s|S || |f|v r||| |f   S t        «       }|j                  |«       |j                  j                  d„ | D «       «       |j                  j                  d„ |D «       «       |j                  j                  t	        |«      «       |||| |f<   |S )Nc              3  ó<   K  — | ]  \  }}t        ||¬ «      –— Œ y­w)rB   N)r   )ro   rp   Úxdecs      r8   rq   zadd_block.<locals>.<genexpr>  s   è ø€ ÒE±9°3¸”V˜C¨×.Ð.ÑEùs   ‚c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr;   )r   r   s     r8   rq   zadd_block.<locals>.<genexpr>  s   è ø€ Ò1 S”V˜C—[Ñ1ùs   ‚)r   rF   r'   Úextendr   )rk   rl   r6   r    rz   r7   s         r8   rb   rb   ø   s    € ñ ™Øˆð 	ˆt�TÐ˜eÑ#Ø�U˜D $Ð&Ñ'Ð'ä‹L€EØ
‡M�M�%ÔØ	‡I�I×ÑÑEÀÔEÔEØ	‡I�I×ÑÑ1¨DÔ1Ô1Ø	‡I�I×Ñ”T˜%“[Ô!Ø$€Eˆ%��tÐ
ÑØ€Lr@   c                ó¦  — i }d}| j                   D ]  }|||<   |dz  }Œ | j                  D ]¢  }|j                  D ]‘  }t        |t        «      r<t        |j
                  t        «      r"|j
                  |vr|||j
                  <   |dz  }t        |t        «      r$|j                  |vsŒn|||j                  <   |dz  }Œƒ||vsŒˆ|||<   |dz  }Œ“ Œ¤ |S )zrCreate a ordering of values that allows them to be sorted.

    This omits registers that are only ever read.
    r   rY   )	r!   r    r'   r&   r   r>   r   r   rG   )r,   ÚresultÚnÚargr7   rV   s         r8   r$   r$     sä   € ð  "€FØ	€Aà�{‰{ò ˆØˆˆs‰Ø	ˆQ‰‰ðð —‘ò ˆØ—)‘)ò 	ˆBä˜2œ{Ô+Ü˜rŸv™v¤xÔ0Ø—F‘F &Ñ(ð "#��r—v‘v‘Ø�Q‘�Ü˜"œfÔ%Ø—7‘7 &Ò(Ø&'�F˜2Ÿ7™7‘OØ˜‘F‘AØ˜6Ò!Ø��r‘
Ø�Q‘‘ñ	ðð$ €Mr@   N)r,   r   ÚreturnÚNone)r=   ú
set[Value]r>   r   rŒ   Úbool)
r'   úlist[Op]rG   r   r4   úAnalysisDict[Value]rH   ztuple[BasicBlock, int]rŒ   r�   )r'   r�   rG   r   rŒ   r�   )r7   r   rQ   r‘   rR   r‘   rS   r‘   r=   r‘   rŒ   r�   )r7   r   r6   Ú
BlockCacher    úlist[BasicBlock]rQ   r‘   rS   r‘   rc   r‘   r=   r‘   r5   údict[Value, int]rŒ   r�   )rz   r   rQ   r‘   rg   rŽ   rf   rŽ   re   rŽ   r5   r”   rj   zIterable[Value]rŒ   ztuple[tuple[Value, bool], ...])rz   r   rQ   r‘   rS   r‘   rf   rŽ   r5   r”   rŒ   ztuple[Value, ...])rk   ÚDecsrl   ÚIncsr6   r’   r    r“   rz   r   rŒ   r   )r,   r   rŒ   r”   )0Ú__doc__Ú
__future__r   Úcollections.abcr   Úmypyc.analysis.dataflowr   r   r   r   r	   r
   Úmypyc.ir.func_irr   r   Úmypyc.ir.opsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rx   r�   r•   r–   Údictr’   r9   r?   rI   rK   r+   r(   r_   r`   rb   r$   rZ   r@   r8   ú<module>rž      s.  ðñõ$ #å $÷÷ ÷ 0÷÷ ÷ ÷ ó ð& ˆU�5˜$�;Ñ Ð$Ñ%€ØˆU�CˆZÑ€ð
 �%˜
 D¨$Ð.Ñ/°Ð;Ñ<€
óó@ðQØ	ðQØðQØ)<ðQØCYðQà	óQó!ð
0Øð0à!ð0ð #ð0ð $ð	0ð
 +ð0ð 
ó0ðf/IØð/Iàð/Ið ð/Ið "ð	/Ið
 $ð/Ið %ð/Ið +ð/Ið ð/Ið 
ó/IðdØðà!ðð ðð  ð	ð
 !ðð ðð ðð $óð(Øðà!ðð $ðð  ð	ð
 ðð óð"Ø
ðØðØ#-ðØ7GðØPZðàóô&r@   