Ë
    òT•j‡  ã                   óØ   — d Z ddlZddlZddlZddlmZmZmZ  e«       Z	 G d„ dej                  «      Z G d„ dej                  «      Z G d„ d	e«      Z G d
„ de«      Z G d„ de«      Zy)zGbytecode_helper - support tools for testing correct bytecode generationé    N)Úcompiler_codegenÚoptimize_cfgÚassemble_code_objectc                   ó*   — e Zd ZdZd„ Zefd„Zefd„Zy)ÚBytecodeTestCasez1Custom assertion methods for inspecting bytecode.c                 óx   — t        j                  «       }t        j                  ||¬«       |j                  «       S )N)Úfile)ÚioÚStringIOÚdisÚgetvalue)ÚselfÚcoÚss      ú3/usr/lib/python3.12/test/support/bytecode_helper.pyÚget_disassembly_as_stringz*BytecodeTestCase.get_disassembly_as_string   s'   € Ü�K‰K‹MˆÜ�‰�˜ÕØ�z‰z‹|Ðó    c                 óF  — | j                  |t        j                  «       t        j                  |«      D ]-  }|j                  |k(  sŒ|t
        u s|j                  |k(  sŒ+|c S  | j                  |«      }|t
        u r|›d|›�}n
d}||||fz  }| j                  |«       y)zAReturns instr if opname is found, otherwise throws AssertionErrorz not found in bytecode:
z!(%s,%r) not found in bytecode:
%sN)	ÚassertInr   ÚopmapÚget_instructionsÚopnameÚ_UNSPECIFIEDÚargvalr   Úfail©r   Úxr   r   ÚinstrÚdisassemblyÚmsgs          r   ÚassertInBytecodez!BytecodeTestCase.assertInBytecode   s—   € à�‰�fœcŸi™iÔ(Ü×)Ñ)¨!Ó,ò 	!ˆEØ�|‰|˜vÓ%Øœ\Ñ)¨U¯\©\¸VÓ-CØ ’Lð	!ð ×4Ñ4°QÓ7ˆØ”\Ñ!Ú5;¹[ÐI‰Cà6ˆCØ˜ ¨Ð5Ñ5ˆCØ�	‰	�#�r   c                 óR  — | j                  |t        j                  «       t        j                  |«      D ]o  }|j                  |k(  sŒ| j                  |«      }|t        u r|›d|›�}| j                  |«       ŒE|j                  |k(  sŒUd}||||fz  }| j                  |«       Œq y)z(Throws AssertionError if opname is foundz occurs in bytecode:
z(%s,%r) occurs in bytecode:
%sN)	r   r   r   r   r   r   r   r   r   r   s          r   ÚassertNotInBytecodez$BytecodeTestCase.assertNotInBytecode!   s”   € à�‰�fœcŸi™iÔ(Ü×)Ñ)¨!Ó,ò 		#ˆEØ�|‰|˜vÓ%Ø"×<Ñ<¸QÓ?�Øœ\Ñ)Ú:@Á+ÐN�CØ—I‘I˜c•NØ—\‘\ VÓ+Ø;�CØ ¨°Ð =Ñ=�CØ—I‘I˜c•Nñ		#r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r!   r#   © r   r   r   r   
   s   „ Ù;òð
 2>ó ð 5Aô #r   r   c                   óÖ   — e Zd Z eej
                  «      Z eej                  ej                  z   ej                  z   «      Z
ej                  e
«      Z G d„ d«      Zd„ Zd„ Zd„ Zd„ Zy)ÚCompilationStepTestCasec                   ó   — e Zd Zy)úCompilationStepTestCase.LabelN)r$   r%   r&   r(   r   r   ÚLabelr,   5   s   „ Ør   r-   c                 ó  — | j                  |t        «       | j                  |t        «       | j                  |«      }| j                  |«      }| j                  t	        |«      t	        |«      «       t        ||«      D ]‹  \  }}t        |t        «      r| j                  ||«       Œ)| j                  |t        «       | j                  |t        «       t	        |«      t	        |«      kD  r|d t	        |«       }| j                  ||«       Œ� y ©N)	ÚassertIsInstanceÚlistÚnormalize_instsÚassertEqualÚlenÚzipÚ
isinstanceÚintÚtuple)r   Úactual_Ú	expected_ÚactualÚexpectedÚactÚexps          r   ÚassertInstructionsMatchz/CompilationStepTestCase.assertInstructionsMatch8   sä   € ð
 	×Ñ˜g¤tÔ,Ø×Ñ˜i¬Ô.à×%Ñ% gÓ.ˆØ×'Ñ'¨	Ó2ˆØ×Ñœ˜V›¤c¨(£mÔ4ô ˜F HÓ-ò 		'‰HˆC�Ü˜#œsÔ#Ø× Ñ   cÔ*ØØ×!Ñ! #¤uÔ-Ø×!Ñ! #¤uÔ-ä�3‹xœ#˜c›(Ò"Ø˜)œ3˜s›8�n�Ø×Ñ˜S #Õ&ñ		'r   c                 óÀ   — d}g }|D ]T  }t        || j                  t        f«      sJ ‚t        || j                  «      r||_        Œ?|dz  }|j	                  |«       ŒV |S )Nr   é   )r6   r-   r8   ÚvalueÚappend)r   ÚinstsÚidxÚresÚitems        r   ÚresolveAndRemoveLabelsz.CompilationStepTestCase.resolveAndRemoveLabelsP   se   € ØˆØˆØò 	!ˆDÜ˜d T§Z¡Z´Ð$7Ô8Ð8Ð8Ü˜$ §
