Ë
    L²jå#  ã                   ó¶  — d Z ddlZddlZddlZddlZddlZddlmZmZ erddl	m
Z
 ej                  d   ej                  d   ej                  d   hZej                  ej                  d	   «       ej                  d
k\  r=ej                  ej                  d   «       ej                  ej                  d   «       nej                  ej                  d   «       dej                  cxk  rdk  r!n nej                  ej                  d   «       ej                  dk\  rej                  ej                  d   «        eej                   ej"                  z   «      ZeD � ch c]  } ej&                  |    ’Œ c} Z eej*                  «      Z eej.                  «      Zej2                  Zded   dedef   fd„Zded   ded   fd„Zded   ded   fd„Zded   ddfd„Z ded   ddfd„Z!ejD                   G d„ d«      «       Z#ded   dddee   fd„Z$ejD                   G d„ d «      «       Z%ejD                   G d!„ d"«      «       Z&ded   dee'z  fd#„Z(yc c} w )$a¹  
This module provides utilities for analyzing and optimizing Python bytecode.
Key functionality includes:
- Dead code elimination
- Jump instruction optimization
- Stack size analysis and verification
- Live variable analysis
- Line number propagation and cleanup
- Exception table handling for Python 3.11+

The utilities in this module are used to analyze and transform bytecode
for better performance while maintaining correct semantics.
é    N)ÚAnyÚTYPE_CHECKINGé   )ÚInstructionÚRETURN_VALUEÚJUMP_FORWARDÚRAISE_VARARGSÚRERAISE©é   é   ÚJUMP_BACKWARDÚJUMP_ABSOLUTE)r   é   )r   é   ÚRETURN_CONST)r   é   ÚJUMP_BACKWARD_NO_INTERRUPTÚinstsr   Úreturnc                 óF   — i }t        | «      D ]  \  }}||vsJ ‚|||<   Œ |S )z¢
    Get a mapping from instruction memory address to index in instruction list.
    Additionally checks that each instruction only appears once in the list.
    )Ú	enumerate)r   ÚindexofÚiÚinsts       ú^/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/_dynamo/bytecode_analysis.pyÚget_indexofr   5   s?   € ð €GÜ˜UÓ#ò ‰ˆˆ4Ø˜7Ñ"Ð"Ð"Øˆ�Šðð €Nó    Úinstructionsc                 ó®  ‡ ‡‡‡— t        ‰ «      Št        «       Šdt        ddfˆˆˆ ˆfd„Š ‰d«       t        j                  dk\  rèt        ‰«      }t        ‰ «      D ]Ï  \  }}|‰v sŒ|j                  sŒt        j                  |‰|j                  j                     «      }|t        |«      k  sJ ‚t        j                  |‰|j                  j                     «      dz
  }|dk\  sJ ‚||   |cxk  r	||   k  sJ ‚ J ‚‰ ||      |j                  _
        ‰ ||      |j                  _        ŒÑ t        ‰ «      D ��cg c]  \  }}|‰v sŒ|‘Œ c}}S c c}}w )zDead code eliminationÚstartr   Nc                 óZ  •— t        | t        ‰«      «      D ]’  }|‰v r y ‰j                  |«       ‰|   }|j                  r ‰‰|j                  j                     «       |j
                  t        v r#|j                  €J ‚ ‰‰|j                     «       |j
                  t        v sŒ’ y  y ©N)ÚrangeÚlenÚaddÚexn_tab_entryÚtargetÚopcodeÚJUMP_OPCODESÚTERMINAL_OPCODES)r!   r   r   Úfind_live_coder   r   Ú	live_codes      €€€€r   r,   z(remove_dead_code.<locals>.find_live_codeG   sœ   ø€ Ü�uœc ,Ó/Ó0ò 	ˆAØ�I‰~ÙØ�M‰M˜!ÔØ ‘?ˆDØ×!Ò!Ù˜w t×'9Ñ'9×'@Ñ'@ÑAÔBØ�{‰{œlÑ*Ø—{‘{Ð.Ð.Ð.Ù˜w t§{¡{Ñ3Ô4Ø�{‰{Ô.Ò.Ùñ	r   r   r   r   )r   ÚsetÚintÚsysÚversion_infoÚsortedr   r'   ÚbisectÚbisect_leftr!   r%   Úbisect_rightÚend)	r   Úlive_idxr   r   Ú	start_idxÚend_idxr,   r   r-   s	   `     @@@r   Úremove_dead_coder:   B   sg  û€ ä˜,Ó'€GÜ“€Iðœcð  d÷ ð ñ �1Ôô ×Ñ˜7Ò"Ü˜)Ó$ˆÜ  Ó.ò 	I‰GˆAˆtØ�IŠ~ $×"4Ó"4ä"×.Ñ.Ø˜g d×&8Ñ&8×&>Ñ&>Ñ?ó�	ð !¤3 x£=Ò0Ð0Ð0ô ×'Ñ'¨°'¸$×:LÑ:L×:PÑ:PÑ2QÓRÐUVÑVð ð  !’|Ð#�|Ø 	Ñ*¨aÔD°8¸GÑ3DÒDÐDÑDÐDÐDØ+7¸ÀÑ8KÑ+L�×"Ñ"Ô(Ø)5°h¸wÑ6GÑ)H�×"Ñ"Õ&ð	Iô  !*¨,Ó 7×J‘W�Q˜¸1À	º>ŠDÓJÐJùÓJs   Ä<EÅ	Ec                 óî   — t        j                  | «      D ��ch c]-  \  }}|j                  dk(  r|j                  |u rt	        |«      ’Œ/ }}}| D �cg c]  }t	        |«      |vsŒ|‘Œ c}S c c}}w c c}w )z'Eliminate jumps to the next instructionr   )Ú	itertoolsÚpairwiseÚopnamer(   Úid)r   ÚaÚbÚpointless_jumpsr   s        r   Úremove_pointless_jumpsrC   p   ss   € ô ×&Ñ& |Ó4÷áˆAˆqØ�8‰8�Ò&¨1¯8©8°q©=ô 	ˆ1�ð€Oñ ð
 *ÖM�T¬R°«X¸_Ò-LŠDÒMÐMùóùò
 Ns   ™2A,ÁA2Á%A2c                 ó4   ‡— dŠdˆfd„}| D ]
  } ||«       Œ y)zEEnsure every instruction has line number set in case some are removedNc                 óD   •— | j                   r| j                   Š‰| _         y r#   ©Ústarts_line©r   Úcur_line_nos    €r   Úpopulate_line_numz.propagate_line_nums.<locals>.populate_line_num~   s   ø€ à×ÒØ×*Ñ*ˆKà&ˆÕr   ©r   r   r   N© )r   rJ   r   rI   s      @r   Úpropagate_line_numsrM   z   s&   ø€ à€Kõ'ð ò  ˆÙ˜$Õñ r   c                 ó4   ‡— dŠdˆfd„}| D ]
  } ||«       Œ y)z;Remove extra starts line properties before packing bytecodeNc                 óf   •— | j                   €y | j                   ‰k(  rd | _         y | j                   Šy r#   rF   rH   s    €r   Úremove_line_numz/remove_extra_line_nums.<locals>.remove_line_numŽ   s3   ø€ à×ÑÐ#ØØ×Ñ Ò,Ø#ˆDÕà×*Ñ*‰Kr   rK   rL   )r   rP   r   rI   s      @r   Úremove_extra_line_numsrQ   ‰   s(   ø€ ð €Kõ+ð ò ˆÙ˜Õñr   c                   ó>   — e Zd ZU ee   ed<   ee   ed<   ee   ed<   y)ÚReadsWritesÚreadsÚwritesÚvisitedN)Ú__name__Ú
__module__Ú__qualname__r.   r   Ú__annotations__rL   r   r   rS   rS   ›   s   … àˆs‰8ƒOØ�‰HÓØ�‰XÔr   rS   Úinstructionc                 ó0  ‡ ‡‡‡‡— t        ‰ «      Št        t        «       t        «       t        «       «      Št        t        «       t        «       t        «       «      Šdt        dt        dd fˆˆ ˆˆˆfd„Š ‰‰‰|   «       ‰j                  ‰j                  z  S )NÚstater!   r   c                 ó@  •— || j                   v ry | j                   j                  |«       t        |t        ‰«      «      D �]Z  }‰|   }|j                  t
        v s|j                  t        v r¶d|j                  v sd|j                  v r>|j                  ‰j                  vr‚| j                  j                  |j                  «       n\d|j                  v r&| j                  j                  |j                  «       n(|j                  dk(  rnt        d|j                  › �«      ‚|j                  r  ‰‰‰|j                  j                     «       |j                  t        v r&|j                  €J ‚ ‰‰‰|j                     «       ‰} |j                  t        v s�Œ[ y  y )NÚLOADÚDELETEÚSTOREÚ	MAKE_CELLz
unhandled )rV   r&   r$   r%   r)   ÚHASLOCALÚHASFREEr>   ÚargvalrU   rT   ÚNotImplementedErrorr'   r(   r*   r+   )	r]   r!   r   r   r   r   ÚmayÚmustÚwalks	       €€€€€r   ri   zlivevars_analysis.<locals>.walk©   sI  ø€ Ø�E—M‘MÑ!ØØ�‰×Ñ˜%Ô ä�uœc ,Ó/Ó0ó 	ˆAØ ‘?ˆDØ�{‰{œhÑ&¨$¯+©+¼Ñ*@Ø˜TŸ[™[Ñ(¨H¸¿¹Ñ,CØ—{‘{¨$¯+©+Ñ5ØŸ™Ÿ™¨¯©Õ4Ø §¡Ñ+Ø—L‘L×$Ñ$ T§[¡[Õ1Ø—[‘[ KÒ/Øä-°
¸4¿;¹;¸-Ð.HÓIÐIØ×!Ò!Ù�S˜' $×"4Ñ"4×";Ñ";Ñ<Ô=Ø�{‰{œlÑ*Ø—{‘{Ð.Ð.Ð.Ù�S˜' $§+¡+Ñ.Ô/Ø�Ø�{‰{Ô.Ó.Ùñ'	r   )r   rS   r.   r/   rT   )r   r[   r   rg   rh   ri   s   ` @@@@r   Úlivevars_analysisrj   ¢   sz   ü€ ô ˜,Ó'€GÜ”s“uœc›e¤S£UÓ+€DÜ
”c“eœS›U¤C£EÓ
*€Cð”Kð ¬ð °÷ ñ ñ4 	ˆˆw�{Ñ#Ô$Ø�:‰:˜Ÿ	™	Ñ!Ð!r   c                   ó   — e Zd ZU dZeed<   y)ÚFixedPointBoxTÚvalueN)rW   rX   rY   rm   ÚboolrZ   rL   r   r   rl   rl   Ç   s   … à€Eˆ4Ôr   rl   c                   ód   — e Zd ZU eez  ed<   eez  ed<   eed<   dd„Zdd deddfd	„Zd
eddfd„Z	y)Ú	StackSizeÚlowÚhighÚfixed_pointr   Nc                 óB   — d| _         d| _        d| j                  _        y )Nr   F)rq   rr   rs   rm   )Úselfs    r   ÚzerozStackSize.zeroÒ   s   € ØˆŒØˆŒ	Ø!&ˆ×ÑÕr   ÚotherÚnc                 ó.  — | j                   | j                  f}t        | j                   |j                   |z   «      | _         t        | j                  |j                  |z   «      | _        | j                   | j                  f|k7  rd| j                  _        y y ©NF©rq   rr   ÚminÚmaxrs   rm   )ru   rw   rx   Úpriors       r   Ú	offset_ofzStackSize.offset_of×   sp   € Ø—‘˜4Ÿ9™9Ð%ˆÜ�t—x‘x §¡¨Q¡Ó/ˆŒÜ˜Ÿ	™	 5§:¡:°¡>Ó2ˆŒ	Ø�H‰H�d—i‘iÐ  EÒ)Ø%*ˆD×ÑÕ"ð *r   Údepthc                 óú   — | j                   | j                  f}t        | j                   |«      | _         t        | j                  |«      | _        | j                   | j                  f|k7  rd| j                  _        y y rz   r{   )ru   r€   r~   s      r   Úexn_tab_jumpzStackSize.exn_tab_jumpÞ   s`   € Ø—‘˜4Ÿ9™9Ð%ˆÜ�t—x‘x Ó'ˆŒÜ˜Ÿ	™	 5Ó)ˆŒ	Ø�H‰H�d—i‘iÐ  EÒ)Ø%*ˆD×ÑÕ"ð *r   )r   N)
rW   rX   rY   r/   ÚfloatrZ   rl   rv   r   r‚   rL   r   r   rp   rp   Ì   sN   … à	ˆu‰ÓØ
�‰+ÓØÓó'ð
+˜{ð +¨sð +°tó +ð+ #ð +¨$ô +r   rp   c           
      óN  — | sJ ‚t        «       }| D �ci c]"  }|t        t        d«      t        d«      |«      “Œ$ }}|| d      j                  «        t	        d«      D �]e  }|j
                  r �nVd|_        t        | | dd  d gz   «      D �]5  \  }}||   }|j                  t        vrC|€
