a
    ze                  t   @   s  d dl mZ d dlmZ d dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
dd Ze jjZG dd dZdejjjd	 f Zd
Zdejjjd f Zdejjjd f Zdejjeejjeejjef Zdd Zdejjd	 ejjd f ZdZdd Zdejjd	 ejjd ejjd	 ejjd f Zg fddZ de jjd	 e!e jjd	 e jjd e jjd	 e jjd f Z"dZ#dZ$dZ%dZ&dZ'dZ(d Z)d!Z*d"Z+d#Z,d$Z-d%ejd	 ejd ejd ejd& ejd' f Z.d(d) Z/d*e/jjd	 f Z0d+d, Z1d-d. Z2d/e1jjd	 e1jjd e1jjd& e1jjd e1jjd& f Z3d0e2jjd	 e2jjd e2jjd& e2jjd e2jjd& f Z4d1d2 Z5d3d4 Z6d5d6 Z7d7d8 Z8d9e8jjd	 e!e8jjd	 e8jjd& f Z9d:e9e!e8jjd	 e8jjd e!e8jjd f Z:d;e:e!e8jjd e8jjd f Z;G d<d= d=ej<Z=G d>d? d?e=Z>d@ej?j@dk r<dAndB ZAeBd4g dDdEdFZCdGZDeCjEjjFd	 ZGdHZHdIZIdJZJdKZKdLdM ZLdNZMG dOdP dPej<ZNd5dQdRZOdSdT ZPd	ZQeOjjd	 ZReOjjFd ZSeSjeR ZTeSjFd ZUeUjeR ZVd	ZWejXZXeXdUdVdWdXdYd ddZd[eXd\d]d d^d^dddZd[eXd\d]d	d_d_d&ddZd[eXd`dadddbdcddZd[eXdUdVdeSeYeSdWddZd[eXdUdVd&dddedfddZd[eXdgdhdididjdkddZd[eXdldmddndndoddZd[eXdpdqd drdrdsdtdZd[eXdudvd d^d^dwddZd[eXdudvd	d_d_dxddZd[eXdUdVd'dbdydzddZd[eXdUdVdcd	d{d|ddZd[eXd}d~d d dbdddZd[eXddd d dbdddZd[eXdUdVdtdddddZd[eXdddtdtdbdddZd[eXdd	dddbdddZd[eXddddndnddWdZd[eXdddddbdddZd[gZZeXdUdVd'ddd ddZd[eXd\d]dd^d^dddZd[eXd\d]dd_d_d&ddZd[eXd\d]d dddcddZd[eXd\d]d	dddWddZd[eXd`dad&d&dbdfddZd[eXdUdVdeUeYeUdkddZd[eXdUdVd&dddoddZd[eXdgdhdididjdsddZd[eXdldmddddwddZd[eXdpdqd drdrdxd'dZd[eXdudvdd^d^dzddZd[eXdudvdd_d_d|ddZd[eXdudvd dddddZd[eXdudvd	dddddZd[eXddd&d&dbdddZd[eXdd	dddbdddZd[eXdddddddcdZd[eXdddddbdddZd[gZ[eXdpdqd drdrd d&dZd[eXdudvd d^d^dddZd[eXdudvd	d_d_d&ddZd[eXdudvddddcddZd[eXdudvddddWddZd[eXddd dddfddZd[eXddd	dndndkddZd[eXdddcdcdbdoddZd[eXdd	dddbdsddZd[eXdUdVd dddwddZd[eXdddddbdxddZd[gZ\eXdpdqd ddd ddZd[eXdUdVd	dfddddZd[eXddd	d	dbd&ddZd[eXdddddbdcddZd[eXddddddWddCd[eXdldmd dddfddZd[eXdpdqd	drdrdkd&dZd[eXddd dddoddZd[eXddd	d	dbdsddZd[eXdd	dddbdwddZd[eXddd dddxd'dZd[eXdUdVdd&ddzddZd[eXddd ddd|ddZd[eXdddddbdddZd[eXdddWdWdbddcdZd[eXddd ddddtdCd[eXdUdVddcddddZd[eXddd&dddddZd[eXdddWdWdbdddZd[eXdd	dddbddWdZd[eXdddddbdddZd[eXdddWdWdbdddZd[eXdpdqd	drdrddfdCd[eXdUdVd&dddddZd[eXddd	d	dbdddZd[eXdd	dddbdddZd[eXddd dddddCd[eXdddddbdddZd[eXdpdqd	drdrddkdZd[eXddd dddddZd[eXddd	d	dbdddZd[eXdd	dddbdddZd[eXddd dddddZd[eXdUdVd'd	d{dddZd[eXdddddbdddZd[eXdldmd dddddZd[eXddd ddddodZd[eXdUdVddcddddZd[eXddd&dddddZd[eXdddddbdddZd[eXdddddbdddZd[eXddd ddddsdCd[eXdUdVdd&ddddZd[eXddd dddddZd[eXdddddbdddZd[eXdddadadbdddZd[eXdddddbdddZd[eXdpdqd	drdrdddCd[eXdUdVdcdddddZd[eXddd	d	dbdddZd[eXdd	dddbdVddZd[eXddddddadxdCd[eXdddkdddddZd[eXdUdVd'd	d{dddZd[eXdUdVdtd ddddZd[eXdddddbdddZd[eXdd	dddbdddZd[eXdddddbdddZd[eXddddddqddZd[eXdd&dddbddzdCd[eXdpdqddddddZd[eXdddddbdddZd[eXdd	dddbdddZd[eXdd	dddbdddZd[eXdd	dddbdddZd[eXdpdqd	drdrdddZd[eXdUdVdWdddhddZd[eXddd	d	dbdddZd[eXdd	dddbdvddZd[eXdddddbdddZd[eXddddddddZd[eXdddddbdddCd[eXddd dddddCd[eXddd|ddd ddZd[eXdldmd	dddddZd[eXdpdqd	drdrdddZd[eXdUdVdidddddZd[eXddd	d	dbdddZd[eXdd	dddbdddZd[eXdddddbd	ddZd[eXdUdVd ddd
ddZd[eXdd&dddbdddZd[eXdd&dddbdddZd[eXdddddbdddZd[eXdd	dddbdddZd[eXdddsdddddZd[eXdddddbdddCd[eXdddddbdddZd[eXdddddbdddZd[eXdd	dddbdddCd[eXdd	dddbdddZd[eXdd	dddbdddZd[eXdddddbdddZd[eXdd	dddbdddZd[eXdddddbdddCd[eXdpdqd	drdrdddZd[eXdUdVdfdddddZd[eXddd	d	dbdddZd[eXdd	dddbd ddZd[eXdddfd!d"d#ddZd[eXdpdqd	drdrdddCd[eXdUdVdfddd$ddZd[eXddd	d	dbd%ddZd[eXdd	dddbd&ddZd[eXdddddbd'ddZd[eXdUdVd ddd!ddCd[eXdddddbd(ddZd[gkZ]d)d* Z^eXdUdVd ddd e^jjdZd[eXdddddbdddZd[gZ_G d+d, d,eZ`G d-d. d.ej<ZaG d/d0 d0ej<ZbG d1d2 d2ebZced3kred  dS (6      )captured_stdout)BytecodeTestCaseNc                  C   s    dd } |  }|j r|j }q|S )Nc               
   S   s<   zdd  W n* t y6 }  z| j}W Y d } ~ n
d } ~ 0 0 |S N   r   )	Exception__traceback__)etb r
   #/usr/lib/python3.9/test/test_dis.py_error   s
    zget_tb.<locals>._error)tb_next)r   r	   r
   r
   r   get_tb   s
    r   c                   @   s,   e Zd Zdd Zedd Zedd ZdS )_Cc                 C   s   |dk| _ d S Nr   x)selfr   r
   r
   r   __init__   s    z_C.__init__c                 C   s   | dk} d S r   r
   r   r
   r
   r   sm    s    z_C.smc                 C   s   |dk| _ d S r   r   )clsr   r
   r
   r   cm$   s    z_C.cmN)__name__
__module____qualname__r   staticmethodr   classmethodr   r
   r
   r
   r   r      s
   
r   a>  %3d           0 LOAD_FAST                1 (x)
              2 LOAD_CONST               1 (1)
              4 COMPARE_OP               2 (==)
              6 LOAD_FAST                0 (self)
              8 STORE_ATTR               0 (x)
             10 LOAD_CONST               0 (None)
             12 RETURN_VALUE
r   a            0 LOAD_FAST                1 (1)
          2 LOAD_CONST               1 (1)
          4 COMPARE_OP               2 (==)
          6 LOAD_FAST                0 (0)
          8 STORE_ATTR               0 (0)
         10 LOAD_CONST               0 (0)
         12 RETURN_VALUE
a=  %3d           0 LOAD_FAST                1 (x)
              2 LOAD_CONST               1 (1)
              4 COMPARE_OP               2 (==)
              6 LOAD_FAST                0 (cls)
              8 STORE_ATTR               0 (x)
             10 LOAD_CONST               0 (None)
             12 RETURN_VALUE
   a  %3d           0 LOAD_FAST                0 (x)
              2 LOAD_CONST               1 (1)
              4 COMPARE_OP               2 (==)
              6 STORE_FAST               0 (x)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
zBDisassembly of %s:
%s
Disassembly of %s:
%s
Disassembly of %s:
%s
c                 C   s   t |  dS r   print)ar
   r
   r   _f[   s    r!   z%3d           0 LOAD_GLOBAL              0 (print)
              2 LOAD_FAST                0 (a)
              4 CALL_FUNCTION            1
              6 POP_TOP

%3d           8 LOAD_CONST               1 (1)
             10 RETURN_VALUE
z          0 LOAD_GLOBAL              0 (0)
          2 LOAD_FAST                0 (0)
          4 CALL_FUNCTION            1
          6 POP_TOP
          8 LOAD_CONST               1 (1)
         10 RETURN_VALUE
c                  C   s   t ddD ]} q
d S )Nr   
   )range)resr
   r
   r   	bug708901u   s    r%   a  %3d           0 LOAD_GLOBAL              0 (range)
              2 LOAD_CONST               1 (1)

%3d           4 LOAD_CONST               2 (10)

%3d           6 CALL_FUNCTION            2
              8 GET_ITER
        >>   10 FOR_ITER                 4 (to 16)
             12 STORE_FAST               0 (res)

%3d          14 JUMP_ABSOLUTE           10
        >>   16 LOAD_CONST               0 (None)
             18 RETURN_VALUE
   c                 C   s   d S Nr
   r   r
   r
   r   
bug1333982   s    r(   a  %3d           0 LOAD_CONST               1 (0)
              2 POP_JUMP_IF_TRUE        26
              4 LOAD_ASSERTION_ERROR
              6 LOAD_CONST               2 (<code object <listcomp> at 0x..., file "%s", line %d>)
              8 LOAD_CONST               3 ('bug1333982.<locals>.<listcomp>')
             10 MAKE_FUNCTION            0
             12 LOAD_FAST                0 (x)
             14 GET_ITER
             16 CALL_FUNCTION            1

%3d          18 LOAD_CONST               4 (1)

%3d          20 BINARY_ADD
             22 CALL_FUNCTION            1
             24 RAISE_VARARGS            1

%3d     >>   26 LOAD_CONST               0 (None)
             28 RETURN_VALUE
z%3d           0 LOAD_GLOBAL              0 (spam)
              2 POP_TOP
              4 LOAD_CONST               0 (None)
              6 RETURN_VALUE
z%4d           0 LOAD_GLOBAL              0 (spam)
               2 POP_TOP
               4 LOAD_CONST               0 (None)
               6 RETURN_VALUE
zDisassembly of f:
  4           0 LOAD_CONST               0 (None)
              2 RETURN_VALUE

Disassembly of g:
  5           0 LOAD_CONST               0 (None)
              2 RETURN_VALUE

zx + 1z  1           0 LOAD_NAME                0 (x)
              2 LOAD_CONST               0 (1)
              4 BINARY_ADD
              6 RETURN_VALUE
	x = x + 1z  1           0 LOAD_NAME                0 (x)
              2 LOAD_CONST               0 (1)
              4 BINARY_ADD
              6 STORE_NAME               0 (x)
              8 LOAD_CONST               1 (None)
             10 RETURN_VALUE
z+
x: int = 1
y: fun(1)
lst[fun(0)]: int = 1
a    2           0 SETUP_ANNOTATIONS
              2 LOAD_CONST               0 (1)
              4 STORE_NAME               0 (x)
              6 LOAD_NAME                1 (int)
              8 LOAD_NAME                2 (__annotations__)
             10 LOAD_CONST               1 ('x')
             12 STORE_SUBSCR

  3          14 LOAD_NAME                3 (fun)
             16 LOAD_CONST               0 (1)
             18 CALL_FUNCTION            1
             20 LOAD_NAME                2 (__annotations__)
             22 LOAD_CONST               2 ('y')
             24 STORE_SUBSCR

  4          26 LOAD_CONST               0 (1)
             28 LOAD_NAME                4 (lst)
             30 LOAD_NAME                3 (fun)
             32 LOAD_CONST               3 (0)
             34 CALL_FUNCTION            1
             36 STORE_SUBSCR
             38 LOAD_NAME                1 (int)
             40 POP_TOP
             42 LOAD_CONST               4 (None)
             44 RETURN_VALUE
zx = 0
while 1:
    x += 1a    1           0 LOAD_CONST               0 (0)
              2 STORE_NAME               0 (x)

  3     >>    4 LOAD_NAME                0 (x)
              6 LOAD_CONST               1 (1)
              8 INPLACE_ADD
             10 STORE_NAME               0 (x)
             12 JUMP_ABSOLUTE            4
             14 LOAD_CONST               2 (None)
             16 RETURN_VALUE
a  %3d           0 SETUP_FINALLY           12 (to 14)

%3d           2 LOAD_CONST               1 (1)
              4 LOAD_CONST               2 (0)
    -->       6 BINARY_TRUE_DIVIDE
              8 POP_TOP
             10 POP_BLOCK
             12 JUMP_FORWARD            42 (to 56)

%3d     >>   14 DUP_TOP
             16 LOAD_GLOBAL              0 (Exception)
             18 JUMP_IF_NOT_EXC_MATCH    54
             20 POP_TOP
             22 STORE_FAST               0 (e)
             24 POP_TOP
             26 SETUP_FINALLY           18 (to 46)

%3d          28 LOAD_FAST                0 (e)
             30 LOAD_ATTR                1 (__traceback__)
             32 STORE_FAST               1 (tb)
             34 POP_BLOCK
             36 POP_EXCEPT
             38 LOAD_CONST               0 (None)
             40 STORE_FAST               0 (e)
             42 DELETE_FAST              0 (e)
             44 JUMP_FORWARD            10 (to 56)
        >>   46 LOAD_CONST               0 (None)
             48 STORE_FAST               0 (e)
             50 DELETE_FAST              0 (e)
             52 RERAISE
        >>   54 RERAISE

%3d     >>   56 LOAD_FAST                1 (tb)
             58 RETURN_VALUE
      c                 C   s   |  d|dd|d|dS )N 4r
   r    bcdr
   r
   r   _fstring:  s    r2   a  %3d           0 LOAD_FAST                0 (a)
              2 FORMAT_VALUE             0
              4 LOAD_CONST               1 (' ')
              6 LOAD_FAST                1 (b)
              8 LOAD_CONST               2 ('4')
             10 FORMAT_VALUE             4 (with format)
             12 LOAD_CONST               1 (' ')
             14 LOAD_FAST                2 (c)
             16 FORMAT_VALUE             2 (repr)
             18 LOAD_CONST               1 (' ')
             20 LOAD_FAST                3 (d)
             22 LOAD_CONST               2 ('4')
             24 FORMAT_VALUE             6 (repr, with format)
             26 BUILD_STRING             7
             28 RETURN_VALUE
c                 C   s   z| W |  S |  0 d S r'   r
   r    r/   r
   r
   r   _tryfinallyO  s
    r4   c                 C   s   zW |   dS |   0 d S r   r
   )r/   r
   r
   r   _tryfinallyconstU  s
    r5   a  %3d           0 SETUP_FINALLY           12 (to 14)

