
    Ge4              
       Z   d dl mZ d dl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
mZmZ d dlmZ d dlmZmZ dZ G d d	e      Z ed
d      Zd Zer e       ZeefdZ G d de      Z G d de      Zdddddddddd	Zej8                  dd dk\  Zej8                  dd dk\  ZdeefdZy)    )
namedtupleN)partial)InstrLabel)	pydev_log_pydev_stop_at_break_pydev_needs_stop_at_breakFc                   *    e Zd Zd ZddZddZddZy)DebugHelperc                 .   t         j                  j                  t         j                  j                  t              d      | _        	 t        j                  | j
                         t        t        t        j                  d            | _        y #  Y -xY w)N
debug_infor   )ospathjoindirname__file__
_debug_dirmakedirsr   next	itertoolscount_next)selfs    K/usr/lib/python3/dist-packages/_pydevd_frame_eval/pydevd_modify_bytecode.py__init__zDebugHelper.__init__   s]    '',,rwwx'@,O	KK( T9??1#56
	s   B BNc                     || j                         }d|z  }nd|z  }t        j                  j                  | j                  ||z         }||fS )Nz%03d_before.txtz%03d_change.txt)r   r   r   r   r   )r   	op_numberprefixnamefilenames        r   _get_filenamezDebugHelper._get_filename   sN    

I$y0D$y0D77<<$?""    c                     | j                  ||      \  }}t        |d      5 }t        j                  ||d       d d d        |S # 1 sw Y   |S xY w)NwT)streamlineno)r"   openbytecodedump_bytecode)r   br   r   r!   r&   s         r   write_bytecodezDebugHelper.write_bytecode$   sV    "00FC)(C  	BF""1VDA	B	Bs   AAc                 B   | j                  ||      \  }}t        |d      5 }|j                  d       |j                  d       |j                  dt        |      z         |j                  d       t	        j                  ||       d d d        |S # 1 sw Y   |S xY w)Nr%   z	-------- zid(code_to_modify): %sz

)file)r"   r(   writeiddis)r   code_to_modifyr   r   r!   r&   s         r   	write_diszDebugHelper.write_dis*   s    "00FC)(C  	1FLL%LL%LL1B~4FFGLL GGN0	1 	1 s   A(BB)N )__name__
__module____qualname__r   r"   r,   r3    r#   r   r   r      s    7#r#   r   _CodeLineInfoz%line_to_offset, first_line, last_linec                     i }d }d }t        j                  |       D ]
  \  }}|||<    |rt        |      }t        |      }t	        |||      S N)r1   findlinestartsminmaxr9   )code_objline_to_offset
first_line	last_lineoffsetlines         r   _get_code_line_inforE   9   sa    NJI**84 &%t& (
'	Y??r#   c                     | dz
  }|dk  r| dz   }t               }t        d||       t        d| |       t        dd|       t        d||       t        d||      t        d| |      t        dd|      t        d|      t        d|       |g
S )	z
    This is the bytecode for something as:

        if _pydev_needs_stop_at_break():
            _pydev_stop_at_break()

    but with some special handling for lines.
       r   
LOAD_CONST)r'   CALL_FUNCTIONPOP_JUMP_IF_FALSEPOP_TOPNOP)r   r   )stop_at_liner	   r
   spurious_linelabels        r   get_instructions_to_addrP   K   s    " !1$M$q(GE 	l6|LlL>oq6!5> 	l0GlL?oq7i. 	eL)/ r#   c                       e Zd Zd Zd Zd Zy)_Nodec                 .    d | _         d | _        || _        y r;   )prevr   data)r   rU   s     r   r   z_Node.__init__~   s    			r#   c                     t        |      }| j                  }| j                  |_        | |_        || _        |||_        |S r;   )rR   r   rT   )r   rU   node	curr_nexts       r   appendz_Node.append   ?    T{II	II			 !INr#   c                     t        |      }| j                  }| j                  |_        | |_        || _        |||_        |S r;   )rR   rT   r   )r   rU   rW   	curr_prevs       r   prependz_Node.prepend   rZ   r#   N)r5   r6   r7   r   rY   r]   r8   r#   r   rR   rR   |   s    
r#   rR   c                   D    e Zd ZdZddZd Zed        Zed        Zd Z	y)	_HelperBytecodeListz
    A helper double-linked list to make the manipulation a bit easier (so that we don't need
    to keep track of indices that change) and performant (because adding multiple items to
    the middle of a regular list isn't ideal).
    Nc                 Z    d | _         d | _        |r| }|D ]  }|j                  |      } y y r;   )_head_tailrY   )r   lstrW   items       r   r   z_HelperBytecodeList.__init__   s:    

