o
    HXîhO  ã                   @   s^   d dl Z d dlZd dlmZ dd„ ZG dd„ deƒZG dd„ dejƒZed	kr-e 	¡  dS dS )
é    N)ÚBytecodeTestCasec                 C   s^   d}t  | ¡D ]}|j|kr|d7 }qt| dƒr| j} | jD ]}t|dƒr,|t||ƒ7 }q|S )Nr   é   Ú__code__Úco_code)ÚdisÚget_instructionsÚopnameÚhasattrr   Ú	co_constsÚcount_instr_recursively)Úfr   ÚcountÚinstrÚc© r   ú=/opt/python-3.10.19/usr/lib/python3.10/test/test_peepholer.pyr      s   
€


€r   c                   @   sä   e Z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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d'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7S )8ÚTestTranformsc              
   C   sê   t t |¡ƒ}dd„ |D ƒ}|D ]b}d|jvrq||j }|jdv r6|  |j› d|j› d|j› d|j› ¡ |jdv rT|jdkrT|  |j› d|j› d|j› d|j› ¡ d|jv rrd	|jv rr|  |j› d|j› d|j› d|j› ¡ qd S )
Nc                 S   s   i | ]}|j |“qS r   )Úoffset©Ú.0r   r   r   r   Ú
<dictcomp>   s    z4TestTranforms.check_jump_targets.<locals>.<dictcomp>ZJUMP_)ÚJUMP_ABSOLUTEÚJUMP_FORWARDz at z
 jumps to ÚRETURN_VALUEZ_OR_POPZJUMP_IF_)Úlistr   r   r   ZargvalZfailr   )ÚselfÚcodeZinstructionsÚtargetsr   Ztgtr   r   r   Úcheck_jump_targets   s6   


ÿÿ

ÿÿÿÿ€ñz TestTranforms.check_jump_targetsc                 C   s^   t  |¡}tt  |¡ƒ}tdd„ |D ƒƒ}tdd„ |D ƒƒ}|  |d¡ |  |t|j	ƒ¡ dS )z0Check that the lnotab byte offsets are sensible.c                 s   ó    | ]}|d  V  qdS ©r   Nr   ©r   Útr   r   r   Ú	<genexpr>1   ó   € z-TestTranforms.check_lnotab.<locals>.<genexpr>c                 s   r   r    r   r!   r   r   r   r#   2   r$   r   N)
r   Z_get_code_objectr   ZfindlinestartsÚminÚmaxZassertGreaterEqualZ
assertLessÚlenr   )r   r   ZlnotabZmin_bytecodeZmax_bytecoder   r   r   Úcheck_lnotab+   s   
zTestTranforms.check_lnotabc                 C   s:   dd„ }|   |d¡ |   |d¡ |  |d¡ |  |¡ d S )Nc                 S   s   | dks~ d S d S )Né   r   ©Úxr   r   r   Úunot;   s   ÿz%TestTranforms.test_unot.<locals>.unotZ	UNARY_NOTÚPOP_JUMP_IF_FALSEÚPOP_JUMP_IF_TRUE©ÚassertNotInBytecodeÚassertInBytecoder(   )r   r,   r   r   r   Ú	test_unot9   s
   zTestTranforms.test_unotc                 C   s8   dD ]\}}}t |ddƒ}|  |||¡ |  |¡ qd S )N))z
not a is bÚIS_OPr   )znot a is not br3   r   )z
not a in bÚCONTAINS_OPr   )znot a not in br4   r   Ú Úsingle)Úcompiler1   r(   )r   ÚlineZcmp_opÚinvertr   r   r   r   Útest_elim_inversion_of_is_or_inC   s
   øz-TestTranforms.test_elim_inversion_of_is_or_inc                 C   sŒ   dd„ }dd„ }dd„ }|d f|df|dffD ]\}}|   |d	¡ |  |d