%3d           2 LOAD_FAST                0 (a)
              4 POP_BLOCK

%3d           6 LOAD_FAST                1 (b)
              8 CALL_FUNCTION            0
             10 POP_TOP

%3d          12 RETURN_VALUE

%3d     >>   14 LOAD_FAST                1 (b)
             16 CALL_FUNCTION            0
             18 POP_TOP
             20 RERAISE
             22 LOAD_CONST               0 (None)
             24 RETURN_VALUE
a  %3d           0 SETUP_FINALLY           12 (to 14)

%3d           2 POP_BLOCK

%3d           4 LOAD_FAST                0 (b)
              6 CALL_FUNCTION            0
              8 POP_TOP

%3d          10 LOAD_CONST               1 (1)
             12 RETURN_VALUE

%3d     >>   14 LOAD_FAST                0 (b)
             16 CALL_FUNCTION            0
             18 POP_TOP
             20 RERAISE
             22 LOAD_CONST               0 (None)
             24 RETURN_VALUE
c                 c   s
   | V  d S r'   r
   r   r
   r
   r   _g  s    r6   c                 C  s
   | V  d S r'   r
   r   r
   r
   r   _ag  s    r7   c                    s   t | 2 z3 d H W }q6 d S r'   )r7   )r   itemr
   r
   r   _co  s    r9   c                    s    fdd}|S )Nc                    s    fddD S )Zfuncdocc                    s   g | ]} | qS r
   r
   ).0zr   r
   r   