J d|› �«       ‚t        |j                  |j                  d¬	«      }||   j                  ||«       |j                  t        v rU|j                  €
J d
|› �«       ‚||j                     j                  |t        |j                  |j                  d¬	«      «       |j                  sŒÕ|j                  j                  t!        |j                  j"                  «      z   dz   }||j                  j                     j%                  |«       �Œ8 �Œh t'        d„ |j)                  «       D «       «      }	t+        d„ |j)                  «       D «       «      }
|j
                  sJ d«       ‚|	dk\  sJ ‚|
S c c}w )NÚinfz-infr   éd   Tr   zmissing next inst: F)Újumpzmissing target: c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr#   )rq   ©Ú.0Úxs     r   ú	<genexpr>z%stacksize_analysis.<locals>.<genexpr>  s   è ø€ Ò2˜ˆa�e�eÑ2ùó   ‚c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr#   )rr   r‰   s     r   rŒ   z%stacksize_analysis.<locals>.<genexpr>  s   è ø€ Ò4˜!ˆq�v�vÑ4ùr�   zfailed to reach fixed point)rl   rp   rƒ   rv   r$   rm   Úzipr)   r+   Ústack_effectÚargr   r*   r(   r'   r€   r/   Úlastir‚   r|   Úvaluesr}   )r   rs   r   Ústack_sizesÚ_Ú	next_instÚ
stack_sizeÚeffr€   rq   rr   s              r   Ústacksize_analysisr™   æ   s  € ÙÐˆ<Ü“/€Kð !öàð 	Œiœ˜e›¤e¨F£m°[ÓAÑAð€Kð ð �˜Q‘Ñ ×%Ñ%Ô'ä�3‹Zó KˆØ×ÒÚØ ˆÔä" <°¸a¸bÐ1AÀTÀFÑ1JÓKó 	K‰OˆD�)Ø$ TÑ*ˆJØ�{‰{Ô"2Ñ2Ø Ð,ÐJÐ0CÀDÀ6Ð.JÓJÐ,Ü" 4§;¡;°·±¸uÔE�Ø˜IÑ&×0Ñ0°¸SÔAØ�{‰{œlÑ*Ø—{‘{Ð.ÐIÐ2BÀ4À&Ð0IÓIÐ.Ø˜DŸK™KÑ(×2Ñ2Ø¤¨T¯[©[¸$¿(¹(ÈÔ Nôð ×!Ó!ð ×*Ñ*×0Ñ0´3°t×7IÑ7I×7OÑ7OÓ3PÑPÐSTÑT�Ø˜D×.Ñ.×5Ñ5Ñ6×CÑCÀEÖJò	KðKô, Ñ2˜[×/Ñ/Ó1Ô2Ó
2€CÜÑ4˜{×1Ñ1Ó3Ô4Ó4€Dà×ÒÐ;Ð;Ó;ÐØ�!Š8€Oˆ8Ø€KùòCs   “'H"))Ú__doc__r3   ÚdataclassesÚdisr<   r0   Útypingr   r   Úbytecode_transformationr   Úopmapr+   r&   r1   r.   ÚhasjrelÚhasjabsr*   r>   ÚJUMP_OPNAMESÚhaslocalrc   Úhasfreerd   r�   ÚlistÚdictr/   r   r:   rC   rM   rQ   Ú	dataclassrS   rj   rl   rp   rƒ   r™   )r)   s   0r   ú<module>r¨      s¢  ðñó Û Û 
Û Û 
ß %ñ õ 5ð ‡I�IˆnÑØ‡I�IˆnÑØ‡I�IˆoÑðÐ ð × Ñ �S—Y‘Y˜yÑ)Ô *Ø×Ñ�wÒØ×Ñ˜Ÿ™ ?Ñ3Ô4Ø×Ñ˜Ÿ™ >Ñ2Õ3à×Ñ˜Ÿ™ ?Ñ3Ô4à
ˆc×ÑÔ( Õ(Ø×Ñ˜Ÿ™ >Ñ2Ô3Ø×Ñ�wÒØ×Ñ˜Ÿ™Ð#?Ñ@ÔAÙ�3—;‘; §¡Ñ,Ó-€Ø1=Ö> v�—
‘
˜6Ó"Ò>€Ùˆs�|‰|Ó€Ù
ˆc�k‰kÓ
€à×Ñ€ð
�t˜MÑ*ð 
¨t°MÀ3Ð4FÑ/Gó 
ð+K 4¨Ñ#6ð +K¸4ÀÑ;Nó +Kð\N¨¨mÑ)<ð NÀÀmÑATó Nð  d¨=Ñ&9ð  ¸dó  ð¨¨mÑ)<ð Àó ð$ ×Ñ÷ð ó ðð""Ø�}Ñ%ð""Ø4Að""àˆ�Xó""ðJ ×Ñ÷ð ó ðð ×Ñ÷+ð +ó ð+ð2$ T¨-Ñ%8ð $¸SÀ5¹[ô $ùòq ?s   Å!I