B � fl/�@s�dZddlZddlmZdZdadZiZiZiZ iZ dd�Z dd �Z Gd d �d �Z Gd d �d �Zdd�ZGdd�d�ZGdd�d�ZGdd�d�ZGdd�d�ZGdd�d�Zdd�Zdd�Zdd�Zd d!�Zed"kr�dd#lmZed$d%d&d'�dS)(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_adapterZ gui_adaptercCst|�}|t|<|S)N)�id� frametable)�frame�fid�r�7/opt/alt/python37/lib64/python3.7/idlelib/debugger_r.py� wrap_frame(sr cCsN|dkr dS|d}t|tj�s$t�t|�}|t|<|d|d|f}|SdS)z0replace info[2], a traceback instance, by its IDN�r�)� isinstance�types� TracebackType�AssertionErrorr�tracebacktable)�info� tracebackZ traceback_id� modified_inforrr � wrap_info-src@seZdZdd�Zddd�ZdS)�GUIProxycCs||_||_dS)N)�conn�oid)�selfr� gui_adap_oidrrr �__init__;szGUIProxy.__init__NcCs&|j�|jd|t|�t|�fi�dS)N� interaction)r� remotecallrr r)r�messagerrrrr r?s zGUIProxy.interaction)N)�__name__� __module__� __qualname__rrrrrr r9src@s�eZdZdd�Zdd�Zdd�Zdd�Zd d �Zd d �Zd d�Z dd�Z dd�Z dd�Z dd�Z dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)S)*� IdbAdaptercCs ||_dS)N)�idb)rr#rrr rHszIdbAdapter.__init__cCs|j��dS)N)r#�set_step)rrrr r$MszIdbAdapter.set_stepcCs|j��dS)N)r#�set_quit)rrrr r%PszIdbAdapter.set_quitcCs|j��dS)N)r#� set_continue)rrrr r&SszIdbAdapter.set_continuecCst|}|j�|�dS)N)rr#�set_next)rrrrrr r'VszIdbAdapter.set_nextcCst|}|j�|�dS)N)rr#� set_return)rrrrrr r(ZszIdbAdapter.set_returncCsFt|}|dkrd}nt|}|j�||�\}}dd�|D�}||fS)NcSsg|]\}}t|�|f�qSr)r )�.0Zframe2�krrr � esz(IdbAdapter.get_stack..)rrr#� get_stack)rr�tbidr�tb�stack�irrr r,^szIdbAdapter.get_stackcCsddl}|j�||j�dS)Nr)�__main__r#�run�__dict__)r�cmdr1rrr r2hszIdbAdapter.runcCs|j�||�}|S)N)r#� set_break)r�filename�lineno�msgrrr r5lszIdbAdapter.set_breakcCs|j�||�}|S)N)r#� clear_break)rr6r7r8rrr r9pszIdbAdapter.clear_breakcCs|j�|�}|S)N)r#�clear_all_file_breaks)rr6r8rrr r:ts z IdbAdapter.clear_all_file_breakscCst|}t||�S)N)r�getattr)rr�namerrrr � frame_attrzszIdbAdapter.frame_attrcCs"t|}|j}t|�}|t|<|S)N)r� f_globalsr� dicttable)rrr�dict�didrrr � frame_globals~s zIdbAdapter.frame_globalscCs"t|}|j}t|�}|t|<|S)N)r�f_localsrr?)rrrr@rArrr � frame_locals�s zIdbAdapter.frame_localscCs"t|}|j}t|�}|t|<|S)N)r�f_coder� codetable)rrr�code�cidrrr � frame_code�s zIdbAdapter.frame_codecCst|}|jS)N)rF�co_name)rrHrGrrr � code_name�szIdbAdapter.code_namecCst|}|jS)N)rF� co_filename)rrHrGrrr � code_filename�szIdbAdapter.code_filenamecCs td��dS)Nz"dict_keys not public or pickleable)�NotImplementedError)rrArrr � dict_keys�szIdbAdapter.dict_keyscCst|}t|���S)N)r?�list�keys)rrAr@rrr �dict_keys_list�szIdbAdapter.dict_keys_listcCst|}||}t|�}|S)N)r?�repr)rrA�keyr@�valuerrr � dict_item�szIdbAdapter.dict_itemN)rr r!rr$r%r&r'r(r,r2r5r9r:r=rBrDrIrKrMrOrRrVrrrr r"Fs(  r"cCs,t||�}t�|�}t|�}|�t|�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. )rrZIdbr"�register� idb_adap_oid)Z rpchandlerrZ gui_proxyr#Zidb_adaprrr �start_debugger�s   rYc@s<eZdZdd�Zdd�Zdd�Zdd�Zd d �Zd d �Zd S)� FrameProxycCs||_||_d|_i|_dS)Nr)�_conn�_fid�_oid� _dictcache)rrrrrr r�szFrameProxy.__init__cCsb|dd�dkrt|��|dkr(|��S|dkr8|��S|dkrH|��S|j�|jd|j|fi�S)Nr �_rEr>rCr=)�AttributeError� _get_f_code�_get_f_globals� _get_f_localsr[rr]r\)rr<rrr � __getattr__�s zFrameProxy.__getattr__cCs(|j�|jd|jfi�}t|j|j|�S)NrI)r[rr]r\� CodeProxy)rrHrrr ra�szFrameProxy._get_f_codecCs"|j�|jd|jfi�}|�|�S)NrB)r[rr]r\�_get_dict_proxy)rrArrr rb�s  zFrameProxy._get_f_globalscCs"|j�|jd|jfi�}|�|�S)NrD)r[rr]r\rf)rrArrr rc�s  zFrameProxy._get_f_localscCs2||jkr|j|St|j|j|�}||j|<|S)N)r^� DictProxyr[r])rrAZdprrr rf�s    zFrameProxy._get_dict_proxyN) rr r!rrdrarbrcrfrrrr rZ�s  rZc@seZdZdd�Zdd�ZdS)recCs||_||_||_dS)N)r[r]�_cid)rrrrHrrr r�szCodeProxy.__init__cCsD|dkr |j�|jd|jfi�S|dkr@|j�|jd|jfi�SdS)NrJrKrLrM)r[rr]rh)rr<rrr rd�s    zCodeProxy.__getattr__N)rr r!rrdrrrr re�srec@s,eZdZdd�Zdd�Zdd�Zdd�Zd S) rgcCs||_||_||_dS)N)r[r]�_did)rrrrArrr rszDictProxy.__init__cCs|j�|jd|jfi�S)NrR)r[rr]ri)rrrr rQs zDictProxy.keyscCs|j�|jd|j|fi�S)NrV)r[rr]ri)rrTrrr � __getitem__s zDictProxy.__getitem__cCs t|��dS)N)r`)rr<rrr rdszDictProxy.__getattr__N)rr r!rrQrjrdrrrr rgs rgc@seZdZdd�Zdd�ZdS)� GUIAdaptercCs||_||_dS)N)r�gui)rrrlrrr rszGUIAdapter.__init__cCs t|j|�}|j�|||�dS)N)rZrrlr)rrrrrrrr r!s zGUIAdapter.interactionN)rr r!rrrrrr rksrkc@sleZdZdd�Zdd�Zdd�Zdd�Zd d �Zd d �Zd d�Z dd�Z dd�Z dd�Z dd�Z dd�ZdS)�IdbProxycCs||_||_||_dS)N)rr�shell)rrrnrrrr r)szIdbProxy.__init__cOs|j�|j|||�}|S)N)rrr)rZ methodname�args�kwargsrUrrr �call.sz IdbProxy.callcCs$|j�|jd|fi�}||jj_dS)Nr2)rZ asyncqueuerrnZinterpZ active_seq)rr4�locals�seqrrr r24sz IdbProxy.runcs.��d|j|�\}}�fdd�|D�}||fS)Nr,cs g|]\}}t�j|�|f�qSr)rZr)r)rr*)rrr r+<sz&IdbProxy.get_stack..)rqr\)rrr-r/r0r)rr r,9szIdbProxy.get_stackcCs|�d�dS)Nr&)rq)rrrr r&?szIdbProxy.set_continuecCs|�d�dS)Nr$)rq)rrrr r$BszIdbProxy.set_stepcCs|�d|j�dS)Nr')rqr\)rrrrr r'EszIdbProxy.set_nextcCs|�d|j�dS)Nr()rqr\)rrrrr r(HszIdbProxy.set_returncCs|�d�dS)Nr%)rq)rrrr r%KszIdbProxy.set_quitcCs|�d||�}|S)Nr5)rq)rr6r7r8rrr r5NszIdbProxy.set_breakcCs|�d||�}|S)Nr9)rq)rr6r7r8rrr r9RszIdbProxy.clear_breakcCs|�d|�}|S)Nr:)rq)rr6r8rrr r:Vs zIdbProxy.clear_all_file_breaksN)rr r!rrqr2r,r&r$r'r(r%r5r9r:rrrr rm'srmcCsD|�ddtfi�at||t�}t�||�}t||�}|�t|�|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)rrrXrmrZDebuggerrkrW)�rpccltZpyshellZ idb_proxyrlZgui_adaprrr �start_remote_debuggerZs     rwcCst|�|�t�dS)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)rvrrr �close_remote_debuggerrs rycCs|�ddtfi�dS)NrtZstop_the_debugger)rrX)rvrrr rx~srxcCs&|�ddtfi�}|tks"td��dS)Nrtruz Idb restarted with different oid)rrrXr)rvZidb_adap_oid_retrrr �restart_subprocess_debugger�s rzr1)�mainzidlelib.idle_test.test_debuggerr F)� verbosity�exit)�__doc__rZidlelibrZ debuggingrXrrr?rFrr rrr"rYrZrergrkrmrwryrxrzrZunittestr{rrrr �s4   m* 3