<listcomp>      z#_h.<locals>.foo.<locals>.<listcomp>r
   r   yr   r   foo  s    z_h.<locals>.foor
   )r?   r@   r
   r>   r   _h  s    rA   a  %3d           0 LOAD_CLOSURE             0 (y)
              2 BUILD_TUPLE              1
              4 LOAD_CONST               1 (<code object foo at 0x..., file "%s", line %d>)
              6 LOAD_CONST               2 ('_h.<locals>.foo')
              8 MAKE_FUNCTION            8 (closure)
             10 STORE_FAST               1 (foo)

%3d          12 LOAD_FAST                1 (foo)
             14 RETURN_VALUE
a  %s
Disassembly of <code object foo at 0x..., file "%s", line %d>:
%3d           0 LOAD_CLOSURE             0 (x)
              2 BUILD_TUPLE              1
              4 LOAD_CONST               1 (<code object <listcomp> at 0x..., file "%s", line %d>)
              6 LOAD_CONST               2 ('_h.<locals>.foo.<locals>.<listcomp>')
              8 MAKE_FUNCTION            8 (closure)
             10 LOAD_DEREF               1 (y)
             12 GET_ITER
             14 CALL_FUNCTION            1
             16 RETURN_VALUE
a  %s
Disassembly of <code object <listcomp> at 0x..., file "%s", line %d>:
%3d           0 BUILD_LIST               0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                12 (to 18)
              6 STORE_FAST               1 (z)
              8 LOAD_DEREF               0 (x)
             10 LOAD_FAST                1 (z)
             12 BINARY_ADD
             14 LIST_APPEND              2
             16 JUMP_ABSOLUTE            4
        >>   18 RETURN_VALUE
