a
    äzeßP  ã                   @   sZ   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rVe 	¡  dS )
é    N)ÚBytecodeTestCasec                 C   s^   d}t  | ¡D ]}|j|kr|d7 }qt| dƒr6| 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   ú)/usr/lib/python3.9/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d7d8„ Zd9S ):ÚTestTranformsc              
   C   sê   t t |¡ƒ}dd„ |D ƒ}|D ]Ä}d|jvr0q ||j }|jdv rl|  |j› d|j› d|j› d|j› ¡ |jdv r¨|jdkr¨|  |j› d|j› d|j› d|j› ¡ d|jv r d	|jv r |  |j› d|j› d|j› d|j› ¡ q d S )
Nc                 S   s   i | ]}|j |“qS r   )Úoffset©Ú.0r   r   r   r   Ú
<dictcomp>   ó    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   s4    


ÿÿ
ÿÿÿÿÿ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   s   | ]}|d  V  qdS ©r   Nr   ©r   Útr   r   r   Ú	<genexpr>1   r   z-TestTranforms.check_lnotab.<locals>.<genexpr>c                 s   s   | ]}|d  V  qdS 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 )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 br2   r   )z
not a in bÚCONTAINS_OPr   )znot a not in br3   r   Ú Úsingle)Úcompiler0   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   s   d} | S )NTr   r)   r   r   r   ÚgT   s    z0TestTranforms.test_global_as_constant.<locals>.gc                  S   s   d} | S )NFr   r)   r   r   r   ÚhW   s    z0TestTranforms.test_global_as_constant.<locals>.hTFZLOAD_GLOBALÚ
LOAD_CONSTc                   S   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 t S r:   )r   r   r   r   r   r   j   s    z'TestTranforms.test_while_one.<locals>.f)r=   r,   ©r   r.   )r   r   r?   r   r   r   Útest_while_oneh   s    zTestTranforms.test_while_onec                 C   sL   dD ]B\}}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_THREEr4   r5   ÚBUILD_TUPLEZUNPACK_TUPLE©r6   r0   r/   r'   ©r   r7   r?   r   r   r   r   Útest_pack_unpackt   s    zTestTranforms.test_pack_unpackc                 C   s¦   dD ]8\}}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,3rG   )z(None, 1, None)©Nr   N)z((1, 2), 3, 4)©©r   r(   rH   é   r4   r5   r=   rC   é'  c                 S   s   g | ]}|j d kr|‘qS )r=   ©r   r   r   r   r   Ú
<listcomp>‘   s   
ÿzETestTranforms.test_folding_of_tuples_of_constants.<locals>.<listcomp>r(   c                   S   s   g d¢ f d S )N)dr   r   r(   rH   rO   é   é   é   é   é	   r   r   r(   rH   rO   rS   rT   rU   rV   rW   r   r   r(   rH   rO   rS   rT   rU   rV   rW   r   r   r(   rH   rO   rS   rT   rU   rV   rW   r   r   r(   rH   rO   rS   rT   rU   rV   rW   r   r   r(   rH   rO   rS   rT   rU   rV   rW   r   r   r(   rH   rO   rS   rT   rU   rV   rW   r   r   r(   rH   rO   rS   rT   rU   rV   rW   r   r   r(   rH   rO   rS   rT   rU   rV   rW   r   r   r(   rH   rO   rS   rT   rU   rV   rW   r   r   r   r   r   Úcrater™   s    zATestTranforms.test_folding_of_tuples_of_constants.<locals>.crater)r6   r0   r/   r'   ÚreprÚtupleÚranger   r   ÚassertEqualr&   )r   r7   r?   r   Zload_constsrX   r   r   r   Ú#test_folding_of_tuples_of_constants€   s    
z1TestTranforms.test_folding_of_tuples_of_constantsc                 C   sB   dD ]8\}}t |ddƒ}|  |d|¡ |  |d¡ |  |¡ qd S )N))za in [1,2,3]rG   )za not in ["a","b","c"]rI   )za in [None, 1, None]rL   )za not in [(1, 2), 3, 4]rM   r4   r5   r=   Ú
BUILD_LISTrD   rE   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 ]8\}}t|d
dƒ}|  |d¡ |  |d|¡ |  |¡ qJdd„ }dd„ }|  |dƒ¡ |  |dƒ ¡ |  |¡ |  |dƒ ¡ |  |dƒ¡ |  |¡ d S )Nza in {1,2,3}¾   r   r(   rH   za not in {"a","b","c"}>   r   rJ   rK   za in {None, 1, None}r   za not in {(1, 2), 3, 4}>   rN   rH   rO   za in {1, 2, 3, 3, 2, 1}r4   r5   Z	BUILD_SETr=   c                 S   s   | dv S ©Nr`   r   ©rJ   r   r   r   r   Ä   s    z:TestTranforms.test_folding_of_sets_of_constants.<locals>.fc                 S   s   | dvS ra   r   rb   r   r   r   r;   Ç   s    z:TestTranforms.test_folding_of_sets_of_constants.<locals>.grH   rO   )Ú	frozensetr6   r/   r0   r'   Ú
assertTrue)r   r7   r?   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 ]N\}}t |ddƒ}|  |d|¡ t |¡D ]}|  |j d¡¡ q0|  |¡ 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+4rW   )z"@"*4z@@@@)za="abc" + "def"Zabcdef)za = 3**4éQ   )za = 3*4é   )z	a = 13//4rH   )za = 14%4r(   )za = 2+3rS   )za = 13-4rW   )za = (12,13)[1]é   )za = 13 << 2é4   )za = 13 >> 2rH   )z
a = 13 & 7rS   )z
a = 13 ^ 7é
   )z
a = 13 | 7é   r4   r5   r=   ÚBINARY_za=2+"b"r(   rK   za="x"*10000rP   r*   z	a=1<<1000iè  r   z	a=2**1000)
r6   r0   r   r   ÚassertFalser   Ú
startswithr'   ZassertNotInr
   )r   r7   r?   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]r4   r5   r=   r   ZBINARY_SUBSCRu	   "aï¿¿"[1]u   ï¿¿u	   "ð’…"[0]u   ð’…z	"fuu"[10]rD   )r   r   r   r   r   Útest_binary_subscr_on_unicodeÿ   s    


z+TestTranforms.test_binary_subscr_on_unicodec                 C   sÌ   dD ]N\}}t |ddƒ}|  |d|¡ t |¡D ]}|  |j d¡¡ q0|  |¡ qdd„ }t |¡D ]}|  |j d¡¡ qf|  |¡ dD ]:\}}}t |ddƒ}|  |d|¡ |  ||¡ |  |¡ qŒd S )	N))z-0.5g      à¿)z-0.0ç       €)z
-(1.0-1.0)rq   )z-0r   )z~-2r   )z+1r   r4   r5   r=   ÚUNARY_c                   S   s   dS )Nrq   r   r   r   r   r   Únegzero&  s    zDTestTranforms.test_folding_of_unaryops_on_constants.<locals>.negzero))z-"abc"ÚabcZUNARY_NEGATIVE)z~"abc"rt   ZUNARY_INVERT)r6   r0   r   r   rm   r   rn   r'   )r   r7   r?   r   r   rs   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  s    z/TestTranforms.test_elim_extra_return.<locals>.fr=   c                 S   s   g | ]}|j d kr|‘qS ©r   rQ   r   r   r   r   rR   <  s   
ÿz8TestTranforms.test_elim_extra_return.<locals>.<listcomp>r   )r/   r   r   r\   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   s   g | ]}|j d kr|‘qS rv   rQ   r   r   r   r   rR   J  s   
ÿz:TestTranforms.test_elim_jump_to_return.<locals>.<listcomp>r(   )r   r/   r   r   r\   r&   r'   rw   r   r   r   Útest_elim_jump_to_returnA  s    
z&TestTranforms.test_elim_jump_to_returnc                 C   s    dd„ }|   |¡ |  |¡ d S )Nc                   S   s   t rtstrtƒ  ntƒ  d S r:   )rJ   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   s    dd„ }|   |¡ |  |¡ d S )Nc                  S   s   | rt str tƒ } q d S r:   )r   r|   r}   rb   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   rI   r   r   r   r   j  s    ÿz7TestTranforms.test_elim_jump_to_uncond_jump3.<locals>.fZJUMP_IF_FALSE_OR_POPr(   c                 S   s   | p
|p
|S r:   r   rI   r   r   r   r   q  s    ÿZJUMP_IF_TRUE_OR_POPc                 S   s   | r|p
|S r:   r   rI   r   r   r   r   x  s    ÿr,   c                 S   s   | s|o
|S r:   r   rI   r   r   r   r     s    ÿr-   )r   r'   r\   r   r/   r0   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 | rdS dS )Nr   r(   rH   rO   rS   rT   r   ©Zcond1Zcond2r   r   r   r   Œ  s    z5TestTranforms.test_elim_jump_after_return1.<locals>.fr   r   c                 S   s   g | ]}|j d kr|‘qS rv   rQ   r   r   r   r   rR   —  s   
ÿz>TestTranforms.test_elim_jump_after_return1.<locals>.<listcomp>rT   )r/   r   r   ÚassertLessEqualr&   r'   rw   r   r   r   Útest_elim_jump_after_return1Š  s    	z*TestTranforms.test_elim_jump_after_return1c                 C   sj   dd„ }|   |d¡ dd„ t |¡D ƒ}|  t|ƒd¡ dd„ t |¡D ƒ}|  t|ƒd¡ |  |¡ d S )	Nc                 S   s   | r dS q d S )NrO   r   rƒ   r   r   r   r   ž  s    z5TestTranforms.test_elim_jump_after_return2.<locals>.fr   c                 S   s   g | ]}|j d kr|‘qS rA   rQ   r   r   r   r   rR   £  s   
ÿz>TestTranforms.test_elim_jump_after_return2.<locals>.<listcomp>r   c                 S   s   g | ]}|j d kr|‘qS rv   rQ   r   r   r   r   rR   ¦  s   
ÿr(   )r/   r   r   r\   r&   r„   r'   rw   r   r   r   Útest_elim_jump_after_return2œ  s    z*TestTranforms.test_elim_jump_after_return2c                 C   s"   dd„ }|   |d¡ |  |¡ d S )Nc                  S   s   ddœdd„} | S )Nr(   )Úreturnc                   S   s   d S r:   r   r   r   r   r   r;   ­  s    zBTestTranforms.test_make_function_doesnt_bail.<locals>.f.<locals>.gr   )r;   r   r   r   r   ¬  s    z7TestTranforms.test_make_function_doesnt_bail.<locals>.fZ
BINARY_ADD)r/   r'   r   r   r   r   Útest_make_function_doesnt_bail«  s    z,TestTranforms.test_make_function_doesnt_bailc                 C   sr   g d¢}|D ]`}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}r4   r5   rr   rl   ZBUILD_)r6   r   r   rm   r   rn   r'   )r   ZexprsÚer   r   r   r   r   Útest_constant_folding³  s    z#TestTranforms.test_constant_foldingc                 C   s(   dd„ }|   t|dƒd¡ |  |¡ d S )Nc                   S   s   t ttfv S r:   )r*   rJ   rK   r   r   r   r   ÚcontaintestÉ  s    z7TestTranforms.test_in_literal_list.<locals>.containtestr^   r   ©r\   r   r'   )r   r‹   r   r   r   Útest_in_literal_listÈ  s    z"TestTranforms.test_in_literal_listc                 C   s(   dd„ }|   t|dƒd¡ |  |¡ d S )Nc                  S   s   t tfD ]} qd S r:   )rJ   rK   r)   r   r   r   ÚforloopÏ  s    z8TestTranforms.test_iterate_literal_list.<locals>.forloopr^   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drdS dS )NTFr   r   r   r   r   r   r   r   Ö  s    z=TestTranforms.test_condition_with_binop_with_bools.<locals>.fr   )r\   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ndrdS dS )NTFr   r)   r   r   r   r   ß  s    
z3TestTranforms.test_if_with_if_expression.<locals>.fT)rd   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 dS )NrH   rS   rT   r   r)   r   r   r   r   ê  s    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   s   dd„ t D ƒS )Nc                 S   s   g | ]}t |ƒ}|‘qS r   ©r   ©r   r*   Úyr   r   r   rR   ô  r   z[TestTranforms.test_assignment_idiom_in_comprehensions.<locals>.listcomp.<locals>.<listcomp>rb   r   r   r   r   Úlistcompó  s    zGTestTranforms.test_assignment_idiom_in_comprehensions.<locals>.listcompZFOR_ITERr   c                   S   s   dd„ t D ƒS )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>rb   r   r   r   r   Úsetcompö  s    zFTestTranforms.test_assignment_idiom_in_comprehensions.<locals>.setcompc                   S   s   dd„ t D ƒS )Nc                 S   s   i | ]}t |ƒ}||“qS r   r“   r”   r   r   r   r   ú  r   z[TestTranforms.test_assignment_idiom_in_comprehensions.<locals>.dictcomp.<locals>.<dictcomp>rb   r   r   r   r   Údictcompù  s    zGTestTranforms.test_assignment_idiom_in_comprehensions.<locals>.dictcompc                   S   s   dd„ t D ƒS )Nc                 s   s   | ]}t |ƒ}|V  qd S r:   r“   r”   r   r   r   r#   ý  r   zYTestTranforms.test_assignment_idiom_in_comprehensions.<locals>.genexpr.<locals>.<genexpr>rb   r   r   r   r   Úgenexprü  s    zFTestTranforms.test_assignment_idiom_in_comprehensions.<locals>.genexpr)r\   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'   r1   r9   r@   rB   rF   r]   r_   re   ro   rp   ru   ry   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S )ÚTestBugletsc                 C   s<   dd„ }|   t¡ |ƒ  W d   ƒ n1 s.0    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   s2   t dƒD ]$}zt‚W q tpty*   Y q0 qd S )Nrj   )r[   Ú	Exception)r   Úir   r   r   Útest_bpo_42057  s
    zTestBuglets.test_bpo_42057N)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      p