|@ "@IdZddlZddlZddlTddlmZmZddlmZddl m Z ddl m Z Gdd ej Zd Zd ZGd d ZGdde ZGddZedkrddlmZeddddSdS)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.cV||_tdSN)guisuper__init__)selfr __class__s 7/opt/alt/python311/lib64/python3.11/idlelib/debugger.pyrz Idb.__init__ s& ct|r|dSt|} |j||dS#t $rYdSwxYw)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$sx     MMOOO F ''  H % 0 0 0 0 0    DD sA A! A!ct|r|dSt|}|j|||dS)z)Handle an the occurrence of an exception.N)rrrr r)rrexc_infors ruser_exceptionzIdb.user_exception2sQ     MMOOO F '' WeX66666r)__name__ __module__ __qualname____doc__rrr __classcell__)rs@rr r s\<<   7777777rr c|jjdrdS|j}|dS|jj}d|vrd|vrdSt |S)z)Determine if debugger is within RPC code.zrpc.pyTNFidlelibdebugger)f_code co_filenamecountf_backr)r prev_frame prev_names rrr:si |%%h// (t\  5%1  ! !jI&=&=5J'''rc|j}|j}|j}tj|}|d|}|jdkr |d|jd}|S)z"Return a message string for frame.:?: z())r(r)f_linenoospathbasenameco_name)rcodefilenamelinenor5rs rrrIsj s rrzDebugger.__init__csL ;d))C    rcjdkr5jdfddS d_jjd_S#d_wxYw)zRun the debugger.rdcjSr )run)argsrsrzDebugger.run..s4rNTF)rA abort_looprootafterr@r>rE)rrFs``rrEz Debugger.runus>   ! ! OO    IOOC!8!8!8!8!8 9 9 9 F %#D 48<&$D  uD  $ $ $ $s A!! A*cH |n#t$rYnwxYw|jr|jdS|jr |jd|_|j|j dS)zClose the debugger and window.N) quit Exceptionr@topbell stackviewercloser=close_debuggerdestroyrevents rrQzDebugger.closes  IIKKKK    D     HMMOOO F   >   " " $ $ $d&6 ##%%% s  $$c |j}|j|_|jx|_}t|x|_}|jd|jd|d|j|j d|jt|x|_ }|j dgx|_ }t|d|jx|_}||t|d |jx|_}||t|d |jx|_}||t|d |jx|_}||t|d |jx|_}|||D].}|d | d/t|x|_}|j d|js3t9||j_|jdt?|d|j |j|_!|j!"dd|j#st9||j_#t?|d|j$|j#|_%|j%"dd|j&s3t9||j_&|j&dt?|d|j'|j&|_(|j("dd|j)st9||j_)t?|d|j*|j)|_+|j+"ddtY|d|_-|j- dtY|d|_.|j. dd|j./d|_0t|d|_1|j1 ddt||_2|j2 ddt|d|_3|j3 dd|j4r| |j&4r|'|j)4r|*dSdS) 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%%% *DJ777  j$*---$Szz) f $$$ rT49EEEE Q ! VTYGGGG Q ! VTYGGGG Q ! vE48DDDD A ! vFDIFFFF A !   A KKjK ) ) ) FFF    $V}}, f f%%%{ $.sOODN ! KOOA   !&$/DKIII  Qq)))| 5%/__DN ""64#3dlLLL  a***| %/__DN " L  Q   "64#3dlLLL  a***} 6&0ooDN ##FD$5 OOO  q+++C,,,  $$$3s+++  s---z|44 C***  ///Szz  000c!,,,  !&111 ;??    OO    <            =              rc||_|j||rF|\}}} |j}n"#t$rdt |z}YnwxYw| |d|}n#YnxYwd}n d}d}|j}|j|||j} | r9|j |j|\} } | | | | d|j r||jD]} | d |j|xjdz c_|jjd d |xjdzc_|jD]} | d |jd|jd|jd|_dS) Nr\z%sr1yellow)r\rrrgnormalrcvwait::idledebugwaitrb)rrrr AttributeErrorstrrrrPr> get_stack load_stackshow_variablesrrsync_source_liner~rNwakeuprArItkcall) rrrinfotypevaluetbm1bgsvstackirs rrzDebugger.interactions8  7+++  "OD% &]! & & &CII% & ))%))BBDBBBBB "444    $x))$*b99HE1 MM% # # # A <     $  ! ! # # # ( (A KKhK ' ' ' '  a '#4555 a * *A KKjK ) ) ) ) 2&&& ">>> s4AAA!!A%c|j}|sdS||\}}|dd|ddzdkr)r_Debugger__frame2fileliner3r4existsrw gotofileline)rrr8r9s rrzDebugger.sync_source_line.s   F0077& BQB<(233- '4 / /BGNN84L4L / J # #Hf 5 5 5 5 5 0 / / /rc4|j}|j}|j}||fSr )r(r)r2)rrr7r8r9s r__frame2filelinezDebugger.__frame2fileline6s#|#rc`|j|dSr )r> set_continuerHrs rrz Debugger.cont<s,  rc`|j|dSr )r>rrHrs rrz Debugger.step@,  rcl|j|j|dSr )r>set_nextrrHrs rrz Debugger.nextDs0 $*%%% rcl|j|j|dSr )r> set_returnrrHrs rrz Debugger.retHs0 DJ''' rc`|j|dSr )r>set_quitrHrs rrLz Debugger.quitLrrcH|jjddddS)Nrr1)rIrrrs rrHzDebugger.abort_loopPs% %!2C88888rc|js|jrft|j|j|x|_}|jr;|j|jd\}}| ||dSdS|j}|r4|jsd|_| d|jd<dS)Nrgrs) rPrr StackViewerrrwrr>rrrQ)rrrrs rrzDebugger.show_stackSs &DKOO$5$5 &$/ TZ$N$N ND rz (8--dj$??q eQ''''' ( (!B $+//++ #'  $%DK ! ! !rcd|jr|dSdSr )rrrrs rrzDebugger.show_source`s: <     $  ! ! # # # # # $ $rcH|d|_|dSNr)rr)r stackitems r show_framezDebugger.show_frameds%q\  rc|j}|jr|st|jd|_n'|r%d|_|d|jd<|dS)Nrnrgrs) localsviewerrrNamespaceViewerrrQr)rlvs rrzDebugger.show_localshs   <     + L$3DL($K$K! +$(! )* X& rc|j}|jr|st|jd|_n'|r%d|_|d|jd<|dS)Nrorgrs) globalsviewerrrrrrQr)rgvs rrzDebugger.show_globalsts   =     , O%4T]I%N%N" ,%)" *+ h' rrc|j}|j}|j}|sdx}}n|j}|j}|r|r||urd}|r&||||jjj|r(||||jjjdSdSr ) rrrf_locals f_globals load_dictr=interprpcclt)rforcerrrldictgdicts rrzDebugger.show_variabless       EEENEOE b Ue^^  C LLt|':'A B B B  C LLt|':'A B B B B B C Crc<|j||dS)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<|j||dSr )r> clear_breakrs rclear_breakpointzDebugger.clear_breakpoints  Xv.....rc:|j|dSr )r>clear_all_file_breaks)rr8s rclear_file_breakszDebugger.clear_file_breakss &&x00000rc|jjjD]?}|jj} |jD]}|||0#t$rYLoad PyShellEditorWindow breakpoints into subprocess debugger.N)r=rw inversedictior8 breakpointsrr)reditwinr8r9s rload_breakpointszDebugger.load_breakpointss|)5  Gz*H %1::F''&9999:!       s A AAr )r)"r r!r"r#rrrrrPrrrrErQr?rrrrrrrrLrHrrrrrrrrrrrrr;r;Us FGGHKLM$'%'%'%R$J J J X0000d666   999 & & &$$$      CCCC ---///111rr;cJeZdZdZdZd dZdZdZdZdZ d Z d Z d Z dS) rz#Code stack viewer for debugger GUI.ctjrtj||ntj||d||_||_g|_dS)NP)width)risAquaTkrrrwr r)rmasterrwr s rrzStackViewer.__init__s[ ?   :  !$ / / / /  !$b 9 9 9 9  rNc||_|tt|D]}||\}} |jd}n #d}YnxYw|j}|j}|j} ddl} | ||} | } | dvr d||| fz} n d|| || fz} ||krd| z} | | || |dSdS)Nr r0r)r0rNz%s, line %d: %sz%s.%s(), line %d: %sz> ) rclearrangelenrr(r)r6 linecachegetlinestriprselect) rrindexrrr9modnamer7r8funcnamer sourcelineitems rrzStackViewer.load_stacks2  s5zz""  A!!HME6 /*5 |jrtj||SdSOverride base method.N)rr popup_eventrTs rrzStackViewer.popup_events) : 9+D%88 8 9 9rc|j}|d|j|d|jdS)rzGo to source line)labelr]zShow stack frameN)menu add_commandgoto_source_lineshow_stack_frame)rrs r fill_menuzStackViewer.fill_menus_y 2!%!6  8 8 8 1!%!6  8 8 8 8 8rcd|cxkrt|jkr+ndS|j|j|dSdS)rrN)rrr rrr s r on_selectzStackViewer.on_selectsZ  ' ' ' 'DJ ' ' ' ' ' ' H   5 1 2 2 2 2 2 ( 'rc0||dSr)rrs r on_doublezStackViewer.on_doubles rcd|jd}||dS)Nactive)listboxr rrs rrzStackViewer.goto_source_lines1 ""8,, rc|jd}d|cxkrt|jkr+ndS|j|j|dSdS)Nrr)r r rrr rrs rrzStackViewer.show_stack_frameso ""8,,  ' ' ' 'DJ ' ' ' ' ' ' H   5 1 2 2 2 2 2 ( 'rc0d|cxkrt|jksndS|j|\}}|j}|j}tj|r3|j|}|r| |dSdSdSr) rrr(r)r3r4isfilerwopengotoline)rr rr9r7r8edits rrzStackViewer.show_sourcesU,,,,S__,,,, F 5) v|# 7>>( # # &:??8,,D & f%%%%% & & & &rr ) r r!r"r#rrrrrrrrrrrrrrs))   4999 888333       333 & & & & &rrc,eZdZdZddZdZd dZdZdS) rz/Global/local namespace viewer for debugger GUI.Nc @d}d}|rdt|z}||_||_ddl}||_d|j_d|j_t|x|_ }|j ddt||dd |_ |j d t|d x|_}| ddt|t!dt#d|dd||fx|_} | ddd| j|d<|j| d<t| x|_} | dd| d|_||dS)Nr(<rgrtrugroove)r\ borderwidthreliefrp)rqvbar)namerighty)rfrq,)rs scrollregionre)rfrqrvr]yscrollcommandnw)windowrZ)rrtitlereprlibReprrepr maxstringmaxotherrrr}rrrr0Canvasminmaxcanvasyviewrsubframe create_windowsfidr) rrr9odictrrsr:rr0rBrDs rrzNamespaceViewer.__init__s  #E ]F  LLNN    "6]]* U qv...5u!HMMM  S!!!$U8888 D wS )))%e-0c"foo-F-F45q%3H J J J J f  fQ 777 ,Y#'8 #(==0 ((Aht(LL  urrrc||jur|sdS|j}|j}t|jD]}|d|_|s)t|d}|ddn| }t|} d} | D]} || } |j | } |r | dd} t|| }|| ddt|dd }| d| || dd| dz} ||_||}|}|j}dd||f|jd <|d krd |d <|d dS||d <|d dS)NNonerrrjrgrr7)rkrlsticky)rr.r5r4rs)rv) prev_odictrDrlistchildrenvaluesrSrrkeyssortedr<Entryinsertupdate_idletaskswinfo_reqwidthwinfo_reqheightrBr})rrGr rpc_clientrDrcl keys_listnamesrkr1rsvaluerrsrBs rrzNamespaceViewer.load_dicts DO # #E # F= h'..0011  A IIKKKK hV,,,A FFqF # # # # I9%%EC  d ..*#AbD\F(...3q666(!;;;F###3q666!e!!###''))))++'(!UF&; N# C<<"F8  JJaJ %F8  JJaJ rc8|jdSr )rrSrs rrQzNamespaceViewer.closeRs rr )rN)r r!r"r#rrKrrQrrrrrsY556J4!4!4!4!lrr__main__)mainzidlelib.idle_test.test_debuggerr,F) verbosityexit)r#bdbr3tkinter tkinter.ttkrrr&ridlelib.scrolledlistridlelib.windowrBdbr rrr;rrr unittestr^rrrrhs" ((((((((------))))))77777#'777: ( ( (   PPPPPPPPf Q&Q&Q&Q&Q&,Q&Q&Q&hWWWWWWWWt zD *aeDDDDDDr