
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \\  ã               @   s¶   d Z ddlZddlZddlZddlmZmZmZ dddgZeeB eB Z	G dd„ de
ƒZG dd„ dƒZd	d
„ ZG dd„ dƒZdd„ Zdd„ ZG dd„ deƒZdd„ Zdd„ Zdd„ ZdS )zDebugger basicsé    N)ÚCO_GENERATORÚCO_COROUTINEÚCO_ASYNC_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/lib64/python3.6/bdb.pyr      s   c               @   sp  e Zd ZdZdZd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]d0d1„Zd2d3„ Zd4d5„ Zd^d7d8„Zd9d:„ Zd;d<„ Zd=d>„ Z d?d@„ Z!dAdB„ Z"dCdD„ Z#dEdF„ Z$dGdH„ Z%dIdJ„ Z&dKdL„ Z'dMdN„ Z(d_dPdQ„Z)d`dRdS„Z*dadTdU„Z+dVdW„ Z,dXdY„ Z-dS )br   zÕGeneric 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|ƒ}|sNtjj|ƒ}tjj|ƒ}|| j |< |S )Nú<é   ú>éÿÿÿÿ)r   ÚgetÚosÚpathÚabspathÚnormcase)r   ÚfilenameÚcanonicr   r   r   r      s    
zBdb.canonicc             C   s&   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r0| j||ƒS |dkrD| j||ƒS |dkrX| j||ƒS |dkrf| jS |dkrt| jS |dkr‚| jS tdt|ƒƒ | jS )	NÚlineZ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   s.   | j |ƒs| j|ƒr(| j|ƒ | jr(t‚| jS )N)Ú	stop_hereÚ
break_hereÚ	user_liner'   r   r,   )r   r/   r   r   r   r(   C   s
    
 zBdb.dispatch_linec             C   sd   | j d kr|j| _ | jS | j|ƒp*| j|ƒs0d S | jrH|jjt@ rH| jS | j	||ƒ | j
r^t‚| jS )N)r"   Úf_backr,   r1   Úbreak_anywhereÚ	stopframeÚf_codeÚco_flagsÚGENERATOR_AND_COROUTINE_FLAGSÚ	user_callr'   r   )r   r/   r0   r   r   r   r)   I   s    
 zBdb.dispatch_callc             C   s|   | j |ƒs|| jkrv| jr,|jjt@ r,| jS z|| _| j||ƒ W d d | _X | j	rVt
‚| j|krv| jdkrv| jd d ƒ | jS )Nr   r   )r1   Úreturnframer6   r7   r8   r9   r,   r   Úuser_returnr'   r   Ú
stoplinenor#   )r   r/   r0   r   r   r   r*   Y   s     zBdb.dispatch_returnc             C   s�   | j |ƒrF|jjt@ o,|d tko,|d d ksŠ| j||ƒ | jrŠt‚nD| jrŠ|| jk	rŠ| jjjt@ rŠ|d tt	fkrŠ| j||ƒ | jrŠt‚| j
S )Nr   é   )r1   r7   r8   r9   ÚStopIterationÚuser_exceptionr'   r   r6   ÚGeneratorExitr,   )r   r/   r0   r   r   r   r+   i   s    
  zBdb.dispatch_exceptionc             C   s$   x| j D ]}tj||ƒrdS qW dS )NTF)r   Úfnmatch)r   Zmodule_nameÚpatternr   r   r   Úis_skipped_module‚   s    zBdb.is_skipped_modulec             C   sN   | j r| j|jjdƒƒrdS || jkr@| jdkr4dS |j| jkS | jsJdS dS )Nr   Fr   Tr   )r   rD   Ú	f_globalsr   r6   r=   Úf_lineno)r   r/   r   r   r   r1   ˆ   s    

zBdb.stop_herec             C   sŒ   | j |jjƒ}|| jkrdS |j}|| j| krJ|jj}|| j| krJdS t|||ƒ\}}|r„|j| _|r€|j	r€| j
t|jƒƒ dS dS d S )NFT)r   r7   Úco_filenamer   rF   Úco_firstlinenoÚ	effectiveÚnumberZ	currentbpÚ	temporaryÚdo_clearÚstr)r   r/   r   ÚlinenoÚbpÚflagr   r   r   r2   –   s    

zBdb.break_herec             C   s   t dƒ‚d S )Nz)subclass of bdb must implement do_clear())ÚNotImplementedError)r   r0   r   r   r   rL   ¬   s    zBdb.do_clearc             C   s   | j |jjƒ| jkS )N)r   r7   rG   r   )r   r/   r   r   r   r5   ¯   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   r:   µ   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   r3   º   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)r6   r;   r'   r=   )r   r6   r;   r=   r   r   r   r#   Ç   s    zBdb._set_stopinfoc             C   s$   |dkr|j d }| j|||ƒ dS )zxStop when the line with the line no greater than the current one is
        reached or when returning from current frameNr   )rF   r#   )r   r/   rN   r   r   r   Ú	set_untilÒ   s    
