t˼IdZddlZddlZddlddlmZmZddlmZddl m Z ddl m Z Gdd ejZd Zd ZGd d ZGdde ZGddZedk(rddlmZedddyy)aDebug 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.eZdZdZfdZdZdZxZS)Idbz6Supply user_line and user_exception functions for Bdb.c0||_t| yN)guisuper__init__)selfr __class__s 7/opt/alt/python312/lib64/python3.12/idlelib/debugger.pyrz Idb.__init__ s ct|r|jyt|} |jj ||y#t $rYywxYw)zmHandle a user stopping or breaking at a line. Convert frame to a string and send it to gui. N) _in_rpc_codeset_step_frame2messager interactionTclError)rframemessages r user_linez Idb.user_line$sM   MMO  '  HH % 0   sA AAct|r|jyt|}|jj |||y)z)Handle an the occurrence of an exception.N)rrrr r)rrexc_infors ruser_exceptionzIdb.user_exception2s6   MMO  ' WeX6r)__name__ __module__ __qualname____doc__rrr __classcell__)rs@rr r s< 7rr c|jjjdry|j}|y|jj}d|vrd|vryt |S)z)Determine if debugger is within RPC code.zrpc.pyTFidlelibdebugger)f_code co_filenamecountf_backr)r prev_frame prev_names rrr:s_ ||%%h/\\  %%11  !jI&=J''rc|j}|j}|j}tjj |}|d|}|j dk7r|d|j d}|S)z"Return a message string for frame.:?: z())r(r)f_linenoospathbasenameco_name)rcodefilenamelinenor5rs rrrIsj <s rrzDebugger.__init__cs@ ;d)C    rcjdkDr1jjjdfdy d_j j d_S#d_wxYw)zRun the debugger.rdc"jSr )run)argsrsrzDebugger.run..s4rNTF)rA abort_looprootafterr@r>rE)rrFs``rrEz Debugger.runusc>    ! OO  IIOOC!8 9  %#D 488<<&$D uD s A++ A4cT |j|jr|jj y|j r!|j j d|_|jj|jjy#t$rYwxYw)zClose the debugger and window.N) quit Exceptionr@topbell stackviewercloser=close_debuggerdestroyrevents rrQzDebugger.closes  IIK    HHMMO        " " $d&6 ##%    sB B'&B'cJ |j}|j|_|jx|_}t|x|_}|jj d|jj d|jd|j|jjd|jt|x|_ }|jjdgx|_ }t|d|jx|_}|j#|t|d |j$x|_}|j#|t|d |j(x|_}|j#|t|d |j,x|_}|j#|t|d |j0x|_}|j#||D]&}|j3d |jd(t|x|_}|j4jd|j6s5t9||j:_|j6j=dt?|d|j@|j6|_!|jBjEdd|jFst9||j:_#t?|d|jH|jF|_%|jJjEdd|jLs5t9||j:_&|jLj=dt?|d|jN|jL|_(|jPjEdd|jRst9||j:_)t?|d|jT|jR|_+|jVjEddtY|d|_-|jZjdtY|d|_.|j\jdd|j\j_d|_0t|d|_1|jbjddt||_2|jdjddt|d|_3|jfjdd|j6jir|jA|jLjir|jO|jRjir|jUyy) z$Draw the debugger gui on the screen.z Debug ControlDebugWM_DELETE_WINDOWzw)anchorGo)textcommandStepOverOutQuitdisabledstateleft)sideStack)r\r]variablerrowcolumnSourceLocalsGlobalsx)rZfill background)heightbothexpandrqN)5r=flistrIrrNwm_title wm_iconname wm_protocolrQbindrbframepackbuttonsButtoncontbcontappendstepbstepnextbnextretbretrL configurecframevstack BooleanVarrset Checkbutton show_stackbstackgridvsource show_sourcebsourcevlocals show_localsblocalsvglobals show_globalsbglobalsLabelstatuserrorcgeterrorbgfstackflocalsfglobalsget)rr=rIrNr|blbrs rr?zDebugger.make_guis(,,]] "<<' D'--3 /* W% *DJJ7  j$**-$Sz) f $ rT499EE Q ! VTYYGG Q ! VTYYGG Q ! vE488DD A ! vFDIIFF A ! A KKjK ) FFF  %V}, f f%{{$.sODNN ! KKOOA !&$//DKKI  Qq)||%/_DNN ""64#3#3dllL  a*||%/_DNN " LL  Q "64#3#3dllL  a*}}&0oDNN ##FD$5$5 O  q+C,  $3s+  s-zz|4 C*  /Sz  0c!,  !&1 ;;??  OO  <<        ==        rc0||_|jj||r |\}}} |j}| |d|}d}nd}d}|j }|jj|||j} | r;|jj|j|\} } | j| | |jd|jjr|j|j D]} | jd |j"j%|xj&dz c_|j(j*j-d d |xj&dzc_|j D]} | jd |jjd|jjd|j d|_y#t$rdt |z}YwxYw#YxYw) Nr\z%sr1yellow)r\rrrgnormalrcvwait::idledebugwaitrb)rrrr AttributeErrorstrrrrPr> get_stack load_stackshow_variablesrrsync_source_liner~rNwakeuprArItkcall) rrrinfotypevaluetbm1bgsvstackirs rrzDebugger.interactions  7+ "OD% &]] 4r%)BBBBB "4    xx))$**b9HE1 MM% # A <<     ! ! #A KKhK '  a '#45 aA KKjK ) 2& "> Q" &CI% & s G2H2H  H Hc|j}|sy|j|\}}|dd|ddzdk7r=tjj |r|j j ||yyy)Nrgz<>)r_Debugger__frame2fileliner3r4existsrw gotofileline)rrr8r9s rrzDebugger.sync_source_line.sk  007& BQ<(23- '4 /BGGNN84L JJ # #Hf 55M /rcR|j}|j}|j}||fSr )r(r)r2)rrr7r8r9s r__frame2filelinezDebugger.__frame2fileline6s*||##rcX|jj|jyr )r> set_continuerHrs rrz Debugger.cont<s  rcX|jj|jyr )r>rrHrs rrz Debugger.step@  rcn|jj|j|jyr )r>set_nextrrHrs rrz Debugger.nextDs" $**% rcn|jj|j|jyr )r> set_returnrrHrs rrz Debugger.retHs" DJJ' rcX|jj|jyr )r>set_quitrHrs rrLz Debugger.quitLrrcR|jjjdddy)Nrr1)rIrrrs rrHzDebugger.abort_loopPs %!2C8rc|js|jjrqt|j|j |x|_}|j r<|jj|j d\}}|j||yy|j}|r1|jjsd|_|jd|jd<y)Nrgrs) rPrr StackViewerrrwrr>rrrQ)rrrrs rrzDebugger.show_stackSsDKKOO$5$/ TZZ$N ND rzz88--djj$?q eQ'!!B$++//+#'  $%DKK !rcZ|jjr|jyyr )rrrrs rrzDebugger.show_source`s# <<     ! ! # rc8|d|_|jyNr)rr)r stackitems r show_framezDebugger.show_framedsq\  rc|j}|jjr|sDt|jd|_n(|r&d|_|j d|jd<|j y)Nrnrgrs) localsviewerrrNamespaceViewerrrQr)rlvs rrzDebugger.show_localshsa    <<   $3DLL($K!$(! )* X& rc|j}|jjr|sDt|jd|_n(|r&d|_|j d|jd<|j y)Nrorgrs) globalsviewerrrrrrQr)rgvs rrzDebugger.show_globalstsa    ==   %4T]]I%N"%)" *+ h' rcl|j}|j}|j}|sdx}}n"|j}|j}|r|r||urd}|r1|j |||j jj|r2|j |||j jjyyr ) rrrf_locals f_globals load_dictr=interprpcclt)rforcerrrldictgdicts rrzDebugger.show_variabless        EENNEOOEbUe^ LLt||':':'A'A B LLt||':':'A'A B rc<|jj||y)zzSet a filename-lineno breakpoint in the debugger. Called from self.load_breakpoints and EW.setbreakpoint N)r> set_breakrr8r9s rset_breakpointzDebugger.set_breakpoints 8V,rc<|jj||yr )r> clear_breakrs rclear_breakpointzDebugger.clear_breakpoints Xv.rc:|jj|yr )r>clear_all_file_breaks)rr8s rclear_file_breakszDebugger.clear_file_breakss &&x0rc|jjjD]<}|jj} |j D]}|j ||>y#t$rYKwxYw)z>Load PyShellEditorWindow breakpoints into subprocess debugger.N)r=rw inversedictior8 breakpointsrr)reditwinr8r9s rload_breakpointszDebugger.load_breakpointssd||))55Gzz**H %11F''&926 "  s#A!! A-,A-r )r)"r r!r"r#rrrrrPrrrrErQr?rrrrrrrrLrHrrrrrrrrrrrrr;r;Us FGGHKLM$'%R$J X0d6 9 &$  C -/1rr;cHeZdZdZdZd dZdZdZdZdZ d Z d Z d Z y) rz#Code stack viewer for debugger GUI.ctjrtj||ntj||d||_||_g|_y)NP)width)risAquaTkrrrwr r)rmasterrwr s rrzStackViewer.__init__sE ??   ! !$ /  ! !$b 9  rNc||_|jtt|D]}||\}} |jd}|j }|j }|j} ddl} | j||} | j} | dvr d||| fz} n d|| || fz} ||k(rd| z} |j| ||j|yy#d}YxYw)Nr r0r)r0rNz%s, line %d: %sz%s.%s(), line %d: %sz> ) rclearrangelenrr(r)r6 linecachegetlinestriprselect) rrindexrrr9modnamer7r8funcnamer sourcelineitems rrzStackViewer.load_stacks  s5z"A!!HME6 //*5<>( #::??8,D f% $rr ) r r!r"r#rrrrrrrrrrrrrrs2) 49 83   3 &rrc*eZdZdZddZdZddZdZy) rz/Global/local namespace viewer for debugger GUI.Nc d}d}|rdt|z}||_||_ddl}|j |_d|j _d|j _t|x|_ }|jjddt||dd |_ |jjd t|d x|_}|jddt|t!dt#d|dd||fx|_} | jddd| j&|d<|j(| d<t| x|_} | j-dd| d|_|j1|y)Nr(<rgrtrugroove)r\ borderwidthreliefrp)rqvbar)namerighty)rfrq,)rs scrollregionre)rfrqrvr]yscrollcommandnw)windowrZ)rrtitlereprlibReprrepr maxstringmaxotherrrr}rrrr0Canvasminmaxcanvasyviewrsubframe create_windowsfidr) rrr9odictrrsr:rr0rBrDs rrzNamespaceViewer.__init__sW E ]F  LLN    "6]* U qv.5u!HM  S!$U88 D wS )%e-0c"fo-F45q%3H J J f  fQ 7 ,,Y#'88 #(=0 ((Aht(L  urrcx||jur|sy|j}|j}t|jj D]}|j d|_|s!t|d}|jddn|j}t|} d} | D]} || } |jj| } |r| dd} t|| }|j| ddt|dd }|jd| |j| dd| dz} ||_|j|j}|j!}|j"}dd||f|j"d <|d kDrd |d <|j%d y||d <|j%d y)NNonerrrjrgrr7)rkrlsticky)rr.r5r4rs)rv) prev_odictrDrlistchildrenvaluesrSrrkeyssortedr<Entryinsertupdate_idletaskswinfo_reqwidthwinfo_reqheightrBr})rrGr rpc_clientrDrcl keys_listnamesrkr1rsvaluerrsrBs rrzNamespaceViewer.load_dicts DOO #E == h''..01A IIK2hV,A FFqF # I9%ECd .#Ab\F(.3q6(!;F#3q6!e !!#'')))+'(!UF&; N# C<"F8  JJaJ %F8  JJaJ rc8|jjyr )rrSrs rrQzNamespaceViewer.closeRs rr )rN)r r!r"r#rrKrrQrrrrrs56J4!lrr__main__)mainzidlelib.idle_test.test_debuggerr,F) verbosityexit)r#bdbr3tkinter tkinter.ttkrrr&ridlelib.scrolledlistridlelib.windowrBdbr rrr;rrr unittestr^rrrrhs" (-)7#''7: ( PPf Q&,Q&hWWt z *aeDr