¡
Ô+Ø �•
à�q‘�Ø—
‘
˜4Õ ð	!ð ˆ
r   c                 ód  — | j                  |«      }g }|D ]—  }t        |t        «      sJ ‚|^}}}t        j                  j                  ||«      }t        || j                  «      r|j                  }n|| j                  v r|nd}t        j                  |   }|j                  ||g|¢­«       Œ™ |S )zN Map labels to instruction index.
            Map opcodes to opnames.
        N)rH   r6   r8   r   r   Úgetr-   rB   ÚHAS_ARGr   rC   )r   rD   rF   rG   ÚopcodeÚopargÚlocÚargs           r   r2   z'CompilationStepTestCase.normalize_insts]   s¬   € ð ×+Ñ+¨EÓ2ˆØˆØò 		,ˆDÜ˜d¤EÔ*Ð*Ð*Ø"&ÐˆF�E˜CÜ—Y‘Y—]‘] 6¨6Ó2ˆFÜ˜% §¡Ô,Ø—k‘k‘à%¨¯©Ñ5‘e¸4�Ü—Z‘Z Ñ'ˆFØ�J‰J˜ Ð* cÑ*Õ+ð		,ð ˆ
r   c                 óä   — g }|D ]h  }t        |t        «      sJ ‚t        |«      }t        j                  |d      }|d   }|dd  dgdt        |«      z
  z  z   }|j                  ||g|¢­«       Œj |S )Nr   rA   é   éÿÿÿÿé   )r6   r8   r1   r   r   r4   rC   )r   rD   rF   rG   ÚinstrL   rM   rN   s           r   Úcomplete_insts_infoz+CompilationStepTestCase.complete_insts_infoo   s†   € àˆØò 	.ˆDÜ˜d¤EÔ*Ð*Ð*Ü˜“:ˆDÜ—Y‘Y˜t A™wÑ'ˆFØ˜‘GˆEØ�q�r�(˜b˜T Q¬¨T«¡]Ñ3Ñ3ˆCØ�J‰J˜ Ð,¨Ñ,Õ-ð	.ð ˆ
r   N)r$   r%   r&   Úsetr   ÚhasargrK   ÚhasjrelÚhasjabsÚhasexcÚ
HAS_TARGETÚunionÚHAS_ARG_OR_TARGETr-   r?   rH   r2   rU   r(   r   r   r*   r*   /   s\   „ á�#—*‘*‹o€GÙ�S—[‘[ 3§;¡;Ñ.°·±Ñ;Ó<€JØŸ™ jÓ1Ð÷ñ ò'ò0òó$
r   r*   c                   ó   — e Zd Zd„ Zy)ÚCodegenTestCasec                 ó&   — t        |dd«      \  }}|S )Nz
my_file.pyr   )r   )r   ÚastrD   Ú_s       r   Úgenerate_codezCodegenTestCase.generate_code~   s   € Ü# C¨°qÓ9‰ˆˆqØˆr   N)r$   r%   r&   rc   r(   r   r   r_   r_   |   s   „ ór   r_   c                   ó   — e Zd Zdd„Zy)ÚCfgOptimizationTestCasec                 óh   — | j                  |«      }| j                  |«      }t        |||«      }||fS r/   )r2   rU   r   )r   rD   ÚconstsÚnlocalss       r   Úget_optimizedz%CfgOptimizationTestCase.get_optimized…   s:   € Ø×$Ñ$ UÓ+ˆØ×(Ñ(¨Ó/ˆÜ˜U F¨GÓ4ˆØ�fˆ}Ðr   N)r   )r$   r%   r&   ri   r(   r   r   re   re   ƒ   s   „ ôr   re   c                   ó   — e Zd Zd„ Zy)ÚAssemblerTestCasec                 ó    — t        |||«      }|S r/   )r   )r   ÚfilenamerD   Úmetadatar   s        r   Úget_code_objectz!AssemblerTestCase.get_code_object�   s   € Ü! (¨E°8Ó<ˆØˆ	r   N)r$   r%   r&   ro   r(   r   r   rk   rk   ‹   s   „ ór   rk   )r'   Úunittestr   r
   Ú_testinternalcapir   r   r   Úobjectr   ÚTestCaser   r*   r_   re   rk   r(   r   r   ú<module>rt      sm   ðÙ Mã Û 
Û 	ß RÑ Rá‹x€ô##�x×(Ñ(ô ##ôJJ˜h×/Ñ/ô JôZÐ-ô ôÐ5ô ôÐ/õ r   