|¡ |  |¡ qdd„ }|   |d	¡ |  |d
d ¡ |  |¡ d S )Nc                  S   s   d } d } | S ©Nr   r*   r   r   r   r   P   s   z0TestTranforms.test_global_as_constant.<locals>.fc                  S   ó   d} | S )NTr   r*   r   r   r   ÚgT   ó   z0TestTranforms.test_global_as_constant.<locals>.gc                  S   r<   )NFr   r*   r   r   r   ÚhW   r>   z0TestTranforms.test_global_as_constant.<locals>.hTFZLOAD_GLOBALÚ
LOAD_CONSTc                   S   ó   dS )z1Adding a docstring made this test fail in Py2.5.0Nr   r   r   r   r   r   `   s   r/   )r   r   r=   r?   ÚfuncÚelemr   r   r   Útest_global_as_constantN   s   z%TestTranforms.test_global_as_constantc                 C   sB   dd„ }dD ]}|   ||¡ qdD ]}|  ||¡ q|  |¡ d S )Nc                    S   s   	 	 qr;   )r   r   r   r   r   r   j   s   ÿz'TestTranforms.test_while_one.<locals>.f)r@   r-   )r   r/   )r   r   rC   r   r   r   Útest_while_oneh   s   zTestTranforms.test_while_onec                 C   sL   dD ]!\}}t |ddƒ}|  ||¡ |  |d¡ |  |d¡ |  |¡ qd S )N))za, = a,r@   )za, b = a, bZROT_TWO)za, b, c = a, b, cZ	ROT_THREEr5   r6   ÚBUILD_TUPLEZUNPACK_TUPLE©r7   r1   r0   r(   ©r   r8   rC   r   r   r   r   Útest_pack_unpackt   s   ÷zTestTranforms.test_pack_unpackc                 C   s¦   dD ]\}}t |ddƒ}|  |d|¡ |  |d¡ |  |¡ qt tttdƒƒƒddƒ}|  |d¡ dd„ t |¡D ƒ}|  	t
|ƒd	¡ |  |¡ d
d„ }|  |¡ d S )N))z	a = 1,2,3©r   r)   é   )z("a","b","c")©ÚaÚbr   )za,b,c = 1,2,3rJ   )z(None, 1, None)©Nr   N)z((1, 2), 3, 4)©©r   r)   rK   é   r5   r6   r@   rF   é'  c                 S   ó   g | ]	}|j d kr|‘qS )r@   ©r   r   r   r   r   Ú
<listcomp>‘   ó    
ÿzETestTranforms.test_folding_of_tuples_of_constants.<locals>.<listcomp>r)   c                   S   s   g d¢ f d S )N)dr   r   r)   rK   rR   é   é   é   é   é	   r   r   r)   rK   rR   rX   rY   rZ   r[   r\   r   r   r)   rK   rR   rX   rY   rZ   r[   r\   r   r   r)   rK   rR   rX   rY   rZ   r[   r\   r   r   r)   rK   rR   rX   rY   rZ   r[   r\   r   r   r)   rK   rR   rX   rY   rZ   r[   r\   r   r   r)   rK   rR   rX   rY   rZ   r[   r\   r   r   r)   rK   rR   rX   rY   rZ   r[   r\   r   r   r)   rK   rR   rX   rY   rZ   r[   r\   r   r   r)   rK   rR   rX   rY   rZ   r[   r\   r   r   r   r   r   Úcrater™   ó   zATestTranforms.test_folding_of_tuples_of_constants.<locals>.crater)r7   r1   r0   r(   ÚreprÚtupleÚranger   r   ÚassertEqualr'   )r   r8   rC   r   Zload_constsr]   r   r   r   Ú#test_folding_of_tuples_of_constants€   s   
z1TestTranforms.test_folding_of_tuples_of_constantsc                 C   sB   dD ]\}}t |ddƒ}|  |d|¡ |  |d¡ |  |¡ qd S )N))za in [1,2,3]rJ   )za not in ["a","b","c"]rL   )za in [None, 1, None]rO   )za not in [(1, 2), 3, 4]rP   r5   r6   r@   Ú
BUILD_LISTrG   rH   r   r   r   Ú"test_folding_of_lists_of_constants¨   s   öz0TestTranforms.test_folding_of_lists_of_constantsc                 C   sè   dt h d£ƒfdt h d£ƒfdt dd hƒfdt h d£ƒfd	t h d£ƒffD ]\}}t|d
dƒ}|  |d¡ |  |d|¡ |  |¡ q%dd„ }dd„ }|  |dƒ¡ |  |dƒ ¡ |  |¡ |  |dƒ ¡ |  |dƒ¡ |  |¡ d S )Nza in {1,2,3}¾   r   r)   rK   za not in {"a","b","c"}>   r   rN   rM   za in {None, 1, None}r   za not in {(1, 2), 3, 4}>   rQ   rK   rR   za in {1, 2, 3, 3, 2, 1}r5   r6   Z	BUILD_SETr@   c                 S   s   | dv S ©Nrf   r   ©rM   r   r   r   r   Ä   ó   z:TestTranforms.test_folding_of_sets_of_constants.<locals>.fc                 S   s   | dvS rg   r   rh   r   r   r   r=   Ç   ri   z:TestTranforms.test_folding_of_sets_of_constants.<locals>.grK   rR   )Ú	frozensetr7   r0   r1   r(   Ú
assertTrue)r   r8   rC   r   r   r=   r   r   r   Ú!test_folding_of_sets_of_constantsµ   s$   ú
z/TestTranforms.test_folding_of_sets_of_constantsc                 C   s,  dD ]'\}}t |ddƒ}|  |d|¡ t |¡D ]}|  |j d¡¡ q|  |¡ qt dddƒ}|  |dd¡ |  |dd¡ |  |¡ t d	ddƒ}|  |dd
¡ |  dd
 |j	¡ |  |¡ t dddƒ}|  |dd¡ |  dd> |j	¡ |  |¡ t dddƒ}|  |dd¡ |  dd |j	¡ |  |¡ d S )N))z	a = 2+3+4r\   )z"@"*4z@@@@)za="abc" + "def"Zabcdef)za = 3**4éQ   )za = 3*4é   )z	a = 13//4rK   )za = 14%4r)   )za = 2+3rX   )za = 13-4r\   )za = (12,13)[1]é   )za = 13 << 2é4   )za = 13 >> 2rK   )z
a = 13 & 7rX   )z
a = 13 ^ 7é
   )z
a = 13 | 7é   r5   r6   r@   ÚBINARY_za=2+"b"r)   rN   za="x"*10000rS   r+   z	a=1<<1000iè  r   z	a=2**1000)
r7   r1   r   r   ÚassertFalser   Ú
startswithr(   ZassertNotInr
   )r   r8   rC   r   r   r   r   r   Ú#test_folding_of_binops_on_constantsÓ   s,   


z1TestTranforms.test_folding_of_binops_on_constantsc                 C   s¶   t dddƒ}|  |dd¡ |  |d¡ |  |¡ t dddƒ}|  |dd¡ |  |d¡ |  |¡ t d	ddƒ}|  |dd
¡ |  |d¡ |  |¡ t dddƒ}|  |d¡ |  |¡ d S )Nz"foo"[0]r5   r6   r@   r   ZBINARY_SUBSCRu	   "aï¿¿"[1]u   ï¿¿u	   "ð’…"[0]u   ð’…z	"fuu"[10]rG   )r   r   r   r   r   Útest_binary_subscr_on_unicodeÿ   s   


z+TestTranforms.test_binary_subscr_on_unicodec                 C   sÌ   dD ]'\}}t |ddƒ}|  |d|¡ t |¡D ]}|  |j d¡¡ q|  |¡ qdd„ }t |¡D ]}|  |j d¡¡ q3|  |¡ dD ]\}}}t |ddƒ}|  |d|¡ |  ||¡ |  |¡ qFd S )	N))z-0.5g      à¿)z-0.0ç       €)z
-(1.0-1.0)rx   )z-0r   )z~-2r   )z+1r   r5   r6   r@   ÚUNARY_c                   S   rA   )Nrx   r   r   r   r   r   Únegzero&  ó   zDTestTranforms.test_folding_of_unaryops_on_constants.<locals>.negzero))z-"abc"ÚabcZUNARY_NEGATIVE)z~"abc"r|   ZUNARY_INVERT)r7   r1   r   r   rt   r   ru   r(   )r   r8   rC   r   r   rz   r   r   r   r   Ú%test_folding_of_unaryops_on_constants  s    
ùz3TestTranforms.test_folding_of_unaryops_on_constantsc                 C   sH   dd„ }|   |dd ¡ dd„ t |¡D ƒ}|  t|ƒd¡ |  |¡ d S )Nc                 S   s   | S r;   r   r*   r   r   r   r   9  r{   z/TestTranforms.test_elim_extra_return.<locals>.fr@   c                 S   rT   ©r   rU   r   r   r   r   rV   <  rW   z8TestTranforms.test_elim_extra_return.<locals>.<listcomp>r   )r0   r   r   rb   r'   r(   ©r   r   Úreturnsr   r   r   Útest_elim_extra_return7  s
   z$TestTranforms.test_elim_extra_returnc                 C   s\   dd„ }|   |¡ |  |d¡ |  |d¡ dd„ t |¡D ƒ}|  t|ƒd¡ |  |¡ d S )Nc                 S   s   | r|S |S r;   r   )ÚcondZ
true_valueZfalse_valuer   r   r   r   C  s   ÿz1TestTranforms.test_elim_jump_to_return.<locals>.fr   r   c                 S   rT   r~   rU   r   r   r   r   rV   J  rW   z:TestTranforms.test_elim_jump_to_return.<locals>.<listcomp>r)   )r   r0   r   r   rb   r'   r(   r   r   r   r   Útest_elim_jump_to_returnA  s   
z&TestTranforms.test_elim_jump_to_returnc                 C   ó    dd„ }|   |¡ |  |¡ d S )Nc                   S   s$   t rtstrtƒ  d S d S tƒ  d S r;   )rM   r   ÚdÚfooZbazr   r   r   r   r   Q  s   ÿ
þ
z6TestTranforms.test_elim_jump_to_uncond_jump.<locals>.f©r   r(   ©r   r   r   r   r   Útest_elim_jump_to_uncond_jumpO  s   
z+TestTranforms.test_elim_jump_to_uncond_jumpc                 C   r„   )Nc                  S   s   | rt str	tƒ } | sd S d S r;   )r   r…   r†   rh   r   r   r   r   ^  s   ÿüz7TestTranforms.test_elim_jump_to_uncond_jump2.<locals>.fr‡   rˆ   r   r   r   Útest_elim_jump_to_uncond_jump2\  s   
z,TestTranforms.test_elim_jump_to_uncond_jump2c                 C   sà   dd„ }|   |¡ |  |¡ |  t|dƒd¡ dd„ }|   |¡ |  |¡ |  t|dƒd¡ dd„ }|   |¡ |  |¡ |  |d¡ |  |d¡ |  |d¡ d	d„ }|   |¡ |  |¡ |  |d¡ |  |d¡ |  |d
¡ d S )Nc                 S   s   | o|o|S r;   r   rL   r   r   r   r   j  ó   ÿz7TestTranforms.test_elim_jump_to_uncond_jump3.<locals>.fZJUMP_IF_FALSE_OR_POPr)   c                 S   s   | p|p|S r;   r   rL   r   r   r   r   q  r‹   ZJUMP_IF_TRUE_OR_POPc                 S   s   | r|p|S r;   r   rL   r   r   r   r   x  r‹   r-   c                 S   s   | s|o|S r;   r   rL   r   r   r   r     r‹   r.   )r   r(   rb   r   r0   r1   rˆ   r   r   r   Útest_elim_jump_to_uncond_jump3g  s(   







z,TestTranforms.test_elim_jump_to_uncond_jump3c                 C   sR   dd„ }|   |d¡ |   |d¡ dd„ t |¡D ƒ}|  t|ƒd¡ |  |¡ d S )Nc                 S   s   | rdS |rdS 	 dS )Nr   r)   rK   r   )Zcond1Zcond2r   r   r   r   Œ  s   z5TestTranforms.test_elim_jump_after_return1.<locals>.fr   r   c                 S   rT   r~   rU   r   r   r   r   rV   —  rW   z>TestTranforms.test_elim_jump_after_return1.<locals>.<listcomp>rY   )r0   r   r   ZassertLessEqualr'   r(   r   r   r   r   Útest_elim_jump_after_return1Š  s   	z*TestTranforms.test_elim_jump_after_return1c                 C   s"   dd„ }|   |d¡ |  |¡ d S )Nc                  S   s   ddd„} | S )NÚreturnr)   c                   S   s   d S r;   r   r   r   r   r   r=   ž  r{   zBTestTranforms.test_make_function_doesnt_bail.<locals>.f.<locals>.g)rŽ   r)   r   )r=   r   r   r   r     s   
z7TestTranforms.test_make_function_doesnt_bail.<locals>.fZ
BINARY_ADD)r0   r(   rˆ   r   r   r   Útest_make_function_doesnt_bailœ  s   z,TestTranforms.test_make_function_doesnt_bailc                 C   sr   g d¢}|D ]0}t |ddƒ}t |¡D ]}|  |j d¡¡ |  |j d¡¡ |  |j d¡¡ q|  |¡ qd S )N)	z3 * -5z-3 * 5z2 * (3 * 4)z(2 * 3) * 4z
(-1, 2, 3)z
(1, -2, 3)z
(1, 2, -3)z(1, 2, -3) * 6z:lambda x: x in {(3 * -5) + (-1 - 6), (1, -2, 3) * 2, None}r5   r6   ry   rs   ZBUILD_)r7   r   r   rt   r   ru   r(   )r   ZexprsÚer   r   r   r   r   Útest_constant_folding¤  s   úz#TestTranforms.test_constant_foldingc                 C   ó(   dd„ }|   t|dƒd¡ |  |¡ d S )Nc                   S   s   t ttfv S r;   )r+   rM   rN   r   r   r   r   Úcontaintestº  s   z7TestTranforms.test_in_literal_list.<locals>.containtestrd   r   ©rb   r   r(   )r   r“   r   r   r   Útest_in_literal_list¹  s   z"TestTranforms.test_in_literal_listc                 C   r’   )Nc                  S   s   t tfD ]} qd S r;   )rM   rN   r*   r   r   r   ÚforloopÀ  s   ÿz8TestTranforms.test_iterate_literal_list.<locals>.forlooprd   r   r”   )r   r–   r   r   r   Útest_iterate_literal_list¿  s   z'TestTranforms.test_iterate_literal_listc                 C   s$   dd„ }|   |ƒ d¡ |  |¡ d S )Nc                   S   s   	 dS )NTFr   r   r   r   r   r   r   Ç  ó   z=TestTranforms.test_condition_with_binop_with_bools.<locals>.fr   )rb   r(   rˆ   r   r   r   Ú$test_condition_with_binop_with_boolsÆ  s   z2TestTranforms.test_condition_with_binop_with_boolsc                 C   s$   dd„ }|   |dƒ¡ |  |¡ d S )Nc                 S   s   | rdS 	 dS )NTFr   r*   r   r   r   r   Ð  s   ÿz3TestTranforms.test_if_with_if_expression.<locals>.fT)rk   r(   rˆ   r   r   r   Útest_if_with_if_expressionÎ  s   z(TestTranforms.test_if_with_if_expressionc                 C   s   dd„ }|   |¡ d S )Nc                 S   s   	 dS )Nr   rK   r   r*   r   r   r   r   Û  r˜   z+TestTranforms.test_trailing_nops.<locals>.f)r(   rˆ   r   r   r   Útest_trailing_nops×  s   z TestTranforms.test_trailing_nopsc                 C   sl   dd„ }|   t|dƒd¡ dd„ }|   t|dƒd¡ dd„ }|   t|dƒd¡ d	d
„ }|   t|dƒd¡ d S )Nc                   S   ó   dd„ t D ƒS )Nc                 S   s   g | ]}t |ƒ}|‘qS r   ©r   ©r   r+   Úyr   r   r   rV   å  ó    z[TestTranforms.test_assignment_idiom_in_comprehensions.<locals>.listcomp.<locals>.<listcomp>rh   r   r   r   r   Úlistcompä  ó   zGTestTranforms.test_assignment_idiom_in_comprehensions.<locals>.listcompZFOR_ITERr   c                   S   rœ   )Nc                 S   s   h | ]}t |ƒ}|’qS r   r   rž   r   r   r   Ú	<setcomp>è  r    zYTestTranforms.test_assignment_idiom_in_comprehensions.<locals>.setcomp.<locals>.<setcomp>rh   r   r   r   r   Úsetcompç  r¢   zFTestTranforms.test_assignment_idiom_in_comprehensions.<locals>.setcompc                   S   rœ   )Nc                 S   s   i | ]	}t |ƒ}||“qS r   r   rž   r   r   r   r   ë  s    z[TestTranforms.test_assignment_idiom_in_comprehensions.<locals>.dictcomp.<locals>.<dictcomp>rh   r   r   r   r   Údictcompê  r¢   zGTestTranforms.test_assignment_idiom_in_comprehensions.<locals>.dictcompc                   S   rœ   )Nc                 s   s    | ]	}t |ƒ}|V  qd S r;   r   rž   r   r   r   r#   î  s   € zYTestTranforms.test_assignment_idiom_in_comprehensions.<locals>.genexpr.<locals>.<genexpr>rh   r   r   r   r   Úgenexprí  r¢   zFTestTranforms.test_assignment_idiom_in_comprehensions.<locals>.genexpr)rb   r   )r   r¡   r¤   r¥   r¦   r   r   r   Ú'test_assignment_idiom_in_comprehensionsã  s   z5TestTranforms.test_assignment_idiom_in_comprehensionsN)Ú__name__Ú
__module__Ú__qualname__r   r(   r2   r:   rD   rE   rI   rc   re   rl   rv   rw   r}   r   rƒ   r‰   rŠ   rŒ   r   r   r‘   r•   r—   r™   rš   r›   r§   r   r   r   r   r      s8    
(,!
#	r   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestBugletsc                 C   s>   dd„ }|   t¡ |ƒ  W d   ƒ d S 1 sw   Y  d S )Nc                  S   s   ddh\} }| |fS )Nr   r   )r+   rŸ   r   r   r   r   ø  s   z%TestBuglets.test_bug_11510.<locals>.f)ZassertRaisesÚ
ValueErrorrˆ   r   r   r   Útest_bug_11510ô  s   "ÿzTestBuglets.test_bug_11510c              	   C   s,   t dƒD ]}zt‚ tpty   Y qw d S )Nrq   )ra   Ú	Exception)r   Úir   r   r   Útest_bpo_42057þ  s   ÿýzTestBuglets.test_bpo_42057c                 C   ó   t dddƒ d S )Nzwhile True or spam: passú<test>Úexec©r7   ©r   r   r   r   Útest_bpo_45773_pop_jump_if_true  r^   z+TestBuglets.test_bpo_45773_pop_jump_if_truec                 C   r±   )Nzwhile True or not spam: passr²   r³   r´   rµ   r   r   r   Ú test_bpo_45773_pop_jump_if_false  r^   z,TestBuglets.test_bpo_45773_pop_jump_if_falseN)r¨   r©   rª   r­   r°   r¶   r·   r   r   r   r   r«   ò  s
    
r«   Ú__main__)
r   ZunittestZtest.support.bytecode_helperr   r   r   ZTestCaser«   r¨   Úmainr   r   r   r   Ú<module>   s       aÿ