
    "eQ                         d Z ddlZddlZddl ddlmZmZ ddlmZ ddl	m
Z
 ddlmZ  G d d	ej                        Zd
 Zd Z G d d      Z G d de
      Z G d d      Zedk(  rddlmZ  eddd       yy)a  Debug user code with a GUI interface to a subclass of bdb.Bdb.

The Idb idb and Debugger gui instances each need a reference to each
other or to an rpc proxy for each other.

If IDLE is started with '-n', so that user code and idb both run in the
IDLE process, Debugger is called without an idb.  Debugger.__init__
calls Idb with its incomplete self.  Idb.__init__ stores gui and gui
then stores idb.

If IDLE is started normally, so that user code executes in a separate
process, debugger_r.start_remote_debugger is called, executing in the
IDLE process.  It calls 'start the debugger' in the remote process,
which calls Idb with a gui proxy.  Then Debugger is called in the IDLE
for more.
    N)*)Frame	Scrollbar)macosx)ScrolledList)ListedToplevelc                   .     e Zd ZdZ fdZd Zd Z xZS )Idbz6Supply user_line and user_exception functions for Bdb.c                 0    || _         t        | 	          y N)guisuper__init__)selfr   	__class__s     "lib/python3.12/idlelib/debugger.pyr   zIdb.__init__    s        c                     t        |      r| j                          yt        |      }	 | j                  j	                  ||       y# t
        $ r Y yw xY w)zmHandle a user stopping or breaking at a line.

        Convert frame to a string and send it to gui.
        N)_in_rpc_codeset_step_frame2messager   interactionTclError)r   framemessages      r   	user_linezIdb.user_line$   sM    
 MMO '	HH  %0 		s   A 	AAc                     t        |      r| j                          yt        |      }| j                  j	                  |||       y)z)Handle an the occurrence of an exception.N)r   r   r   r   r   )r   r   exc_infor   s       r   user_exceptionzIdb.user_exception2   s6    MMO 'WeX6r   )__name__
__module____qualname____doc__r   r   r   __classcell__)r   s   @r   r
   r
      s    <7r   r
   c                     | j                   j                  j                  d      ry| j                  }|y|j                   j                  }d|v rd|v ryt	        |      S )z)Determine if debugger is within RPC code.zrpc.pyTFidlelibdebugger)f_codeco_filenamecountf_backr   )r   
prev_frame	prev_names      r   r   r   :   s_    ||%%h/\\
%%11		!jI&= J''r   c                     | j                   }|j                  }| j                  }t        j                  j                  |      }| d| }|j                  dk7  r| d|j                   d}|S )z"Return a message string for frame.:?: z())r(   r)   f_linenoospathbasenameco_name)r   codefilenamelinenor5   r   s         r   r   r   I   sj    <<DH^^Fww)H
!F8$G||sIR~R0Nr   c                       e Zd ZdZdZdZdZdZdZdZ	dZ
ddZd ZddZd ZddZd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZd Zd Zd Z d Z!y)DebuggerzThe debugger interface.

    This class handles the drawing of the debugger window and
    the interactions with the underlying debugger session.
    Nc                     |t        |       }|| _        || _        d| _        | j	                          d| _        d| _        y)a  Instantiate and draw a debugger window.

        :param pyshell: An instance of the PyShell Window
        :type  pyshell: :class:`idlelib.pyshell.PyShell`

        :param idb: An instance of the IDLE debugger (optional)
        :type  idb: :class:`idlelib.debugger.Idb`
        NFr   )r
   pyshellidbr   make_guiinteractingnesting_level)r   r=   r>   s      r   r   zDebugger.__init__c   s@     ;d)C
 r   c                       j                   dkD  r1 j                           j                  j                  d fd       y	 d _          j
                  j                   d _        S # d _        w xY w)zRun the debugger.r   d   c                  "     j                     S r   )run)argsr   s   r   <lambda>zDebugger.run.<locals>.<lambda>   s    4 r   NTF)rA   