D ){{4() r#   c                     | j                   t        |      }|x| _        | _         |S | j                  j	                  |      x}| _         |S r;   )rb   rR   ra   tailrY   )r   rU   rW   s      r   rY   z_HelperBytecodeList.append   sH    ::;D&**DJK $		 0 0 66D4:Kr#   c                 v    | j                   }|j                  r |j                  x| _         }|j                  r |S r;   )ra   rT   r   rW   s     r   headz_HelperBytecodeList.head   0    zzii $		)DJ iir#   c                 v    | j                   }|j                  r |j                  x| _         }|j                  r |S r;   )rb   r   rh   s     r   rf   z_HelperBytecodeList.tail   rj   r#   c              #   d   K   | j                   }|r|j                   |j                  }|ry y wr;   )ri   rU   r   rh   s     r   __iter__z_HelperBytecodeList.__iter__   s)     yy))O99D s   +00r;   )
r5   r6   r7   __doc__r   rY   propertyri   rf   rm   r8   r#   r   r_   r_      s>    )    r#   r_   )JUMP_ABSOLUTE)rH   )CALL_FUNCTION_EX)rJ   POP_JUMP_IF_TRUE)	LIST_APPENDSET_ADD	GET_ANEXTGET_AWAITABLE
DICT_MERGEMAP_ADD
COMPARE_OPIS_OPCONTAINS_OP   )   
   c                    |t        |       }|j                  sd| fS t        |      }|D ]#  }|dk  s	t        j                  d|       d| fc S  	 t
        j                  j                  |       }t        rt        j                  |d      }t        |      }|j                         }	|j                  }
t               }d}|
|
j                  }t        |dd      }t        |dd      }t         rTt"        j%                  |      }|r=|
j&                  j                  }t        |dd      }||v rt        |dd      }|rd|_        |t*        rA||}nM||k(  r4|
j,                  j                  j.                  t0        k7  r|
j&                  }
|}n||v r|
j&                  }
||	v r|j3                  |       |
j,                  Q|
j,                  j                  j.                  t0        k(  r*|d	k(  r%t5        |||
      D ]  }|
j7                  |      }
 n$t5        |||
      D ]  }|
j9                  |        |
j&                  }
|
||dd t        rt        j                  |d       |j;                         }t        r+t        j?                  |       }t        j?                  ||       d|fS #  t        j<                  d       d| fcY S xY w)z
    Inserts pydevd programmatic breaks into the code (at the given lines).

    :param breakpoint_lines: set with the lines where we should add breakpoints.
    :return: tuple(boolean flag whether insertion was successful, modified code).
    NFr   z,Trying to add breakpoint in invalid line: %sz	bytecode.)r   r'   r    rK   r   zError inserting pydevd breaks.T) rE   r@   setr   infor)   Bytecode	from_codeDEBUGdebug_helperr,   r_   copyri   rU   getattrFIX_PREDICT_PREDICT_TABLEgetr   r'   TRACK_MULTIPLE_BRANCHESrT   	__class__r   addrP   rY   r]   to_code	exceptionr3   )r2   breakpoint_linescode_line_infor	   r
   rD   r+   op_number_bytecodehelper_listmodified_breakpoint_lines	curr_nodeadded_breaks_in_lineslast_linenoinstructioninstruction_lineno	curr_namepredict_targetsnext_instruction	next_namenext_instruction_linenonew_instructionnew_coder   s                          r   insert_pydevd_breaksr      s    ,^<((n$$ +, ! )19NNI4P.((	)T%''7!-!<!<Q{!<!S)!,$4$9$9$;!$$	 ###..K!(h!EVT:I"0"4"4Y"?"
 (1~~':':$ '(8&$ GI O329:JHVZ2[/26:,3!-*"*&8&*<<  )~~22<<E,5NN	 (&8)-BB$-NN	 %)BB)--.@A ~~1inn6I6I6S6SW\6\ )Y 6
 0G.1E7Q0 JO
 )2(8(8(IIJ 0G.1E7Q0 ?O
 &--o>? "Iy #| !''+=k'R99;  **>:	x3>%<=n$$s   G0J, 3J, ,K	) collectionsr   r1   	functoolsr   r   os.pathr   sysr)   bytecode.instrr   r   _pydev_bundler   '_pydevd_frame_eval.pydevd_frame_tracingr	   r
   r   objectr   r9   rE   r   rP   rR   r_   r   version_infor   r   r   r8   r#   r   <module>r      s    " 
    
  ' # d"& "J ?,ST@ 	=L
 2#=.b!F !H-& -b &! $'!<7=, **2A.'9 
 r"g- 1#=~r#   