c                   @   s   e Zd ZdZd>ddZd?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d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z dS )@DisTestsNTc                 K   sf   t  }t|< |r,tj|fi | ntj||fi | W d    n1 sT0    Y  | S r'   )ioStringIO
contextlibredirect_stdoutdisdisassemblegetvaluer   funclastiwrapperkwargsoutputr
   r
   r   get_disassembly  s    2zDisTests.get_disassemblyc                 C   s   |  ||dS )NF)rQ   )r   rL   rM   r
   r
   r   get_disassemble_as_string  s    z"DisTests.get_disassemble_as_stringc                 C   s   t dd|S )Nz\b0x[0-9A-Fa-f]+\bz0x...)resub)r   textr
   r
   r   strip_addresses  s    zDisTests.strip_addressesc                 C   s0   | j |dd}||kr | |}| || d S )Nr   depth)rQ   rV   assertEqual)r   rL   expectedZgotr
   r
   r   do_disassembly_test  s    
zDisTests.do_disassembly_testc                 C   s>   |  tjd d | tjd tj | tjd tj d S )NZNOP	   
LOAD_CONST
STORE_NAME)rY   rH   opmapZassertInZhasconstZhasnamer   r
   r
   r   
test_opmap  s    zDisTests.test_opmapc                 C   s   |  tjtjd  d d S )N	LOAD_FAST)rY   rH   opnamer_   r`   r
   r
   r   test_opname  s    zDisTests.test_opnamec                 C   s,   |  tjd tj |  tjd tj d S )NEXTENDED_ARGr^   )rY   rH   r_   re   HAVE_ARGUMENTr`   r
   r
   r   test_boundaries  s    zDisTests.test_boundariesc              	   C   s|   t tjD ]l\}}|dv rq
| j|d> tj}|tjk rH|dtj 7 }| t|| W d    q
1 sl0    Y  q
d S )N)ZBUILD_MAP_UNPACK_WITH_CALLZBUILD_TUPLE_UNPACK_WITH_CALLJUMP_IF_NOT_EXC_MATCH)rc   r   )		enumeraterH   rc   subTestZ_OPNAME_WIDTHrf   Z_OPARG_WIDTHZassertLessEquallen)r   opcoderc   widthr
   r
   r   test_widths  s    