abort_looprootafterr@   r>   rE   )r   rF   s   ``r   rE   zDebugger.runu   sc    > !OOIIOOC!89	%#D488<<&$DuDs   A+ +	A4c                 T   	 | j                          | j                  r| j                  j	                          y| j
                  r!| j
                  j                          d| _        | j                  j                          | j                  j                          y# t        $ r Y w xY w)zClose the debugger and window.N)
quit	Exceptionr@   topbellstackviewercloser=   close_debuggerdestroyr   events     r   rQ   zDebugger.close   s    	IIK HHMMO""$d&6 	##%  		s   B 	B'&B'c                 J   | j                   }|j                  | _        |j                  x| _        }t        |      x| _        }| j                  j                  d       | j                  j                  d       |j                  d| j                         | j                  j                  d| j                         t        |      x| _        }| j                  j                  d       g x| _        }t        |d| j                        x| _        }|j#                  |       t        |d	| j$                        x| _        }|j#                  |       t        |d
| j(                        x| _        }|j#                  |       t        |d| j,                        x| _        }|j#                  |       t        |d| j0                        x| _        }|j#                  |       |D ]&  }|j3                  d       |j                  d       ( t        |      x| _        }| j4                  j                  d       | j6                  s5t9        |      | j:                  _        | j6                  j=                  d       t?        |d| j@                  | j6                        | _!        | jB                  jE                  dd       | jF                  st9        |      | j:                  _#        t?        |d| jH                  | jF                        | _%        | jJ                  jE                  dd       | jL                  s5t9        |      | j:                  _&        | jL                  j=                  d       t?        |d| jN                  | jL                        | _(        | jP                  jE                  dd       | jR                  st9        |      | j:                  _)        t?        |d| jT                  | jR                        | _+        | jV                  jE                  dd       tY        |d      | _-        | jZ                  j                  d       tY        |d      | _.        | j\                  j                  dd       | j\                  j_                  d      | _0        t        |d      | _1        | jb                  j                  dd       t        |      | _2        | jd                  j                  dd       t        |d      | _3        | jf                  j                  dd       | j6                  ji                         r| jA                          | jL                  ji                         r| jO                          | jR                  ji                         r| jU                          yy) z$Draw the debugger gui on the screen.zDebug ControlDebugWM_DELETE_WINDOWz<Escape>w)anchorGo)textcommandStepOverOutQuitdisabledstateleft)side   Stack)r\   r]   variabler   rowcolumnSourceLocalsGlobalsx)rZ   fill
background)heightbothexpandrq   N)5r=   flistrI   r   rN   wm_titlewm_iconnamewm_protocolrQ   bindr   bframepackbuttonsButtoncontbcontappendstepbstepnextbnextretbretrL   	configurecframevstack
BooleanVarr   setCheckbutton
show_stackbstackgridvsourceshow_sourcebsourcevlocalsshow_localsblocalsvglobalsshow_globalsbglobalsLabelstatuserrorcgeterrorbgfstackflocalsfglobalsget)r   r=   rI   rN   r|   blbr   s           r   r?   zDebugger.make_gui   s-   ,,]]
"<<'	D'--3/*W%*DJJ7j$**-$Sz)f$rT499EE
Q
		!VTYYGG
Q
		!VTYYGG
Q
		!vE488DD	A
		!vFDIIFF	A
		! 	 AKKjK)FFF	   %V},ff%{{$.sODNN!KKOOA!&$//DKKIQq)||%/_DNN""64#3#3dllLa*||%/_DNN"LLQ"64#3#3dllLa*}}&0oDNN##FD$5$5Oq+C,$3s+


s-zz|4C*/Sz0c!,!&1;;??OO<<== r   c                 0   || _         | j                  j                  |       |r |\  }}}	 |j                  }|	 | d| }d}nd}d }| j                  }| j                  j                  ||       | j                  }	|	r;| j                  j                  | j                   |      \  }
}|	j                  |
|       | j                  d       | j                  j                         r| j                          | j                   D ]  }|j                  d	        | j"                  j%                          | xj&                  dz  c_        | j(                  j*                  j-                  d
d       | xj&                  dz  c_        | j                   D ]  }|j                  d	        | j                  j                  d       | j                  j                  d| j                         d | _         y # t        $ r dt        |      z  }Y w xY w#  Y xY w)Nr\   z%sr1   yellow )r\   rr   rg   normalrc   vwait::idledebugwaitrb   )r   r   r   r    AttributeErrorstrr   r   rP   r>   	get_stack
load_stackshow_variablesr   r   sync_source_liner~   rN   wakeuprA   rI   tkcall)r   r   r   infotypevaluetbm1bgsvstackir   s                r   r   zDebugger.interaction   s   
7+"OD%&]]  4r%)B BBBB

