
[[\:[                 @   s   d  Z  d d l Z d d l Z d d l Z d d l m Z d d d g Z Gd d   d e  Z Gd d   d  Z	 d	 d
   Z
 Gd d   d  Z d d   Z d d   Z Gd d   d e	  Z d d   Z d d   Z d d   Z d S)zDebugger basics    N)CO_GENERATORBdbQuitBdb
Breakpointc               @   s   e  Z d  Z d Z d S)r   z Exception to give up completely.N)__name__
__module____qualname____doc__ r
   r
   /usr/lib/python3.4/bdb.pyr   
   s   c               @   s2  e  Z d  Z 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& d'  Z d d( d)  Z d* d+   Z d, d-   Z d. d/   Z d d0 d1  Z d2 d3   Z d4 d5   Z d6 d d d7 d8  Z d9 d:   Z d; d<   Z d= d>   Z  d? d@   Z! dA dB   Z" dC dD   Z# dE dF   Z$ dG dH   Z% dI dJ   Z& dK dL   Z' dM dN   Z( dO dP dQ  Z) d d dR dS  Z* d d dT dU  Z+ dV dW   Z, dX dY   Z- d S)Zr   zGeneric Python debugger base class.

    This class takes care of details of the trace facility;
    a derived class should implement user interaction.
    The standard debugger class (pdb.Pdb) is an example.
    Nc             C   s:   | r t  |  n d  |  _ i  |  _ i  |  _ d  |  _ d  S)N)setskipbreaksfncacheframe_returning)selfr   r
   r
   r   __init__   s    		zBdb.__init__c             C   sr   | d | d d  d k r" | S|  j  j |  } | sn t j j |  } t j j |  } | |  j  | <n  | S)N<   >)r   getospathabspathnormcase)r   filenamecanonicr
   r
   r   r      s    zBdb.canonicc             C   s3   d d  l  } | j   d  |  _ |  j d  d   d  S)Nr   )	linecache
checkcachebotframe_set_stopinfo)r   r   r
   r
   r   reset&   s    
	z	Bdb.resetc             C   s   |  j  r d  S| d k r& |  j |  S| d k rB |  j | |  S| d k r^ |  j | |  S| d k rz |  j | |  S| d k r |  j S| d k r |  j S| d k r |  j St d t |   |  j S)	NlinecallreturnZ	exceptionZc_callZc_exceptionZc_returnz*bdb.Bdb.dispatch: unknown debugging event:)quittingdispatch_linedispatch_calldispatch_returndispatch_exceptiontrace_dispatchprintrepr)r   frameZeventargr
   r
   r   r+   ,   s$    	zBdb.trace_dispatchc             C   sG   |  j  |  s |  j |  r@ |  j |  |  j r@ t  q@ n  |  j S)N)	stop_here
break_here	user_liner&   r   r+   )r   r.   r
   r
   r   r'   @   s
    	 zBdb.dispatch_linec             C   s   |  j  d  k r" | j |  _  |  j S|  j |  p= |  j |  sD d  S|  j rd | j j t @rd |  j S|  j	 | |  |  j
 r t  n  |  j S)N)r    f_backr+   r0   break_anywhere	stopframef_codeco_flagsr   	user_callr&   r   )r   r.   r/   r
   r
   r   r(   F   s    	 	zBdb.dispatch_callc             C   s   |  j  |  s | |  j k r |  j r> | j j t @r> |  j Sz | |  _ |  j | |  Wd  d  |  _ X|  j	 rz t
  n  |  j | k r |  j d k r |  j d  d   q n  |  j S)Nr   r   )r0   returnframer5   r6   r7   r   r+   r   user_returnr&   r   