zDisTests.test_widthsc                 C   s   |  tt d S r'   )r[   r!   dis_fr`   r
   r
   r   test_dis  s    zDisTests.test_disc                 C   s   |  tt d S r'   )r[   r%   dis_bug708901r`   r
   r
   r   test_bug_708901  s    zDisTests.test_bug_708901c                 C   s   |  d | tt d S )Nzneed asserts, run without -O)ZskipTestr[   r(   dis_bug1333982r`   r
   r
   r   test_bug_1333982  s    
zDisTests.test_bug_1333982c                 C   s   dd }t ddD ] }t|d  }| ||| qt dddD ] }t|d  }| ||| q@t dddD ] }t|d  }| ||| qnd	d
lm} | |t d S )Nc                 S   s0   i }dd dg|  dg  }t|| |d S )Nzdef foo():
  z
 zspam
r@   joinexeccount	namespacerL   r
   r
   r   rL     s    
z'DisTests.test_big_linenos.<locals>.funcr   i,  r     r"   i  r   )
dis_module)r#   _BIG_LINENO_FORMATr[   _BIG_LINENO_FORMAT2testr}   dis_module_expected_results)r   rL   irZ   r}   r
   r
   r   test_big_linenos  s    zDisTests.test_big_linenosc                 C   sf   dd }dd }t ddD ]}| ||||d q| |d|dd | |d	|d	d d S )
Nc                 S   s.   i }dd dg|   d }t|| |d S )Nzdef foo(x):
 ;r)   z

 return xr@   rv   ry   r
   r
   r   rL   ,  s    
z'DisTests.test_big_offsets.<locals>.funcc                    sZ    fddt | D }|d d|   d|  d f g7 }d|d dd   |d< d	|S )
Nc                    s@   g | ]8}d  d|  d| d  d| d  d| d f qS )z           %*d LOAD_FAST                0 (x)
           %*d LOAD_CONST               1 (1)
           %*d BINARY_ADD
           %*d STORE_FAST               0 (x)
   r   r*      r
   )r:   r   wr
   r   r<   3  s   .z?DisTests.test_big_offsets.<locals>.expected.<locals>.<listcomp>zK
  3        %*d LOAD_FAST                0 (x)
           %*d RETURN_VALUE
r   r   z  2r   r&   ru   )r#   rw   )rz   r   sr
   r   r   rZ   2  s    
z+DisTests.test_big_offsets.<locals>.expectedr   r+   r*   i  i  )r#   r[   )r   rL   rZ   r   r
   r
   r   test_big_offsets+  s    zDisTests.test_big_offsetsc                 C   s4   |  tt |  tt |  tt |  tt d S r'   )	r[   expr_strdis_expr_strsimple_stmt_strdis_simple_stmt_strannot_stmt_strdis_annot_stmt_strcompound_stmt_strdis_compound_stmt_strr`   r
   r
   r   test_disassemble_strG  s    zDisTests.test_disassemble_strc                 C   s   |  tjjt d S r'   )r[   r!   __code__co_codedis_f_co_coder`   r
   r
   r   test_disassemble_bytesM  s    zDisTests.test_disassemble_bytesc                 C   s   |  tt d S r'   )r[   r   dis_cr`   r
   r
   r   test_disassemble_classP  s    zDisTests.test_disassemble_classc                 C   s   |  tdjt d S r   )r[   r   r   dis_c_instance_methodr`   r
   r
   r    test_disassemble_instance_methodS  s    z)DisTests.test_disassemble_instance_methodc                 C   s   t djjj}| |t d S r   )r   r   r   r   r[   dis_c_instance_method_bytes)r   Zmethod_bytecoder
   r
   r   &test_disassemble_instance_method_bytesV  s    z/DisTests.test_disassemble_instance_method_bytesc                 C   s   |  tjt d S r'   )r[   r   r   dis_c_static_methodr`   r
   r
   r   test_disassemble_static_methodZ  s    z'DisTests.test_disassemble_static_methodc                 C   s   |  tjt d S r'   )r[   r   r   dis_c_class_methodr`   r
   r
   r   test_disassemble_class_method]  s    z&DisTests.test_disassemble_class_methodc                 C   s(   |  t}|  td}| || d S r   )rQ   r6   rY   )r   Zgen_func_disasZ	gen_disasr
   r
   r   test_disassemble_generator`  s    
z#DisTests.test_disassemble_generatorc                 C   s(   |  t}|  td}| || d S r   )rQ   r7   rY   )r   Zagen_func_disasZ
agen_disasr
   r
   r    test_disassemble_async_generatore  s    
z)DisTests.test_disassemble_async_generatorc                 C   s4   |  t}td}|  |  |}| || d S r   )rQ   r9   closerY   )r   Zcoro_func_disascoroZ
coro_disasr
   r
   r   test_disassemble_coroutinej  s
    