"4xx))$**b9HE1MM%#A<<!!# 	(AKKhK'	( 	 	a		'#45a 	*AKKjK)	*2&

">
Q " &CI%&s   G2 H 2HHHc                     | j                   }|sy | j                  |      \  }}|d d |dd  z   dk7  r=t        j                  j	                  |      r| j
                  j                  ||       y y y )Nrg   z<>)r   _Debugger__frame2fileliner3   r4   existsrw   gotofileline)r   r   r8   r9   s       r   r   zDebugger.sync_source_line.  sk    

007&BQ<(23-'4/BGGNN84LJJ##Hf5 5M/r   c                 R    |j                   }|j                  }|j                  }||fS r   )r(   r)   r2   )r   r   r7   r8   r9   s        r   __frame2filelinezDebugger.__frame2fileline6  s*    ||##r   c                 X    | j                   j                          | j                          y r   )r>   set_continuerH   r   s    r   r   zDebugger.cont<  s    r   c                 X    | j                   j                          | j                          y r   )r>   r   rH   r   s    r   r   zDebugger.step@      r   c                 n    | j                   j                  | j                         | j                          y r   )r>   set_nextr   rH   r   s    r   r   zDebugger.nextD  s"    $**%r   c                 n    | j                   j                  | j                         | j                          y r   )r>   
set_returnr   rH   r   s    r   r   zDebugger.retH  s"    DJJ'r   c                 X    | j                   j                          | j                          y r   )r>   set_quitrH   r   s    r   rL   zDebugger.quitL  r   r   c                 R    | j                   j                  j                  ddd       y )Nr   r   1)rI   r   r   r   s    r   rH   zDebugger.abort_loopP  s    		%!2C8r   c                    | j                   s| j                  j                         rqt        | j                  | j
                  |       x| _         }| j                  r<| j                  j                  | j                  d       \  }}|j                  ||       y y | j                   }|r1| j                  j                         sd | _         |j                          d| j                  d<   y )Nrg   rs   )rP   r   r   StackViewerr   rw   r   r>   r   r   rQ   )r   r   r   r   s       r   r   zDebugger.show_stackS  s    DKKOO$5$/TZZ$NNDrzz88--djj$?qeQ'  !!B$++//+#' 