zBdb.set_untilc             C   s2   | j r"| j j}|r"|j r"| j|_| jddƒ dS )zStop after one line of code.N)r   r4   Ú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   )r7   r8   r9   r#   r4   )r   r/   r   r   r   Ú
set_returnê   s    zBdb.set_returnc             C   sP   |dkrt jƒ j}| jƒ  x|r6| 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Ú	_getframer4   r$   r,   rT   r"   rU   Úsettrace)r   r/   r   r   r   Ú	set_traceñ   s    

zBdb.set_tracec             C   sL   | j | jd dƒ | jsHtjd ƒ tjƒ j}x|rF|| jk	rF|`|j}q,W d S )Nr   r   )r#   r"   r   rX   rZ   rY   r4   rT   )r   r/   r   r   r   Úset_continue   s    

zBdb.set_continuec             C   s"   | j | _d | _d| _tjd ƒ d S )NT)r"   r6   r;   r'   rX   rZ   )r   r   r   r   Úset_quit  s    zBdb.set_quitFc       
      C   sb   | j |ƒ}dd l}|j||ƒ}|s.d||f S | jj|g ƒ}||krN|j|ƒ t|||||ƒ}	d S )Nr   zLine %s:%d does not exist)r   r    Úgetliner   Ú
setdefaultÚappendr   )
r   r   rN   rK   ÚcondÚfuncnamer    r%   ÚlistrO   r   r   r   Ú	set_break  s    

zBdb.set_breakc             C   s4   ||ft jkr| j| j|ƒ | j| s0| j|= d S )N)r   Úbplistr   Úremove)r   r   rN   r   r   r   Ú_prune_breaks$  s    
zBdb._prune_breaksc             C   sn   | j |ƒ}|| jkrd| S || j| kr6d||f S x&tj||f d d … D ]}|jƒ  qNW | j||ƒ d S )NzThere are no breakpoints in %szThere is no breakpoint at %s:%d)r   r   r   re   ÚdeleteMerg   )r   r   rN   rO   r   r   r   Úclear_break*  s    

zBdb.clear_breakc             C   sP   y| j |ƒ}W n$ tk
r2 } zt|ƒS d }~X nX |jƒ  | j|j|jƒ d S )N)Úget_bpbynumberÚ
ValueErrorrM   rh   rg   Úfiler%   )r   r0   rO   Úerrr   r   r   Úclear_bpbynumber6  s    zBdb.clear_bpbynumberc             C   s`   | j |ƒ}|| jkrd| S x6| j| D ](}tj||f }x|D ]}|jƒ  q@W q(W | j|= d S )NzThere are no breakpoints in %s)r   r   r   re   rh   )r   r   r%   ZblistrO   r   r   r   Úclear_all_file_breaks>  s    


zBdb.clear_all_file_breaksc             C   s0   | j s
dS xtjD ]}|r|jƒ  qW i | _ d S )NzThere are no breakpoints)r   r   Ú
bpbynumberrh   )r   rO   r   r   r   Úclear_all_breaksH  s    zBdb.clear_all_breaksc             C   s‚   |st dƒ‚yt|ƒ}W n  t k
r8   t d| ƒ‚Y nX ytj| }W n  tk
rh   t d| ƒ‚Y nX |d kr~t d| ƒ‚|S )NzBreakpoint number expectedz Non-numeric breakpoint number %sz!Breakpoint number %d out of rangezBreakpoint %d already deleted)rk   Úintr   rp   Ú
IndexError)r   r0   rJ   rO   r   r   r   rj   P  s    zBdb.get_bpbynumberc             C   s"   | j |ƒ}|| jko || j| kS )N)r   r   )r   r   rN   r   r   r   Ú	get_break_  s    

zBdb.get_breakc             C   s4   | j |ƒ}|| jkr0|| j| kr0tj||f p2g S )N)r   r   r   re   )r   r   rN   r   r   r   Ú
get_breaksd  s    

zBdb.get_breaksc             C   s&   | j |ƒ}|| jkr| j| S g S d S )N)r   r   )r   r   r   r   r   Úget_file_breaksj  s    


