PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB`  pY.@s)dZddlZddlmZdZdadZiZiZiZ iZ ddZ dd Z Gd d d Z Gd d d ZddZGdddZGdddZGdddZGdddZGdddZddZddZddZd d!ZdS)"aSupport 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_adapterZ gui_adaptercCst|}|t|<|S)N)id frametable)framefidr-/opt/python35/lib/python3.5/RemoteDebugger.py wrap_frame(s  r cCsO|dkrdS|d}t|}|t|<|d|d|f}|SdS)z0replace info[2], a traceback instance, by its IDNr)rtracebacktable)info tracebackZ traceback_id modified_inforrr wrap_info-s    rc@s+eZdZddZdddZdS)GUIProxycCs||_||_dS)N)connoid)selfr gui_adap_oidrrr __init__;s zGUIProxy.__init__NcCs5|jj|jd|t|t|fidS)N interaction)r remotecallrr r)rmessagerrrrr r?szGUIProxy.interaction)__name__ __module__ __qualname__rrrrrr r9s  rc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)S)* IdbAdaptercCs ||_dS)N)idb)rrrrr rHszIdbAdapter.__init__cCs|jjdS)N)rset_step)rrrr r MszIdbAdapter.set_stepcCs|jjdS)N)rset_quit)rrrr r!PszIdbAdapter.set_quitcCs|jjdS)N)r set_continue)rrrr r"SszIdbAdapter.set_continuecCst|}|jj|dS)N)rrset_next)rrrrrr r#Vs zIdbAdapter.set_nextcCst|}|jj|dS)N)rr set_return)rrrrrr r$Zs zIdbAdapter.set_returncCsat|}|dkrd}n t|}|jj||\}}dd|D}||fS)NcSs(g|]\}}t||fqSr)r ).0Zframe2krrr es z(IdbAdapter.get_stack..)rr r get_stack)rrtbidrtbstackirrr r(^s    zIdbAdapter.get_stackcCs&ddl}|jj||jdS)Nr)__main__rrun__dict__)rcmdr-rrr r.hs zIdbAdapter.runcCs|jj||}|S)N)r set_break)rfilenamelinenomsgrrr r1lszIdbAdapter.set_breakcCs|jj||}|S)N)r clear_break)rr2r3r4rrr r5pszIdbAdapter.clear_breakcCs|jj|}|S)N)rclear_all_file_breaks)rr2r4rrr r6tsz IdbAdapter.clear_all_file_breakscCst|}t||S)N)rgetattr)rrnamerrrr frame_attrzs zIdbAdapter.frame_attrcCs-t|}|j}t|}|t|<|S)N)r f_globalsr dicttable)rrrdictdidrrr frame_globals~s     zIdbAdapter.frame_globalscCs-t|}|j}t|}|t|<|S)N)rf_localsrr;)rrrr<r=rrr frame_localss     zIdbAdapter.frame_localscCs-t|}|j}t|}|t|<|S)N)rf_coder codetable)rrrcodecidrrr frame_codes     zIdbAdapter.frame_codecCst|}|jS)N)rBco_name)rrDrCrrr code_names zIdbAdapter.code_namecCst|}|jS)N)rB co_filename)rrDrCrrr code_filenames zIdbAdapter.code_filenamecCstddS)Nz"dict_keys not public or pickleable)NotImplemented)rr=rrr dict_keysszIdbAdapter.dict_keyscCst|}t|jS)N)r;listkeys)rr=r<rrr dict_keys_lists zIdbAdapter.dict_keys_listcCs$t|}||}t|}|S)N)r;repr)rr=keyr<valuerrr dict_items   zIdbAdapter.dict_itemN)rrrrr r!r"r#r$r(r.r1r5r6r9r>r@rErGrIrKrNrRrrrr rFs(                  rcCs>t||}tj|}t|}|jt|tS)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. )rrZIdbrregister idb_adap_oid)Z rpchandlerrZ gui_proxyrZidb_adaprrr start_debuggers  rUc@sXeZdZddZddZddZddZd d Zd d Zd S) FrameProxycCs(||_||_d|_i|_dS)Nr)_conn_fid_oid _dictcache)rrrrrr rs   zFrameProxy.__init__cCs|dddkr"t||dkr8|jS|dkrN|jS|dkrd|jS|jj|jd|j|fiS)Nr _rAr:r?r9)AttributeError _get_f_code_get_f_globals _get_f_localsrWrrYrX)rr8rrr __getattr__s       zFrameProxy.__getattr__cCs:|jj|jd|jfi}t|j|j|S)NrE)rWrrYrX CodeProxy)rrDrrr r]s$zFrameProxy._get_f_codecCs1|jj|jd|jfi}|j|S)Nr>)rWrrYrX_get_dict_proxy)rr=rrr r^szFrameProxy._get_f_globalscCs1|jj|jd|jfi}|j|S)Nr@)rWrrYrXrb)rr=rrr r_szFrameProxy._get_f_localscCsC||jkr|j|St|j|j|}||j|<|S)N)rZ DictProxyrWrY)rr=Zdprrr rbs   zFrameProxy._get_dict_proxyN) rrrrr`r]r^r_rbrrrr rVs     rVc@s(eZdZddZddZdS)racCs||_||_||_dS)N)rWrY_cid)rrrrDrrr rs  zCodeProxy.__init__cCs`|dkr.|jj|jd|jfiS|dkr\|jj|jd|jfiSdS)NrFrGrHrI)rWrrYrd)rr8rrr r`s   zCodeProxy.__getattr__N)rrrrr`rrrr ras  rac@s@eZdZddZddZddZddZd S) rccCs||_||_||_dS)N)rWrY_did)rrrr=rrr rs  zDictProxy.__init__cCs"|jj|jd|jfiS)NrN)rWrrYre)rrrr rMszDictProxy.keyscCs%|jj|jd|j|fiS)NrR)rWrrYre)rrPrrr __getitem__szDictProxy.__getitem__cCst|dS)N)r\)rr8rrr r`szDictProxy.__getattr__N)rrrrrMrfr`rrrr rcs   rcc@s(eZdZddZddZdS) GUIAdaptercCs||_||_dS)N)rgui)rrrhrrr rs zGUIAdapter.__init__cCs,t|j|}|jj|||dS)N)rVrrhr)rrrrrrrr r!szGUIAdapter.interactionN)rrrrrrrrr rgs  rgc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZdS)IdbProxycCs||_||_||_dS)N)rrshell)rrrjrrrr r)s  zIdbProxy.__init__cOs"|jj|j|||}|S)N)rrr)rZ methodnameargskwargsrQrrr call.sz IdbProxy.callcCs4|jj|jd|fi}||jj_dS)Nr.)rZ asyncqueuerrjZinterpZ active_seq)rr0localsseqrrr r.4s!z IdbProxy.runcsAjd|j|\}}fdd|D}||fS)Nr(cs.g|]$\}}tj||fqSr)rVr)r%rr&)rrr r'<s z&IdbProxy.get_stack..)rmrX)rrr)r+r,r)rr r(9szIdbProxy.get_stackcCs|jddS)Nr")rm)rrrr r"?szIdbProxy.set_continuecCs|jddS)Nr )rm)rrrr r BszIdbProxy.set_stepcCs|jd|jdS)Nr#)rmrX)rrrrr r#EszIdbProxy.set_nextcCs|jd|jdS)Nr$)rmrX)rrrrr r$HszIdbProxy.set_returncCs|jddS)Nr!)rm)rrrr r!KszIdbProxy.set_quitcCs|jd||}|S)Nr1)rm)rr2r3r4rrr r1NszIdbProxy.set_breakcCs|jd||}|S)Nr5)rm)rr2r3r4rrr r5RszIdbProxy.clear_breakcCs|jd|}|S)Nr6)rm)rr2r4rrr r6VszIdbProxy.clear_all_file_breaksN)rrrrrmr.r(r"r r#r$r!r1r5r6rrrr ri's            ricCsb|jddtfiat||t}tj||}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. execstart_the_debugger)rrrTrirrgrS)rpccltZpyshellZ idb_proxyrhZgui_adaprrr start_remote_debuggerZs rscCst||jtdS)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)rrrrr close_remote_debuggerrs rvcCs|jddtfidS)NrpZstop_the_debugger)rrT)rrrrr rt~srtcCs|jddtfi}dS)Nrprq)rr)rrZidb_adap_oid_retrrr restart_subprocess_debuggers rw)__doc__typesZidlelibrZ debuggingrTrrr;rBr r rrrrUrVrarcrgrirsrvrtrwrrrr s.    m * 3