Ë tïÚ›~^ ãó$—dZddlZddlZddlmZdZdadZiZiZ iZ iZ d„Z d„Z Gd„d «ZGd „d «Zd „ZGd „d«ZGd„d«ZGd„d«ZGd„d«ZGd„d«Zd„Zd„Zd„Zd„Zedk(rddlmZeddd¬ «yy)!aÎSupport for remote Python debugging. Some ASCII art to describe the structure: IN PYTHON SUBPROCESS # IN IDLE PROCESS # # oid='gui_adapter' +----------+ # +------------+ +-----+ | GUIProxy |--remote#call-->| GUIAdapter |--calls-->| GUI | +-----+--calls-->+----------+ # +------------+ +-----+ | Idb | # / +-----+<-calls--+------------+ # +----------+<--calls-/ | IdbAdapter |<--remote#call--| IdbProxy | +------------+ # +----------+ oid='idb_adapter' # The purpose of the Proxy and Adapter classes is to translate certain arguments and return values that cannot be transported through the RPC barrier, in particular frame and traceback objects. éN)ÚdebuggerÚ idb_adapterÚ gui_adaptercó.—t|«}|t|<|S©N)ÚidÚ frametable)ÚframeÚfids ú)/usr/lib/python3.12/idlelib/debugger_r.pyÚ wrap_framer (s€Ü ˆU‹)€CØ„Jˆs�OØ €JócóŒ—|€y|d}t|tj«sJ‚t|«}|t|<|d|d|f}|S)z0replace info[2], a traceback instance, by its IDNéré)Ú isinstanceÚtypesÚ TracebackTyperÚtracebacktable)ÚinfoÚ tracebackÚ traceback_idÚ modified_infos r Ú wrap_infor-sV€à €|Øà˜‘Gˆ ܘ)¤U×%8Ñ%8Ô9Ð9Ð9ܘ)“}ˆ Ø'0Œ�|Ñ$ؘa™ $ q¡'¨<Ð8ˆ ØÐrcó—eZdZd„Zdd„Zy)ÚGUIProxycó —||_||_yr)ÚconnÚoid)ÚselfrÚ gui_adap_oids r Ú__init__zGUIProxy.__init__;s€ØˆŒ ؈�rNc ó~—|jj|jd|t|«t |«fi«y)NÚ interaction)rÚ remotecallrr r)r Úmessager rs r r$zGUIProxy.interaction?s4€ð � ‰ ×јTŸX™X }Ø%¤z°%Ó'8¼)ÀD»/ÐJØõ !rr©Ú__name__Ú __module__Ú __qualname__r"r$©rr rr9s „ò ô!rrcó„—eZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zy)Ú IdbAdaptercó—||_yr)Úidb)r r/s r r"zIdbAdapter.__init__Hs €Øˆ�rcó8—|jj«yr)r/Úset_step©r s r r1zIdbAdapter.set_stepMó€Ø �‰×ÑÕrcó8—|jj«yr)r/Úset_quitr2s r r5zIdbAdapter.set_quitPr3rcó8—|jj«yr)r/Ú set_continuer2s r r7zIdbAdapter.set_continueSs€Ø �‰×ÑÕrcóL—t|}|jj|«yr)r r/Úset_next©r r r s r r9zIdbAdapter.set_nextVs€Ü˜3‘ˆØ �‰×ј%Õ rcóL—t|}|jj|«yr)r r/Ú set_returnr:s r r<zIdbAdapter.set_returnZs€Ü˜3‘ˆØ �‰×јEÕ"rcóÀ—t|}|€d}n t|}|jj||«\}}|D��cgc]\}}t |«|f‘Œ}}}||fScc}}wr)r rr/Ú get_stackr ) r r Útbidr ÚtbÚstackÚiÚframe2Úks r r>zIdbAdapter.get_stack^sj€Ü˜3‘ˆØ ˆ<؉Bä Ñ%ˆBØ—8‘8×%Ñ% e¨RÓ0‰ˆˆqÙ:?Ô@¹%©Y¨V°Q”*˜VÓ$ aÒ(¸%ˆÑ@Ø�aˆxˆùóAs¼AcóX—ddl}|jj||j«y)Nr)Ú__main__r/ÚrunÚ__dict__)r ÚcmdrFs r rGzIdbAdapter.runhs€ÛØ �‰� ‰ �S˜(×+Ñ+Õ,rcó>—|jj||«}|Sr)r/Ú set_break©r ÚfilenameÚlinenoÚmsgs r rKzIdbAdapter.set_breakls€Ø�h‰h× Ñ  ¨6Ó2ˆØˆ rcó>—|jj||«}|Sr)r/Ú clear_breakrLs r rQzIdbAdapter.clear_breakps€Ø�h‰h×"Ñ" 8¨VÓ4ˆØˆ rcó<—|jj|«}|Sr)r/Úclear_all_file_breaks©r rMrOs r rSz IdbAdapter.clear_all_file_breaksts€Ø�h‰h×,Ñ,¨XÓ6ˆØˆ rcó,—t|}t||«Sr)r Úgetattr)r r Únamer s r Ú frame_attrzIdbAdapter.frame_attrzs€Ü˜3‘ˆÜ�u˜dÓ#Ð#rcóX—t|}|j}t|«}|t|<|Sr)r Ú f_globalsrÚ dicttable)r r r ÚgdictÚdids r Ú frame_globalszIdbAdapter.frame_globals~s+€Ü˜3‘ˆØ—‘ˆÜ�‹iˆØŒ �#‰Øˆ rcóX—t|}|j}t|«}|t|<|Sr)r Úf_localsrr[)r r r Úldictr]s r Ú frame_localszIdbAdapter.frame_locals…s+€Ü˜3‘ˆØ—‘ˆÜ�‹iˆØŒ �#‰Øˆ rcóX—t|}|j}t|«}|t|<|Sr)r Úf_coderÚ codetable)r r r ÚcodeÚcids r Ú frame_codezIdbAdapter.frame_codeŒs+€Ü˜3‘ˆØ�|‰|ˆÜ�‹hˆØŒ �#‰Øˆ rcó,—t|}|jSr)reÚco_name©r rgrfs r Ú code_namezIdbAdapter.code_name•s€Ü˜‰~ˆØ�|‰|Ðrcó,—t|}|jSr)reÚ co_filenamerks r Ú code_filenamezIdbAdapter.code_filename™s€Ü˜‰~ˆØ×ÑÐrcó—td«‚)Nz"dict_keys not public or pickleable)ÚNotImplementedError©r r]s r Ú dict_keyszIdbAdapter.dict_keysŸs€Ü!Ð"FÓGÐGrcóB—tt|j««Sr)Úlistr[Úkeysrrs r Údict_keys_listzIdbAdapter.dict_keys_list¦s€Ü”I˜c‘N×'Ñ'Ó)Ó*Ð*rcóD—t||}tj|«Sr)r[ÚreprlibÚrepr)r r]ÚkeyÚvalues r Ú dict_itemzIdbAdapter.dict_item©s€Ü˜#‘˜sÑ#ˆÜ�|‰|˜EÓ"Ð"rN)r(r)r*r"r1r5r7r9r<r>rGrKrQrSrXr^rbrhrlrorsrwr}r+rr r-r-Fsg„òò òò ò!ò#òò-òòòò $òòòòò ò Hò+ó#rr-có’—t||«}tj|«}t|«}|j t |«t S)a|Start the debugger and its RPC link in the Python subprocess Start the subprocess side of the split debugger and set up that side of the RPC link by instantiating the GUIProxy, Idb debugger, and IdbAdapter objects and linking them together. Register the IdbAdapter with the RPCServer to handle RPC requests from the split debugger GUI via the IdbProxy. )rrÚIdbr-ÚregisterÚ idb_adap_oid)Ú rpchandlerr!Ú gui_proxyr/Úidb_adaps r Ústart_debuggerr…°s=€ô˜ \Ó2€IÜ �,‰,�yÓ !€Cܘ#‹€HØ×Ñœ  hÔ/Ü Ðrcó0—eZdZd„Zd„Zd„Zd„Zd„Zd„Zy)Ú FrameProxycó<—||_||_d|_i|_y)Nr)Ú_connÚ_fidÚ_oidÚ _dictcache)r rr s r r"zFrameProxy.__init__Ès€ØˆŒ ؈Œ Ø!ˆŒ ؈�rcó—|dddk(r t|«‚|dk(r|j«S|dk(r|j«S|dk(r|j«S|jj |j d|j|fi«S)NrÚ_rdrZr`rX)ÚAttributeErrorÚ _get_f_codeÚ_get_f_globalsÚ _get_f_localsr‰r%r‹rŠ©r rWs r Ú __getattr__zFrameProxy.__getattr__ÎsŒ€Ø ��ˆ8�sŠ?Ü  Ó&Ð &Ø �8Ò Ø×#Ñ#Ó%Ð %Ø �;Ò Ø×&Ñ&Ó(Ð (Ø �:Ò Ø×%Ñ%Ó'Ð 'Ø�z‰z×$Ñ$ T§Y¡Y° Ø&*§i¡i°Ð%6¸ó<ð )r¸rŠr‡r)r r r?rArBr rDs r r>zIdbProxy.get_stack6sS€à—9‘9˜[¨%¯*©*°dÓ;‰ˆˆqÙ?DÔE¹u±V°S¸!”*˜TŸY™Y¨Ó,¨aÒ0¸uˆÑEØ�aˆxˆùóFs¦"Acó&—|jd«y)Nr7©r¸r2s r r7zIdbProxy.set_continue<s€Ø � ‰ �.Õ!rcó&—|jd«y)Nr1rÁr2s r r1zIdbProxy.set_step?ó€Ø � ‰ �*Õrcó<—|jd|j«y)Nr9©r¸rŠ©r r s r r9zIdbProxy.set_nextBs€Ø � ‰ �*˜eŸj™jÕ)rcó<—|jd|j«y)Nr<rÅrÆs r r<zIdbProxy.set_returnEs€Ø � ‰ �, § ¡ Õ+rcó&—|jd«y)Nr5rÁr2s r r5zIdbProxy.set_quitHrÃrcó,—|jd||«}|S)NrKrÁrLs r rKzIdbProxy.set_breakKs€Ø�i‰i˜  X¨vÓ6ˆØˆ rcó,—|jd||«}|S)NrQrÁrLs r rQzIdbProxy.clear_breakOs€Ø�i‰i˜  x°Ó8ˆØˆ rcó*—|jd|«}|S)NrSrÁrTs r rSzIdbProxy.clear_all_file_breaksSs€Ø�i‰iÐ/°Ó:ˆØˆ rN)r(r)r*r"r¸rGr>r7r1r9r<r5rKrQrSr+rr r±r±$s>„òò ò +ò ò "òò*ò,òòòórr±cóÊ—|jddtfi«at||t«}t j ||«}t ||«}|jt|«|S)a]Start the subprocess debugger, initialize the debugger GUI and RPC link Request the RPCServer start the Python subprocess debugger and link. Set up the Idle side of the split debugger by instantiating the IdbProxy, debugger GUI, and debugger GUIAdapter objects and linking them together. Register the GUIAdapter with the RPCClient to handle debugger GUI interaction requests coming from the subprocess debugger via the GUIProxy. The IdbAdapter will pass execution and environment requests coming from the Idle debugger GUI to the subprocess debugger via the IdbProxy. ÚexecÚstart_the_debugger)r%r!r�r±rÚDebuggerr¬r€)ÚrpccltÚpyshellÚ idb_proxyr®Úgui_adaps r Ústart_remote_debuggerrÔWs_€ð ×$Ñ$ VÐ-AÜ$0 ?°Bó8€L䘠¬,Ó7€IÜ × Ñ ˜G YÓ /€Cܘ& #Ó&€HØ ‡O�O”L (Ô+Ø €JrcóD—t|«|jt«y)a]Shut down subprocess debugger and Idle side of debugger RPC link Request that the RPCServer shut down the subprocess debugger and link. Unregister the GUIAdapter, which will cause a GC on the Idle process debugger and RPC link objects. (The second reference to the debugger GUI is deleted in pyshell.close_remote_debugger().) N)Úclose_subprocess_debuggerÚ unregisterr!©rÐs r Úclose_remote_debuggerrÙos€ô˜fÔ%Ø ×Ñ”lÕ#rcó6—|jddtfi«y)NrÍÚstop_the_debugger)r%r�rØs r rÖrÖ{s€Ø ×Ñ�fÐ1´L°?ÀBÕGrcóV—|jddtfi«}|tk(sJd«‚y)NrÍrÎz Idb restarted with different oid)r%r!r�)rÐÚidb_adap_oid_rets r Úrestart_subprocess_debuggerrÞ~s3€Ø×(Ñ(¨Ð1EÜ*6¨¸"ó>Ðà œ|Ò +ÐOÐ-OÓOÑ +rrF)Úmainz!idlelib.idle_test.test_debugger_rrF)Ú verbosityÚexit)Ú__doc__ryrÚidlelibrÚ debuggingr�r!r r[rerr rrr-r…r‡r–rœr¬r±rÔrÙrÖrÞr(Úunittestrßr+rr ÚræsÉðñó*Û Ýà € à€ Ø€ ð € Ø € Ø € Ø€òò ÷ !ñ !÷e#ñe#òT÷,'ñ'÷T ;ñ ;÷ #ñ#÷0 <ñ <÷1ñ1òfò0 $òHòPð  ˆzÒÝÙÐ ,¸ÀÖFðr