
    daf                         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      7/root/Python-3.12.4/Lib/test/support/bytecode_helper.pyget_disassembly_as_stringz*BytecodeTestCase.get_disassembly_as_string   s'    KKMzz|    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    fcii())!, 	!E||v%\)U\\V-C L	! 44Q7\!5;[IC6C55C		#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    fcii())!, 		#E||v%"<<Q?\):@+NCIIcN\\V+;C ==CIIcN		#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    
 	gt,i.%%g.''	2Vc(m4 FH- 		'HC#s#  c*!!#u-!!#u-3x#c(")3s8n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dTZZ$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dE***"&FECYY]]662F%,kk%5e4ZZ'FJJ*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dE***:DYYtAw'FGEqr(bTQT]33CJJ,,-	. 
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\    #**oG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+((/UFG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    !(E8<	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   