zBdb.get_file_breaksc             C   s   | j S )N)r   )r   r   r   r   Úget_all_breaksq  s    zBdb.get_all_breaksc             C   sª   g }|r|j |kr|j}x.|d k	rF|j||jfƒ || jkr>P |j}qW |jƒ  tdt|ƒd ƒ}x$|d k	r†|j|j |j	fƒ |j}qdW |d kr¢tdt|ƒd ƒ}||fS )Nr   r   )
Útb_frameÚtb_nextr`   rF   r"   r4   ÚreverseÚmaxÚlenÚ	tb_lineno)r   ÚfÚtÚstackÚir   r   r   Ú	get_stackw  s     




zBdb.get_stackú: c             C   sØ   dd l }dd l}|\}}| j|jjƒ}d||f }|jjrH||jj7 }n|d7 }d|jkrf|jd }	nd }	|	r~||j|	ƒ7 }n|d7 }d|jkr°|jd }
|d7 }||j|
ƒ7 }|j|||j	ƒ}|rÔ|||j
ƒ  7 }|S )Nr   z%s(%r)z<lambda>Z__args__z()Z
__return__z->)r    Úreprlibr   r7   rG   Úco_nameÚf_localsr.   r^   rE   Ústrip)r   Zframe_linenoZlprefixr    r„   r/   rN   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}|d kr"|}| jƒ  t|tƒr@t|ddƒ}tj| jƒ z*yt	|||ƒ W n t
k
rr   Y nX W d d| _tjd ƒ X d S )Nr   z<string>ÚexecT)Ú__main__Ú__dict__r$   Ú
isinstancerM   ÚcompilerX   rZ   r,   rŒ   r   r'   )r   ÚcmdÚglobalsÚlocalsr�   r   r   r   Úrun§  s    

zBdb.runc             C   st   |d krdd l }|j}|d kr"|}| jƒ  tj| jƒ z&yt|||ƒS  tk
rX   Y nX W d d| _tjd ƒ X d S )Nr   T)	r�   rŽ   r$   rX   rZ   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   sX   | j ƒ  tj| jƒ d }z(y|||Ž}W n tk
r<   Y nX W d d| _tjd ƒ X |S )NT)r$   rX   rZ   r,   r   r'   )r   Úfuncr‰   ÚkwdsÚresr   r   r   ÚruncallÏ  s    
zBdb.runcall)N)r   )N)N)FNN)rƒ   )NN)NN).r   r	   r
   r   r   r   r$   r,   r(   r)   r*   r+   rD   r1   r2   rL   r5   r:   r3   r<   r@   r#   rS   rU   rV   rW   r[   r\   r]   rd   rg   ri   rn   ro   rq   rj   rt   ru   rv   rw   r‚   r‹   r”   r—   r˜   rœ   r   r   r   r   r      sX   




 




c               C   s   t ƒ jƒ  d S )N)r   r[   r   r   r   r   r[   Ý  s    r[   c               @   sZ   e Zd ZdZdZi ZdgZ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   )rb   Úfunc_first_executable_linerl   r%   rK   ra   ÚenabledÚignoreÚhitsr   ÚnextrJ   rp   r`   re   )r   rl   r%   rK   ra   rb   r   r   r   r   ø  s    zBreakpoint.__init__c             C   s>   | j | jf}d | j| j< | j| j| ƒ | j| s:| j|= d S )N)rl   r%   rp   rJ   re   rf   )r   Úindexr   r   r   rh     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   s"   |d krt j}t| jƒ |d� d S )N)rl   )rX   Ú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rT|d| jf 7 }| jrj|d| jf 7 }| jr–| jdkr€d	}nd
}|d| j|f 7 }|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)rK   rž   rJ   rl   r%   ra   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)rJ   rl   r%   )r   r   r   r   Ú__str__6  s    zBreakpoint.__str__)FNN)N)r   r	   r
   r   r¡   re   rp   r   rh   r£   r¤   r¨   r¦   rª   r   r   r   r   r   á  s   

c             C   sN   | j s| j|jkrdS dS |jj| j kr,dS | js:|j| _| j|jkrJdS dS )z;Check whether we should break here because of `b.funcname`.FT)rb   r%   rF   r7   r…   r�   )Úbr/   r   r   r   Úcheckfuncname;  s    r¬   c             C   sº   t j| |f }x¦|D ]ž}|js qt||ƒs,q| jd7  _|jsf|jdkr\| jd8  _qq²|dfS qy<t|j|j|j	ƒ}|r |jdkr˜| jd8  _n|dfS W q   |dfS qW dS )zôDetermine 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   re   rž   r¬   r    ra   rŸ   r•   rE   r†   )rl   r%   r/   Z	possiblesr«   Úvalr   r   r   rI   W  s*    




rI   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}td||ƒ d S )Nz???z+++ call)r7   r…   r-   )r   r/   r‰   Únamer   r   r   r:   ˆ  s     zTdb.user_callc             C   sT   dd l }|jj}|sd}| j|jjƒ}|j||j|jƒ}td||j|d|j	ƒ ƒ d S )Nr   z???z+++ú:)
r    r7   r…   r   rG   r^   rF   rE   r-   r‡   )r   r/   r    r¯   Úfnr%   r   r   r   r3   Œ  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-   r\   )r   r/   Z	exc_stuffr   r   r   r@   •  s    
zTdb.user_exceptionN)r   r	   r
   r:   r3   r<   r@   r   r   r   r   r®   ‡  s   r®   c             C   s&   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   rB   rX   r   Úinspectr   r   r   Ú__all__r9   Ú	Exceptionr   r   r[   r   r¬   rI   r®   r·   r´   r¹   r   r   r   r   Ú<module>   s&   
   OZ0