Viewing File: /opt/alt/python35/lib64/python3.5/idlelib/__pycache__/RemoteDebugger.cpython-35.opt-1.pyc



Yf.@s)dZddlZddlmZdZdadZiZiZiZ	iZ
ddZdd	ZGd
ddZ
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)Debuggeridb_adapterZgui_adaptercCst|}|t|<|S)N)id
frametable)framefidr;/opt/alt/python35/lib64/python3.5/idlelib/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)Ninteraction)r
remotecallrr
r)rmessagerrrrr	r?szGUIProxy.interaction)__name__
__module____qualname__rrrrrr	r9src@seZdZddZddZddZddZd	d
ZddZd
dZ	ddZ
ddZddZ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	
<listcomp>es	z(IdbAdapter.get_stack.<locals>.<listcomp>)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)rclear_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)rBco_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
Zdd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
ZddZd
dZ	ddZ
ddZddZ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.<locals>.<listcomp>)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_debuggerZ
unregisterr)rrrrr	close_remote_debuggerrs	
rucCs|jddtfidS)NrpZstop_the_debugger)rrT)rrrrr	rt~srtcCs|jddtfi}dS)Nrprq)rr)rrZidb_adap_oid_retrrr	restart_subprocess_debuggersrv)__doc__typesZidlelibrZ	debuggingrTrrr;rBr
r
rrrrUrVrarcrgrirsrurtrvrrrr	<module>s.
m*3
Back to Directory File Manager