z#DisTests.test_disassemble_coroutinec                 C   s   |  tt d S r'   )r[   r2   dis_fstringr`   r
   r
   r   test_disassemble_fstringq  s    z!DisTests.test_disassemble_fstringc                 C   s   |  tt |  tt d S r'   )r[   r4   dis_tryfinallyr5   dis_tryfinallyconstr`   r
   r
   r   test_disassemble_try_finallyt  s    z%DisTests.test_disassemble_try_finallyc                 C   s0   zt `W n ty   Y n0 | ttjd  d S r'   )syslast_tracebackAttributeErrorassertRaisesRuntimeErrorrH   r`   r
   r
   r   test_dis_nonex  s
    zDisTests.test_dis_nonec              
   C   s|   zt `W n ty   Y n0 zdd  W n0 tyX } z|j}|t _W Y d }~n
d }~0 0 | |jj|j}| 	d | d S r   )
r   r   r   r   r   rR   tb_framef_codetb_lastir[   )r   r   r	   Ztb_disr
   r
   r   test_dis_traceback  s    zDisTests.test_dis_tracebackc                 C   s   |  ttjt  d S r'   )r   	TypeErrorrH   objectr`   r
   r
   r   test_dis_object  s    zDisTests.test_dis_objectc                    sT    fdd}|t dd |tdd |tdd |tdd |td d |t d S )Nc                    s,    j tfi |} |} ||  d S r'   )rQ   rA   rV   rY   )rZ   rO   rH   r`   r
   r   check  s    
z2DisTests.test_disassemble_recursive.<locals>.checkr   rW   r   r   r&   )dis_nested_0dis_nested_1dis_nested_2)r   r   r
   r`   r   test_disassemble_recursive  s    z#DisTests.test_disassemble_recursive)rC   T)rC   )!r   r   r   maxDiffrQ   rR   rV   r[   ra   rd   rg   rn   rp   rr   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   rB     s<   


rB   c                   @   s   e Zd ZdddZdS )DisWithFileTestsrC   Tc                 K   sD   t  }|r$tj|fd|i| ntj||fd|i| | S )Nfile)rD   rE   rH   rI   rJ   rK   r
   r
   r   rQ     s
    z DisWithFileTests.get_disassemblyN)rC   Tr   r   r   rQ   r
   r
   r
   r   r     s   r   a7  Name:              code_info
Filename:          (.*)
Argument count:    1
Positional-only arguments: 0
Kw-only arguments: 0
Number of locals:  1
Stack size:        3
Flags:             OPTIMIZED, NEWLOCALS, NOFREE
Constants:
   0: %r
Names:
   0: _format_code_info
   1: _get_code_object
Variable names:
   0: x)z1Formatted details of methods, functions, or code.r'   T)r   c         
   	   /   s:   |f fdd	 |f	V  d S )Nc              
      s   t  | 	 d S r'   r   )r0   r    r/   r1   r   fr   r?   r;   r
   r   r     s    ztricky.<locals>.fr
   )
r    r/   r   r?   r;   r0   r1   r   argskwdsr
   r   r   tricky  s    r   a.  Name:              tricky
Filename:          (.*)
Argument count:    5
Positional-only arguments: 2
Kw-only arguments: 3
Number of locals:  10
Stack size:        9
Flags:             OPTIMIZED, NEWLOCALS, VARARGS, VARKEYWORDS, GENERATOR
Constants:
   0: None
   1: <code object f at (.*), file "(.*)", line (.*)>
   2: 'tricky.<locals>.f'
Variable names:
   0: a
   1: b
   2: x
   3: y
   4: z
   5: c
   6: d
   7: e
   8: args
   9: kwds
Cell variables:
   0: [abedfxyz]
   1: [abedfxyz]
   2: [abedfxyz]
   3: [abedfxyz]
   4: [abedfxyz]
   5: [abedfxyz]ap  Filename:          (.*)
Argument count:    1
Positional-only arguments: 0
Kw-only arguments: 0
Number of locals:  1
Stack size:        10
Flags:             OPTIMIZED, NEWLOCALS, NESTED
Constants:
   0: None
Names:
   0: print
Variable names:
   0: c
Free variables:
   0: [abedfxyz]
   1: [abedfxyz]
   2: [abedfxyz]
   3: [abedfxyz]
   4: [abedfxyz]
   5: [abedfxyz]zName:              <module>
Filename:          <disassembly>
Argument count:    0
Positional-only arguments: 0
Kw-only arguments: 0
Number of locals:  0
Stack size:        2
Flags:             NOFREE
Constants:
   0: 1
Names:
   0: xzName:              <module>
Filename:          <disassembly>
Argument count:    0
Positional-only arguments: 0
Kw-only arguments: 0
Number of locals:  0
Stack size:        2
Flags:             NOFREE
Constants:
   0: 1
   1: None
Names:
   0: xzName:              <module>
Filename:          <disassembly>
Argument count:    0
Positional-only arguments: 0
Kw-only arguments: 0
Number of locals:  0
Stack size:        2
Flags:             NOFREE
Constants:
   0: 0
   1: 1
   2: None
Names:
   0: xc               	      sZ   dI d H  t 2 z3 d H W } q6 t4 I d H }W d   I d H  qV1 I d H sL0    Y  d S r   )r/   r0   )r    r1   r
   r
   r   	async_def+  s    
r   a5  Name:              async_def
Filename:          (.*)
Argument count:    0
Positional-only arguments: 0
Kw-only arguments: 0
Number of locals:  2
Stack size:        9
Flags:             OPTIMIZED, NEWLOCALS, NOFREE, COROUTINE
Constants:
   0: None
   1: 1
Names:
   0: b
   1: c
Variable names:
   0: a
   1: dc                   @   s\   e Zd Zejefeefee	fe
efeefeefeefgZdd Zdd Zdd Zdd Zd	S )
CodeInfoTestsc                 C   s,   d| _ | jD ]\}}| t|| qd S Nr|   )r   
test_pairsassertRegexrH   	code_info)r   r   rZ   r
   r
   r   test_code_infoN  s    zCodeInfoTests.test_code_infoc              	   C   s   d| _ | jD ]r\}}t }t| W d    n1 s:0    Y  | | |d  t }tj||d | | | qd S )Nr|   
r   )	r   r   r   rH   Z	show_coder   rJ   rD   rE   )r   r   rZ   rP   r
   r
   r   test_show_codeS  s    (zCodeInfoTests.test_show_codec                 C   s   |  ttjt  d S r'   )r   r   rH   r   r   r`   r
   r
   r   test_code_info_object]  s    z#CodeInfoTests.test_code_info_objectc                 C   s   |  tdd d S )Nr   Z0x0)rY   rH   Zpretty_flagsr`   r
   r
   r   test_pretty_flags_no_flags`  s    z(CodeInfoTests.test_pretty_flags_no_flagsN)r   r   r   rH   r   code_info_code_infor   code_info_trickyco_tricky_nested_fcode_info_tricky_nested_fr   code_info_expr_strr   code_info_simple_stmt_strr   code_info_compound_stmt_strr   code_info_async_defr   r   r   r   r   r
   r
   r
   r   r   C  s   

r   c                    s(   d fdd	}t  ddg i d |S )	Nr&   r*   c                    s&   d fdd	}t   |S )Nr+   r   c                    s   t  | | d S r'   r   )r   r   r.   r
   r   innerh  s    outer.<locals>.f.<locals>.inner)r+   r   r   )r0   r1   r   r3   )r0   r1   r   r   g  s    outer.<locals>.fru   r   Hello world!)r&   r*   r   )r    r/   r   r
   r3   r   outerf  s    r   c                  C   s   t dD ]"} t|  | dk rq| dkr q4qtd | r^t|  | d8 } | dkrRq4| dk r4qfq4td z`zdd  W n ty   td Y n.0 | }td	 W d    n1 s0    Y  W td
 n