$%DKK!r   c                 Z    | j                   j                         r| j                          y y r   )r   r   r   r   s    r   r   zDebugger.show_source`  s#    <<!!# r   c                 8    |d   | _         | j                          y Nr   )r   r   )r   	stackitems     r   
show_framezDebugger.show_framed  s    q\
r   c                     | j                   }| j                  j                         r|sDt        | j                  d      | _         n(|r&d | _         |j                          d| j                  d<   | j                          y )Nrn   rg   rs   )localsviewerr   r   NamespaceViewerr   rQ   r   )r   lvs     r   r   zDebugger.show_localsh  sa    <<$3DLL($K!$(!
)*X&r   c                     | j                   }| j                  j                         r|sDt        | j                  d      | _         n(|r&d | _         |j                          d| j                  d<   | j                          y )Nro   rg   rs   )globalsviewerr   r   r   r   rQ   r   )r   gvs     r   r   zDebugger.show_globalst  sa    ==%4T]]I%N"%)"
*+h'r   c                 l   | j                   }| j                  }| j                  }|sd x}}n"|j                  }|j                  }|r|r||u rd }|r1|j                  ||| j                  j                  j                         |r2|j                  ||| j                  j                  j                         y y r   )	r   r   r   f_locals	f_globals	load_dictr=   interprpcclt)r   forcer   r   r   ldictgdicts          r   r   zDebugger.show_variables  s    

  EENNEOOEbUe^LLt||':':'A'ABLLt||':':'A'AB r   c                 <    | j                   j                  ||       y)zzSet a filename-lineno breakpoint in the debugger.

        Called from self.load_breakpoints and EW.setbreakpoint
        N)r>   	set_breakr   r8   r9   s      r   set_breakpointzDebugger.set_breakpoint  s    
 	8V,r   c                 <    | j                   j                  ||       y r   )r>   clear_breakr   s      r   clear_breakpointzDebugger.clear_breakpoint  s    Xv.r   c                 :    | j                   j                  |       y r   )r>   clear_all_file_breaks)r   r8   s     r   clear_file_breakszDebugger.clear_file_breaks  s    &&x0r   c                     | j                   j                  j                  D ]<  }|j                  j                  }	 |j
                  D ]  }| j                  ||        > y# t        $ r Y Kw xY w)z>Load PyShellEditorWindow breakpoints into subprocess debugger.N)r=   rw   inversedictior8   breakpointsr   r   )r   editwinr8   r9   s       r   load_breakpointszDebugger.load_breakpoints  sn    ||))55 	Gzz**H%11 :F''&9:	
 " s   #A!!	A-,A-r   )r   )"r    r!   r"   r#   r   r   r   r   rP   r   r   r   rE   rQ   r?   r   r   r   r   r   r   r   rL   rH   r   r   r   r   r   r   r   r   r   r    r   r   r;   r;   U   s    
 FGGHKLM$'%R$J X0d6 9&$

C -/1r   r;   c                   H    e Zd ZdZd ZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zy)r   z#Code stack viewer for debugger GUI.c                     t        j                         rt        j                  | |       nt        j                  | |d       || _        || _        g | _        y )NP   )width)r   isAquaTkr   r   rw   r   r   )r   masterrw   r   s       r   r   zStackViewer.__init__  sE    ?? !!$/!!$b9

r   Nc                    || _         | j                          t        t        |            D ]  }||   \  }}	 |j                  d   }|j
                  }|j                  }|j                  }	dd l}
|
j                  ||      }|j                         }|	dv r	d|||fz  }n	d||	||fz  }||k(  rd|z   }| j                  |        || j                  |       y y #  d}Y xY w)Nr    r0   r   )r0   r   Nz%s, line %d: %sz%s.%s(), line %d: %sz> )r   clearrangelenr   r(   r)   r6   	linecachegetlinestripr   select)r   r   indexr   r   r9   modnamer7   r8   funcnamer  
sourcelineitems                r   r   zStackViewer.load_stack  s    


s5z" 	A!!HME6//*5 <<D''H||H"**8V<J#))+J?*(GVZ+HH-(171E EEzd{KK'	( KK !s   CCc                 H    | j                   rt        j                  | |      S yOverride base method.N)r   r   popup_eventrT   s     r   r  zStackViewer.popup_event  s!    ::++D%88 r   c                     | j                   }|j                  d| j                         |j                  d| j                         y)r  zGo to source line)labelr]   zShow stack frameN)menuadd_commandgoto_source_lineshow_stack_frame)r   r  s     r   	fill_menuzStackViewer.fill_menu  sI    yy2!%!6!6 	 	81!%!6!6 	 	8r   c                     d|cxk  rt        | j                        k  r,n y| j                  j                  | j                  |          yy)r  r   N)r  r   r   r   r   r	  s     r   	on_selectzStackViewer.on_select  s7    'DJJ'HH

5 12 (r   c                 &    | j                  |       yr  )r   r  s     r   	on_doublezStackViewer.on_double  s    r   c                 \    | j                   j                  d      }| j                  |       y )Nactive)listboxr	  r   r  s     r   r  zStackViewer.goto_source_line  s$    ""8,r   c                     | j                   j                  d      }d|cxk  rt        | j                        k  r,n y | j                  j                  | j                  |          y y )Nr  r   )r   r	  r  r   r   r   r  s     r   r  zStackViewer.show_stack_frame  sK    ""8,'DJJ'HH

5 12 (r   c                 8   d|cxk  rt        | j                        k  sy  y | j                  |   \  }}|j                  }|j                  }t        j
                  j                  |      r0| j                  j                  |      }|r|j                  |       y y y r   )
r  r   r(   r)   r3   r4   isfilerw   opengotoline)r   r	  r   r9   r7   r8   edits          r   r   zStackViewer.show_source  s    U,S_, -

5)v||##77>>(#::??8,Df%  $r   r   )r    r!   r"   r#   r   r   r  r  r  r  r  r  r   r   r   r   r   r     s2    )
49
83
  3
	&r   r   c                   *    e Zd ZdZddZdZddZd Zy)	r   z/Global/local namespace viewer for debugger GUI.Nc           
         d}d}|rdt        |      z  }|| _        || _        dd l}|j	                         | _        d| j
                  _        d| j
                  _        t        |      x| _	        }| j                  j                  dd       t        ||dd	
      | _        | j                  j                  d       t        |d      x| _        }|j                  dd       t        |t!        dt#        d|            dd||f      x| _        }	|	j                  ddd       |	j&                  |d<   |j(                  |	d<   t        |	      x| _        }
|	j-                  dd|
d      | _        | j1                  |       y )Nr   (      <   rg   rt   ru      groove)r\   borderwidthreliefrp   )rq   vbar)namerighty)rf   rq   ,  )rs   scrollregionre   )rf   rq   rv   r]   yscrollcommandnw)windowrZ   )r  r   titlereprlibReprrepr	maxstringmaxotherr   r   r}   r   r  r   r0  Canvasminmaxcanvasyviewr   subframecreate_windowsfidr   )r   r   r9  odictr   rs   r:  r   r0  rB  rD  s              r   r   zNamespaceViewer.__init__  sW   E
]F
LLN	 				"6]*
U

qv.5u!HM


S!$U88	D		wS	)%e-0c"fo-F45q%3H J 	Jf 	fQ7 ,,Y#'88 #(=0((Aht(L	ur   r   c                 x   || j                   u r|sy | j                  }| j                  }t        |j                  j                               D ]  }|j                           d | _         |s!t        |d      }|j                  dd       n|j                         }t        |      }	d}
|	D ]  }||   }| j                  j                  |      }|r|dd }t        ||      }|j                  |
dd       t        |dd	      }|j                  d|       |j                  |
dd       |
dz   }
 || _         |j                          |j                         }|j!                         }| j"                  }dd||f| j"                  d
<   |dkD  rd|d<   |j%                  d       y ||d<   |j%                  d       y )NNoner   r   rj   rg   r   r7  )rk   rl   sticky)r   r.  r5  r4  rs   )rv   )
prev_odictrD  r   listchildrenvaluesrS   r   r   keyssortedr<  Entryinsertupdate_idletaskswinfo_reqwidthwinfo_reqheightrB  r}   )r   rG  r   
rpc_clientrD  r   cl	keys_listnamesrk   r1  r   svaluer   rs   rB  s                    r   r   zNamespaceViewer.load_dict  s   DOO#E==

h''..01 	AIIK	hV,AFFqF# 

I9%EC d. #Ab\F(.3q6(!;F#3q6!e  !!#'')))+'(!UF&;N#C<"F8JJaJ %F8JJaJ r   c                 8    | j                   j                          y r   )r   rS   r   s    r   rQ   zNamespaceViewer.closeR  s    

r   r   )r   N)r    r!   r"   r#   r   rK  r   rQ   r   r   r   r   r     s    56 J4!lr   r   __main__)mainzidlelib.idle_test.test_debuggerr,  F)	verbosityexit)r#   bdbr3   tkintertkinter.ttkr   r   r&   r   idlelib.scrolledlistr   idlelib.windowr   Bdbr
   r   r   r;   r   r   r    unittestr^  r   r   r   <module>rh     s   "  	  (  - )7#'' 7:(	P Pf
Q&, Q&hW Wt z	*aeD r   