stoplinenor!   )r   r.   r/   r
   r
   r   r)   V   s    	
	 	zBdb.dispatch_returnc             C   s   |  j  |  rg | j j t @o< | d t k o< | d d  k s |  j | |  |  j rd t  qd q nf |  j r | |  j k	 r |  j j j t @r | d t t	 f k r |  j | |  |  j r t  q n  |  j
 S)Nr      )r0   r6   r7   r   StopIterationuser_exceptionr&   r   r5   GeneratorExitr+   )r   r.   r/   r
   r
   r   r*   f   s     	 	 zBdb.dispatch_exceptionc             C   s.   x' |  j  D] } t j | |  r
 d Sq
 Wd S)NTF)r   fnmatch)r   Zmodule_namepatternr
   r
   r   is_skipped_module   s    zBdb.is_skipped_modulec             C   sk   |  j  r( |  j | j j d   r( d S| |  j k rZ |  j d k rJ d S| j |  j k S|  j sg d Sd S)Nr   Fr   Tr   )r   rB   	f_globalsr   r5   r;   f_lineno)r   r.   r
   r
   r   r0      s    		zBdb.stop_herec             C   s   |  j  | j j  } | |  j k r( d S| j } | |  j | k rj | j j } | |  j | k rj d Sn  t | | |  \ } } | r | j |  _ | r | j	 r |  j
 t | j   n  d Sd Sd  S)NFT)r   r6   co_filenamer   rD   co_firstlineno	effectivenumberZ	currentbp	temporarydo_clearstr)r   r.   r   linenobpZflagr
   r
   r   r1      s    	zBdb.break_herec             C   s   t  d   d  S)Nz)subclass of bdb must implement do_clear())NotImplementedError)r   r/   r
   r
   r   rJ      s    zBdb.do_clearc             C   s   |  j  | j j  |  j k S)N)r   r6   rE   r   )r   r.   r
   r
   r   r4      s    zBdb.break_anywherec             C   s   d S)znThis method is called when there is the remote possibility
        that we ever need to stop in this function.Nr
   )r   r.   Zargument_listr
   r
   r   r8      s    zBdb.user_callc             C   s   d S)z9This method is called when we stop or break at this line.Nr
   )r   r.   r
   r
   r   r2      s    zBdb.user_linec             C   s   d S)z5This method is called when a return trap is set here.Nr
   )r   r.   Zreturn_valuer
   r
   r   r:      s    zBdb.user_returnc             C   s   d S)zmThis method is called if an exception occurs,
        but only if we are to stop at or just below this level.Nr
   )r   r.   exc_infor
   r
   r   r>      s    zBdb.user_exceptionr   c             C   s(   | |  _  | |  _ d |  _ | |  _ d  S)NF)r5   r9   r&   r;   )r   r5   r9   r;   r
   r
   r   r!      s    			zBdb._set_stopinfoc             C   s3   | d k r | j  d } n  |  j | | |  d S)zxStop when the line with the line no greater than the current one is
        reached or when returning from current frameNr   )rD   r!   )r   r.   rL   r
   r
   r   	set_until   s    zBdb.set_untilc             C   sK   |  j  r7 |  j  j } | r7 | j r7 |  j | _ q7 n  |  j d d  d S)zStop after one line of code.N)r   r3   f_tracer+   r!   )r   Zcaller_framer
   r
   r   set_step   s
    	zBdb.set_stepc             C   s   |  j  | d  d S)z2Stop on the next line in or below the given frame.N)r!   )r   r.   r
   r
   r   set_next   s    zBdb.set_nextc             C   s=   | j  j t @r& |  j | d d  n |  j | j |  d S)z)Stop when returning from the given frame.Nr   r   )r6   r7   r   r!   r3   )r   r.   r
   r
   r   
set_return   s    zBdb.set_returnc             C   sq   | d k r t  j   j } n  |  j   x( | rR |  j | _ | |  _ | j } q+ W|  j   t  j |  j  d S)zpStart debugging from `frame`.

        If frame is not specified, debugging starts from caller's frame.
        N)	sys	_getframer3   r"   r+   rQ   r    rR   settrace)r   r.   r
   r
   r   	set_trace   s    
		