td
 0 d S )Nr"   r*   r   I can haz else clause?r   %Who let lolcatz into this test suite?r   %Here we go, here we go, here we go...Never reach thisOK, now we're done)r#   r   ZeroDivisionError)r   dodgyr
   r
   r   jumpyo  s,    (r   r]   d   r   )r&   r*   z(3, 4)F)rc   rl   argZargvalZargreproffsetZstarts_lineZis_jump_targetZLOAD_CLOSURE   r    r/   ZBUILD_TUPLEf   ru   r   r   z'outer.<locals>.f'r"   ZMAKE_FUNCTION   r\   zdefaults, closure   Z
STORE_FAST}   r      ZLOAD_GLOBALt   r         Z
LOAD_DEREF         z''   1   Z
BUILD_LISTg      Z	BUILD_MAPi      r   z'Hello world!'   ZCALL_FUNCTION       ZPOP_TOP"   rb   |   $   ZRETURN_VALUES   &   )r+   r   z(5, 6)r0   r1   r   z!'outer.<locals>.f.<locals>.inner'r   r   Noner#   Z10ZGET_ITERD   ZFOR_ITER]   ,   zto 44r   r-   Z
COMPARE_OPk   <ZPOP_JUMP_IF_FALSEr   ZJUMP_ABSOLUTEq   6>4   (   *   r   z'I can haz else clause?'.   0   2      ^   6   8   :   <   >   @      B   ZINPLACE_SUBTRACTF   H   J   L   R   N   P      T   V   X   Z      \      r   z''Who let lolcatz into this test suite?'`   b   ZSETUP_FINALLYz      zto 200v   zto 118h   j      0l   ZBINARY_TRUE_DIVIDE   n   p   Z	POP_BLOCKW   ZJUMP_FORWARD   zto 144ZDUP_TOPr   x   rh   y      ~            r   z''Here we go, here we go, here we go...'   Z
POP_EXCEPTY         zto 188   ZRERAISE   Z
SETUP_WITH      zto 172   r         r   z'Never reach this'                              ZWITH_EXCEPT_START1   ZPOP_JUMP_IF_TRUEs                           r   z"OK, now we're done"            zto 210                  c                   C   s   d S r'   r
   r
   r
   r
   r   simpleS  r=   rn  c                       sL   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )InstructionTestsc                    s   t  j|  d | _d S r'   )superr   r   )r   r   	__class__r
   r   r   \  s    zInstructionTests.__init__c                 C   s   t t}| t|t d S r'   rH   get_instructionsrn  rY   listexpected_opinfo_simpler   actualr
   r
   r   test_default_first_line`  s    
z(InstructionTests.test_default_first_linec                 C   s"   t jtd d}| t|t d S NZ
first_liners  rw  r
   r
   r   test_first_line_set_to_Noned  s    z,InstructionTests.test_first_line_set_to_Nonec                 C   s"   t jttd}| t|t d S rz  )rH   rt  r   expected_outer_linerY   ru  expected_opinfo_outerrw  r
   r
   r   
test_outerh  s    zInstructionTests.test_outerc                 C   sN   t   t }W d    n1 s"0    Y  tj|td}| t|t d S rz  )r   r   rH   rt  expected_f_linerY   ru  expected_opinfo_f)r   r   rx  r
   r
   r   test_nestedl  s    $zInstructionTests.test_nestedc                 C   sP   t   t  }W d    n1 s$0    Y  tj|td}| t|t d S rz  )r   r   rH   rt  expected_inner_linerY   ru  expected_opinfo_inner)r   r   rx  r
   r
   r   test_doubly_nestedr  s    &z#InstructionTests.test_doubly_nestedc                 C   s"   t jttd}| t|t d S rz  )rH   rt  r   expected_jumpy_linerY   ru  expected_opinfo_jumpyrw  r
   r
   r   
test_jumpyx  s    zInstructionTests.test_jumpy)r   r   r   r   ry  r|  r  r  r  r  __classcell__r
   r
   rq  r   ro  Z  s   ro  c                   @   sL   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S )BytecodeTestsc              	   C   sv   t tdjdt jfD ]J}| j|d* t|}| |jt	j
 W d    q1 sT0    Y  q| ttjt  d S Nr   za=1)obj)r!   r   r   r   rj   rH   BytecodeZassertIsInstanceZcodeobjtypesCodeTyper   r   r   )r   r  r/   r
   r
   r   test_instantiation  s
    
0z BytecodeTests.test_instantiationc              	   C   sr   t tdjdt jfD ]X}| j|d8 tt|}tt|}| 	|| W d    q1 sb0    Y  qd S r  )
r!   r   r   r   rj   ru  rH   r  rt  rY   )r   r  Z
via_objectZvia_generatorr
   r
   r   test_iteration  s
    zBytecodeTests.test_iterationc                 C   s"   t jttd}| t|t d S rz  )rH   r  r   r}  rY   ru  r~  rw  r
   r
   r   test_explicit_first_line  s    z&BytecodeTests.test_explicit_first_linec                 C   sl   t t  }| dd }ttjj}| || t jtdd  }| dd }| |d d S )Nr,   r   i^  r{  Z350)	rH   r  rn  strip	partitionstrr   co_firstlinenorY   )r   rx  rZ   r
   r
   r   test_source_line_in_disassembly  s    z-BytecodeTests.test_source_line_in_disassemblyc                 C   s4   d| _ tjD ]"\}}t|}| | | qd S r   )r   r   r   rH   r  r   info)r   r   rZ   r/   r
   r
   r   	test_info  s    
zBytecodeTests.test_infoc                 C   s   t t  }| |t d S r'   )rH   r  r!   rY   ro   rw  r
   r
   r   test_disassembled  s    zBytecodeTests.test_disassembledc                 C   s4   t  }tj|}|jr |j}q| |j|j d S r'   )r   rH   r  from_tracebackr   rY   Zcurrent_offsetr   r   r	   r/   r
   r
   r   test_from_traceback  s    z!BytecodeTests.test_from_tracebackc                 C   s&   t  }tj|}| | t d S r'   )r   rH   r  r  rY   dis_tracebackr  r
   r
   r   test_from_traceback_dis  s    z%BytecodeTests.test_from_traceback_disN)r   r   r   r  r  r  r  r  r  r  r  r
   r
   r
   r   r  ~  s   	r  c                       sB   e Zd Zdd fddZdd Zdd Zd	d
 Zdd Z  ZS )TestDisTracebackN)returnc                    s&   zt `W n ty   Y n0 t  S r'   )r   r   r   rp  setUpr`   rq  r
   r   r    s
    zTestDisTraceback.setUpc                 C   sD   t  }t| t| W d    n1 s20    Y  | S r'   rD   rE   rF   rG   rH   distbrJ   r   r	   rP   r
   r
   r   rQ     s    (z TestDisTraceback.get_disassemblyc                 C   s6   |  t t  W d    n1 s(0    Y  d S r'   )r   r   rH   r  r`   r
   r
   r   test_distb_empty  s    z!TestDisTraceback.test_distb_emptyc                 C   s"   t  }|t_| | d t d S r'   )r   r   r   rY   rQ   r  r   r	   r
   r
   r   test_distb_last_traceback  s    z*TestDisTraceback.test_distb_last_tracebackc                 C   s   t  }| | |t d S r'   )r   rY   rQ   r  r  r
   r
   r   test_distb_explicit_arg  s    z(TestDisTraceback.test_distb_explicit_arg)	r   r   r   r  rQ   r  r  r  r  r
   r
   rq  r   r    s
   r  c                   @   s   e Zd Zdd ZdS )TestDisTracebackWithFilec                 C   sH   t  }t| tj||d W d    n1 s60    Y  | S )Nr   r  r  r
   r
   r   rQ     s    ,z(TestDisTracebackWithFile.get_disassemblyNr   r
   r
   r
   r   r    s   r  __main__)T)r   r   )eZtest.supportr   Ztest.support.bytecode_helperr   Zunittestr   rH   rD   rS   r  rF   r   r   r   ZTRACEBACK_CODEr   r   r   r  r   r   r   r   r   r   r   r   r!   ro   r   r%   rq   r(   __file__rs   r~   r   r   r   r   r   r   r   r   r   r   r  r2   r   r4   r5   r   r   r6   r7   r9   rA   r   r   r   ZTestCaserB   r   flagsoptimizer   r   r   r   __func__	co_constsr   r   r   r   r   r   r   r   r   r   r}  Z_line_offsetZcode_object_fr  Zcode_object_innerr  r  ZInstructionreprr~  r  r  r  rn  rv  ro  r  r  r  mainr
   r
   r
   r   <module>   s  
















	#)


















 M
!#	


 o$8	