zBdb.set_tracec             C   sm   |  j  |  j d  d  |  j si t j d   t j   j } x+ | re | |  j k	 re | ` | j } q> Wn  d  S)Nr   r   )r!   r    r   rU   rW   rV   r3   rQ   )r   r.   r
   r
   r   set_continue   s    	zBdb.set_continuec             C   s/   |  j  |  _ d  |  _ d |  _ t j d   d  S)NT)r    r5   r9   r&   rU   rW   )r   r
   r
   r   set_quit  s    		zBdb.set_quitFc       
      C   s   |  j  |  } d d  l } | j | |  } | sA d | | f S|  j j | g   } | | k rr | j |  n  t | | | | |  }	 d  S)Nr   zLine %s:%d does not exist)r   r   getliner   
setdefaultappendr   )
r   r   rL   rI   condfuncnamer   r#   listrM   r
   r
   r   	set_break  s    zBdb.set_breakc             C   sJ   | | f t  j k r, |  j | j |  n  |  j | sF |  j | =n  d  S)N)r   bplistr   remove)r   r   rL   r
   r
   r   _prune_breaks!  s    zBdb._prune_breaksc             C   s   |  j  |  } | |  j k r& d | S| |  j | k rG d | | f Sx/ t j | | f d  d   D] } | j   qe W|  j | |  d  S)NzThere are no breakpoints in %szThere is no breakpoint at %s:%d)r   r   r   rb   deleteMerd   )r   r   rL   rM   r
   r
   r   clear_break'  s    $zBdb.clear_breakc             C   si   y |  j  |  } Wn/ t k
 rD } z t |  SWYd  d  } ~ Xn X| j   |  j | j | j  d  S)N)get_bpbynumber
ValueErrorrK   re   rd   filer#   )r   r/   rM   errr
   r
   r   clear_bpbynumber3  s    
zBdb.clear_bpbynumberc             C   sz   |  j  |  } | |  j k r& d | SxC |  j | D]4 } t j | | f } x | D] } | j   qT Wq4 W|  j | =d  S)NzThere are no breakpoints in %s)r   r   r   rb   re   )r   r   r#   ZblistrM   r
   r
   r   clear_all_file_breaks;  s    zBdb.clear_all_file_breaksc             C   sA   |  j  s d Sx$ t j D] } | r | j   q q Wi  |  _  d  S)NzThere are no breakpoints)r   r   
bpbynumberre   )r   rM   r
   r
   r   clear_all_breaksE  s    	zBdb.clear_all_breaksc             C   s   | s t  d   n  y t |  } Wn" t  k
 rI t  d |   Yn Xy t j | } Wn" t k
 r t  d |   Yn X| d  k r t  d |   n  | S)NzBreakpoint number expectedz Non-numeric breakpoint number %sz!Breakpoint number %d out of rangezBreakpoint %d already deleted)rh   intr   rm   
IndexError)r   r/   rH   rM   r
   r
   r   rg   M  s    zBdb.get_bpbynumberc             C   s/   |  j  |  } | |  j k o. | |  j | k S)N)r   r   )r   r   rL   r
   r
   r   	get_break\  s    zBdb.get_breakc             C   sH   |  j  |  } | |  j k rD | |  j | k rD t j | | f pG g  S)N)r   r   r   rb   )r   r   rL   r
   r
   r   
get_breaksa  s    zBdb.get_breaksc             C   s1   |  j  |  } | |  j k r) |  j | Sg  Sd  S)N)r   r   )r   r   r
   r
   r   get_file_breaksg  s    zBdb.get_file_breaksc             C   s   |  j  S)N)r   )r   r
   r
   r   get_all_breaksn  s    zBdb.get_all_breaksc             C   s   g  } | r' | j  | k r' | j } n  xB | d  k	 rk | j | | j f  | |  j k r_ Pn  | j } q* W| j   t d t |  d  } x2 | d  k	 r | j | j  | j	 f  | j } q W| d  k r t d t |  d  } n  | | f S)Nr   r   )
tb_frametb_nextr]   rD   r    r3   reversemaxlen	tb_lineno)r   ftstackir
   r
   r   	get_stackt  s     
zBdb.get_stackz: c             C   s2  d d  l  } d d  l } | \ } } |  j | j j  } d | | f } | j j rh | | j j 7} n
 | d 7} d | j k r | j d }	 n d  }	 |	 r | | j |	  7} n
 | d 7} d | j k r | j d }
 | d 7} | | j |
  7} n  | j | | | j	  } | r.| | | j
   7} n  | S)Nr   z%s(%r)z<lambda>Z__args__z()Z
__return__z->)r   reprlibr   r6   rE   co_namef_localsr-   r[   rC   strip)r   Zframe_linenoZlprefixr   r   r.   rL   r   sargsrvr#   r
   r
   r   format_stack_entry  s*    


zBdb.format_stack_entryc             C   s   | d  k r$ d d  l  } | j } n  | d  k r9 | } n  |  j   t | t  rg t | d d  } n  t j |  j  z- y t	 | | |  Wn t
 k
 r Yn XWd  d |  _ t j d   Xd  S)Nr   z<string>execT)__main____dict__r"   
isinstancerK   compilerU   rW   r+   r   r   r&   )r   cmdglobalslocalsr   r
   r
   r   run  s    	
		zBdb.runc             C   s   | d  k r$ d d  l  } | j } n  | d  k r9 | } n  |  j   t j |  j  z- y t | | |  SWn t k
 r~ Yn XWd  d |  _ t j d   Xd  S)Nr   T)	r   r   r"   rU   rW   r+   evalr   r&   )r   exprr   r   r   r
   r
   r   runeval  s    	
		zBdb.runevalc             C   s   |  j  | | |  d  S)N)r   )r   r   r   r   r
   r
   r   runctx  s    z
Bdb.runctxc             O   sj   |  j    t j |  j  d  } z, y | | |   } Wn t k
 rJ Yn XWd  d |  _ t j d   X| S)NT)r"   rU   rW   r+   r   r&   )r   funcr   kwdsZresr
   r
   r   runcall  s    
		zBdb.runcall).r   r   r   r	   r   r   r"   r+   r'   r(   r)   r*   rB   r0   r1   rJ   r4   r8   r2   r:   r>   r!   rP   rR   rS   rT   rX   rY   rZ   ra   rd   rf   rk   rl   rn   rg   rq   rr   rs   rt   r   r   r   r   r   r   r
   r
   r
   r   r      sX   

c               C   s   t    j   d  S)N)r   rX   r
   r
   r
   r   rX     s    rX   c               @   s   e  Z d  Z d Z d Z i  Z d g Z d d d d d  Z d d   Z d	 d
   Z	 d d   Z
 d d d  Z d d   Z d d   Z d S)r   a  Breakpoint class.

    Implements temporary breakpoints, ignore counts, disabling and
    (re)-enabling, and conditionals.

    Breakpoints are indexed by number through bpbynumber and by
    the file,line tuple using bplist.  The former points to a
    single instance of class Breakpoint.  The latter points to a
    list of such instances since there may be more than one
    breakpoint per line.

    r   NFc             C   s   | |  _  d  |  _ | |  _ | |  _ | |  _ | |  _ d |  _ d |  _ d |  _ t	 j
 |  _ t	 j
 d 7_
 |  j j |   | | f |  j k r |  j | | f j |   n |  g |  j | | f <d  S)NTr   r   )r_   func_first_executable_lineri   r#   rI   r^   enabledignorehitsr   nextrH   rm   r]   rb   )r   ri   r#   rI   r^   r_   r
   r
   r   r     s    									zBreakpoint.__init__c             C   sT   |  j  |  j f } d  |  j |  j <|  j | j |   |  j | sP |  j | =n  d  S)N)ri   r#   rm   rH   rb   rc   )r   indexr
   r
   r   re   	  s
    zBreakpoint.deleteMec             C   s   d |  _  d  S)NT)r   )r   r
   r
   r   enable  s    zBreakpoint.enablec             C   s   d |  _  d  S)NF)r   )r   r
   r
   r   disable  s    zBreakpoint.disablec             C   s2   | d  k r t  j } n  t |  j   d | d  S)Nri   )rU   stdoutr,   bpformat)r   outr
   r
   r   bpprint  s    zBreakpoint.bpprintc             C   s   |  j  r d } n d } |  j r. | d } n
 | d } d |  j | |  j |  j f } |  j rw | d |  j f 7} n  |  j r | d |  j f 7} n  |  j r |  j d k r d	 } n d
 } | d |  j | f 7} n  | S)Nzdel  zkeep zyes  zno   z%-4dbreakpoint   %s at %s:%dz
	stop only if %sz
	ignore next %d hitsr   r    z"
	breakpoint already hit %d time%s)rI   r   rH   ri   r#   r^   r   r   )r   ZdispZretZssr
   r
   r   r     s$    			
				zBreakpoint.bpformatc             C   s   d |  j  |  j |  j f S)Nzbreakpoint %s at %s:%s)rH   ri   r#   )r   r
   r
   r   __str__3  s    zBreakpoint.__str__)r   r   r   r	   r   rb   rm   r   re   r   r   r   r   r   r
   r
   r
   r   r     s   	c             C   sn   |  j  s# |  j | j k r d Sd S| j j |  j  k r< d S|  j sT | j |  _ n  |  j | j k rj d Sd S)z;Check whether we should break here because of `b.funcname`.FT)r_   r#   rD   r6   r   r   )br.   r
   r
   r   checkfuncname8  s    		r   c             C   s   t  j |  | f } x | D] } | j s/ q n  t | |  sD q n  | j d 7_ | j s | j d k r | j d 8_ q q | d f Sq yS t | j | j | j	  } | r | j d k r | j d 8_ q | d f Sn  Wq | d f SYq Xq Wd S)zDetermine which breakpoint for this file:line is to be acted upon.

    Called only if we know there is a bpt at this
    location.  Returns breakpoint that was triggered and a flag
    that indicates if it is ok to delete a temporary bp.

    r   r   TFN)NN)
r   rb   r   r   r   r^   r   r   rC   r   )ri   r#   r.   Z	possiblesr   valr
   r
   r   rG   T  s*    		rG   c               @   s@   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 S)
Tdbc             C   s/   | j  j } | s d } n  t d | |  d  S)Nz???z+++ call)r6   r   r,   )r   r.   r   namer
   r
   r   r8     s     	zTdb.user_callc             C   s}   d d  l  } | j j } | s' d } n  |  j | j j  } | j | | j | j  } t d | | j | d | j	    d  S)Nr   z???z+++:)
r   r6   r   r   rE   r[   rD   rC   r,   r   )r   r.   r   r   fnr#   r
   r
   r   r2     s     	zTdb.user_linec             C   s   t  d |  d  S)Nz
+++ return)r,   )r   r.   Zretvalr
   r
   r   r:     s    zTdb.user_returnc             C   s   t  d |  |  j   d  S)Nz+++ exception)r,   rY   )r   r.   Z	exc_stuffr
   r
   r   r>     s    zTdb.user_exceptionN)r   r   r   r8   r2   r:   r>   r
   r
   r
   r   r     s   r   c             C   s1   t  d |  d  t |  d  } t  d |  d  S)Nzfoo()
   zbar returned)r,   bar)nxr
   r
   r   foo  s    r   c             C   s   t  d |  d  |  d S)Nzbar(r   r<   )r,   )ar
   r
   r   r     s    r   c              C   s   t    }  |  j d  d  S)Nzimport bdb; bdb.foo(10))r   r   )r|   r
   r
   r   test  s    	r   )r	   r@   rU   r   inspectr   __all__	Exceptionr   r   rX   r   r   rG   r   r   r   r   r
   r
   r
   r   <module>   s     Z0