U
    ei                  
   @   s  d Z ddlZddlZddlZddlZddlmZ ddlZddl	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZ zdd	lmZ W n  ek
r   dd
lmZ Y nX ddlmZmZmZ z0ddlmZ ddlmZ ddlm Z m!Z! dZ"W nT ek
r   dZ"Y n< e#k
r> Z$ ze$j%j&dkr*dZ"ne$W 5 dZ$[$X Y nX e'eddpRej(Z)G dd dZ*G dd dZ+G dd dZ,G dd dZ-G dd dZ.G dd dZ/G d d! d!Z0dS )"z/Debugger implementation for the IPython kernel.    N)Path)get_ipython)leading_empty_lines)Event)Queue)jsonapi)json_default)date_default   )get_file_nameget_tmp_directoryget_tmp_hash_seed)api)pydevd_frame_utils)SuspendedFramesManager_FramesTrackerTFZDebuggerInitializationError
ROUTING_IDc                   @   s   e Zd ZdZdd ZdS )	_FakeCodezFake code class.c                 C   s   || _ || _dS Init.N)co_filenameco_name)selfr   r    r   1lib/python3.8/site-packages/ipykernel/debugger.py__init__3   s    z_FakeCode.__init__N__name__
__module____qualname____doc__r   r   r   r   r   r   0   s   r   c                   @   s   e Zd ZdZdd ZdS )
_FakeFramezFake frame class.c                 C   s   || _ || _|| _d| _dS r   )f_code	f_globalsf_localsf_back)r   r"   r#   r$   r   r   r   r   <   s    z_FakeFrame.__init__Nr   r   r   r   r   r!   9   s   r!   c                   @   s   e Zd ZdZdd ZdS )
_DummyPyDBzFake PyDb class.c                 C   s   ddl m} | | _dS )r   r   )	PyDevdAPIN)Z_pydevd_bundle.pydevd_apir'   ZVariablePresentationZvariable_presentation)r   r'   r   r   r   r   G   s    z_DummyPyDB.__init__Nr   r   r   r   r   r&   D   s   r&   c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )VariableExplorerzA variable explorer.c                 C   s*   t  | _t | _t| j| j| _d| _dS )zInitialize the explorer.N)r   suspended_frame_managerr&   Zpy_dbr   trackerframer   r   r   r   r   Q   s    zVariableExplorer.__init__c                 C   s:   t  j}ttdtd||| _| jdt	| j dS )zStart tracking.<module>zsys._getframe()Zthread1N)
r   Zuser_nsr!   r   r   r+   r*   trackr   Zcreate_frames_list_from_frame)r   varr   r   r   r.   X   s    zVariableExplorer.trackc                 C   s   | j   dS )zStop tracking.N)r*   untrack_allr,   r   r   r   r0   ^   s    zVariableExplorer.untrack_allNc                 C   s0   |}|st | j}| j|}dd | D S )z1Get the child variables for a variable reference.c                 S   s   g | ]}|  qS r   )Zget_var_data).0xr   r   r   
<listcomp>h   s     z;VariableExplorer.get_children_variables.<locals>.<listcomp>)idr+   r)   Zget_variableget_children_variables)r   Zvariable_refZvar_ref	variablesr   r   r   r5   b   s
    
z'VariableExplorer.get_children_variables)N)r   r   r   r    r   r.   r0   r5   r   r   r   r   r(   N   s
   r(   c                   @   sH   e Zd ZdZdZdZdZdZdd Zdd	 Z	d
d Z
dd Zdd ZdS )DebugpyMessageQueuezA debugpy message queue.zContent-Length:    z

   c                 C   s&   d| _ |   || _t | _|| _dS )zInit the queue. N)
tcp_buffer_reset_tcp_posevent_callbackr   message_queuelog)r   r=   r?   r   r   r   r   s   s
    zDebugpyMessageQueue.__init__c                 C   s   d| _ d| _d| _d| _d S )Nr   )
header_posseparator_posmessage_sizemessage_posr,   r   r   r   r<   {   s    z"DebugpyMessageQueue._reset_tcp_posc                 C   s   | j d ttjttjf t|}|d dkrZ| j d | j | | 	| n$| j d | j | | j
| d S )NzQUEUE - _put_message:typeeventzQUEUE - received event:zQUEUE - put message:)r?   debugtcastZDictstrZAnyr   loadsr=   r>   
put_nowait)r   Zraw_msgmsgr   r   r   _put_message   s    z DebugpyMessageQueue._put_messagec                 C   s  |  j |7  _ | jd | jdkr4| j tj| _| jdkrBdS | jd| j | jdkrz| jtj }| j tj	|| _| jdkrdS | jd| j | j
dkr| jtj }| jtj | _
t| j || j | _| jd| j
 | jd| j t| j | j
 | jk rdS | | j | j
| j
| j   t| j | j
 | jkrb| jd d	| _ |   dS | j | j
| j d | _ | jd
| j  |   qdS )zPut a tcp frame in the queue.zQUEUE - received framer@   NzQUEUE - found header at pos %iz!QUEUE - found separator at pos %izQUEUE - found message at pos %izQUEUE - message size is %izQUEUE - resetting tcp_bufferr:   zQUEUE - slicing tcp_buffer: %s)r;   r?   rG   rA   findr7   HEADERrB   HEADER_LENGTH	SEPARATORrD   SEPARATOR_LENGTHintrC   lenrN   r<   )r   r+   ZhintZsize_posr   r   r   put_tcp_frame   s@    




z!DebugpyMessageQueue.put_tcp_framec                    s   | j  I dH S )zGet a message from the queue.N)r>   getr,   r   r   r   get_message   s    zDebugpyMessageQueue.get_messageN)r   r   r   r    rP   rQ   rR   rS   r   r<   rN   rV   rX   r   r   r   r   r7   k   s   /r7   c                   @   sh   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )DebugpyClientzA client for debugpy.c                 C   sL   || _ || _|| _t| j| j | _d| _d| _d| _d| _	t
 | _d| _dS )zInitialize the client.	127.0.0.1r@   NT)r?   debugpy_streamr=   r7   _forward_eventr>   debugpy_hostdebugpy_port
routing_idwait_for_attachr   
init_eventinit_event_seq)r   r?   r[   r=   r   r   r   r      s    zDebugpyClient.__init__c                 C   s    |   \}}d| d t| S )Ntcp://:)get_host_portrJ   )r   hostportr   r   r   _get_endpoint   s    zDebugpyClient._get_endpointc                 C   s.   |d dkr | j   |d | _| | d S )NrF   Zinitializedseq)ra   setrb   r=   r   rM   r   r   r   r\      s    

zDebugpyClient._forward_eventc                 C   s   | j d kr| jjt| _ tj|tddd}tt	|}t
j| t
j d}||7 }| jd | j| j  | j| | j| j |f d S )NF)defaultZensure_asciiZ	allow_nanasciizDEBUGPYCLIENT:)r_   r[   socket
getsockoptr   r   dumpsr   rJ   rU   r7   rP   rR   encoder?   rG   Zsend_multipart)r   rM   contentZcontent_lengthbufr   r   r   _send_request   s"    
zDebugpyClient._send_requestc                    s   | j  I d H S N)r>   rX   r,   r   r   r   _wait_for_response   s    z DebugpyClient._wait_for_responsec                    sL   | j  I d H  dt| jd dd}| | |  I d H  |  I d H S )Nrequestr
   configurationDone)rE   ri   command)ra   waitrT   rb   rt   rv   )r   rx   r   r   r   _handle_init_sequence   s    
z#DebugpyClient._handle_init_sequencec                 C   sn   | j dkrb| jj}|d| j  |tjd| _	|
| j	 | j	d}| j	|d d | _ | j| j fS )zGet the host debugpy port.r@   rc   utf-8rd   r
   N)r^   r[   rn   Zbind_to_random_portr]   ro   zmqZLAST_ENDPOINTdecodeendpointZunbindrfind)r   rn   indexr   r   r   re     s    
zDebugpyClient.get_host_portc                 C   s&   | j j|   | j jt| _dS )zConnect to the tcp socket.N)r[   rn   connectrh   ro   r   r_   r,   r   r   r   connect_tcp_socket  s    z DebugpyClient.connect_tcp_socketc                 C   s0   | j j|   d| _t | _d| _d| _dS )zDisconnect from the tcp socket.Nr@   T)	r[   rn   
disconnectrh   r_   r   ra   rb   r`   r,   r   r   r   disconnect_tcp_socket  s
    z#DebugpyClient.disconnect_tcp_socketc                 C   s   | j | dS )zReceive a dap frame.N)r>   rV   )r   r+   r   r   r   receive_dap_frame  s    zDebugpyClient.receive_dap_framec                    s^   |  | | jr4|d dkr4|  I dH }d| _|S |  I dH }| jd | j| |S )zSend a dap request.ry   attachNFzDEBUGPYCLIENT - returning:)rt   r`   r{   rv   r?   rG   )r   rM   repr   r   r   send_dap_request"  s    
zDebugpyClient.send_dap_requestN)r   r   r   r    r   rh   r\   rt   rv   r{   re   r   r   r   r   r   r   r   r   rY      s   rY   c                   @   s   e Zd ZdZdddddddgZd	d
dddgZd>ddZdd Zdd Zdd Z	dd Z
dd Zedd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=S )?DebuggerzThe debugger class.dumpCellsetBreakpointssource
stackTracer6   r   rx   	debugInfoinspectVariablesrichInspectVariablesmodulescopyToGlobalsTc                 C   s   || _ t||| j| _|| _|| _d| _|| _|| _t	 | _
i | _tjD ]}t| || j|< qHi | _tjD ]}t| || j|< qji | _t | _d| _i | _d| _d| _d| _t | _dS )zInitialize the debugger.FrZ   r   N)r?   rY   _handle_eventdebugpy_clientshell_socketsession
is_startedr=   just_my_coder   stopped_queuestarted_debug_handlersr   started_debug_msg_typesgetattrstatic_debug_handlersstatic_debug_msg_typesbreakpoint_listrj   stopped_threadsdebugpy_initialized_removed_cleanupr]   r^   r   r(   variable_explorer)r   r?   r[   r=   r   r   r   Zmsg_typer   r   r   r   G  s,    

zDebugger.__init__c                 C   s   |d dkrH|d d r(| j | d S | j|d d  | | nL|d dkr|d d rjt | _n| j|d d  | | n
| | d S )NrF   stoppedbodyZallThreadsStoppedZthreadId	continuedZallThreadsContinued)r   rL   r   addr=   rj   removerk   r   r   r   r   h  s    
zDebugger._handle_eventc                    s   | j |I d H S ru   )r   r   rk   r   r   r   _forward_messagey  s    zDebugger._forward_messagec                    s4    fdd|D }|d d|d d|d d|idS )	Nc                    s   g | ]}  |d  r|qS nameaccept_variabler1   r/   r,   r   r   r3   }  s      z6Debugger._build_variables_response.<locals>.<listcomp>ri   responseTry   r6   )ri   rE   request_seqsuccessry   r   r   )r   rw   r6   Zvar_listr   r,   r   _build_variables_response|  s    z"Debugger._build_variables_responsec                 C   s   ddddg}||kS )NZIPythonHistorySavingThreadzThread-2zThread-3zThread-4r   )r   Zthread_nameforbid_listr   r   r   _accept_stopped_thread  s    zDebugger._accept_stopped_threadc                    sr   | j  I dH }|d d ddd}| |I dH }|d d D ]"}| |d r@| j|d	  q@| | dS )
zHandle a stopped event.Nri   r
   rw   threads)ri   rE   ry   r   r   r4   )r   rW   r   r   r   r   r=   )r   rF   Zreqr   threadr   r   r   handle_stopped_event  s    zDebugger.handle_stopped_eventc                 C   s   | j S ru   )r   r,   r   r   r   
tcp_client  s    zDebugger.tcp_clientc           
   	   C   s   | j st }t| s(t|jdd | j \}}d}|d| d | d 7 }|dd}| j| j	d|d	| j	
t | jj| j	d
d\}}|d d dk| _ t jj}t|kr|t}	||	| j|	< | j  | j S )zStart the debugger.T)parentszimport debugpy;zdebugpy.listen(("z",z)))codeZsilentZexecute_requestNr   )moderr   statusok)r   r   r   existsmkdirr   re   r   sendr   ro   r   Zrecvr   input_transformer_managercleanup_transformsr   r   popr   r   )
r   Ztmp_dirrf   rg   r   rr   identrM   r   r   r   r   r   start  s.    




zDebugger.startc                 C   s@   | j   t jj}t| jD ]}| j|}||| qdS )zStop the debugger.N)	r   r   r   r   r   sortedr   r   insert)r   r   r   funcr   r   r   stop  s
    

zDebugger.stopc              	      sT   |d d }t |}t|ddd}|| W 5 Q R X d|d d|d	 d
|idS )zHandle a dump cell message.	argumentsr   wr|   encodingr   ri   Try   Z
sourcePathrE   r   r   ry   r   )r   openwrite)r   messager   	file_namefr   r   r   r     s    zDebugger.dumpCellc                    s\   |d d d }|d d | j |< | |I dH }|drXdd |d	 d D | j |< |S )
z!Handle a set breakpoints message.r   r   pathbreakpointsNr   c                 S   s   g | ]}d |d  iqS )liner   )r1   
breakpointr   r   r   r3     s   z+Debugger.setBreakpoints.<locals>.<listcomp>r   )r   r   rW   )r   r   r   Zmessage_responser   r   r   r     s    

zDebugger.setBreakpointsc              	      s~   d|d |d d}|d d d }t | rbt|dd	}d
|d< d| i|d< W 5 Q R X nd|d< d|d< i |d< |S )zHandle a source message.r   ri   ry   )rE   r   ry   r   r   r   r|   r   Tr   rr   r   Fzsource unavailabler   )r   is_filer   read)r   r   replysource_pathr   r   r   r   r     s    zDebugger.sourcec                    s~   |  |I dH }zT|d d }t|tdd tt|dD  }|d d d|d  |d d< W n tk
rx   Y nX |S )zHandle a stack trace message.Nr   ZstackFramesc                 s   s*   | ]"\}}|d  dkr|dkr|V  qdS )r   r-   r
   Nr   )r1   ivr   r   r   	<genexpr>   s      z&Debugger.stackTrace.<locals>.<genexpr>r
   )r   rU   next	enumeratereversedStopIteration)r   r   r   Zsf_listZ
module_idxr   r   r   r     s    

$zDebugger.stackTracec                 C   sb   ddddddddd	d
ddddddddddg}||k}|oHt td| }|o\|dd dk}|S )zAccept a variable by name.r   r    __package__
__loader____spec____annotations____builtins__Z__builtin__Z__display__r   ZdebugpyexitquitZInZOutZ_ohZ_dh___Z___z^_\dr      Z_i)boolresearch)r   Zvariable_namer   Zcondr   r   r   r     s2    zDebugger.accept_variablec                    s`   i } j s* j|d d } ||S  |I dH } fdd|d d D |d d< |S )zHandle a variables message.r   ZvariablesReferenceNc                    s   g | ]}  |d  r|qS r   r   r   r,   r   r   r3   0  s     z&Debugger.variables.<locals>.<listcomp>r   r6   )r   r   r5   r   r   )r   r   r   r6   r   r,   r   r6   %  s    


zDebugger.variablesc                    sP   | j  \}}||d|d d< d|d d< | js@dg|d d< | |I dH S )	zHandle an attach message.)rf   rg   r   r   TZ	logToFileZDebugStdLibZdebugOptionsN)r   re   r   r   )r   r   rf   rg   r   r   r   r   5  s    zDebugger.attachc                    s   |d d|d d|d dS )z$Handle a configuration done message.ri   r   Try   )ri   rE   r   r   ry   r   )r   r   r   r   r   rx   B  s    zDebugger.configurationDonec                    sj   g }| j  D ]\}}|||d qd|d d|d | jdt t tj d|t| j	ddgdd	
d
S )zHandle a debug info message.)r   r   r   ri   Try   ZMurmur2.pyzPython Exceptions)
Z	isStartedZ
hashMethodZhashSeedZtmpFilePrefixZtmpFileSuffixr   ZstoppedThreadsZrichRenderingZexceptionPathsr   r   )
r   itemsappendr   r   r   osseplistr   )r   r   r   keyvaluer   r   r   r   L  s&    
zDebugger.debugInfoc                    s2   | j   t | _ | j   | j  }| ||S )z$Handle an insepct variables message.)r   r0   r(   r.   r5   r   )r   r   r6   r   r   r   r   d  s
    


zDebugger.inspectVariablesc              	      s>  d|d d|d d}|d d }t |}|sZi i d|d	< |d
ksN|dkrVd|d< |S i  i }| jst ||i| }|dddkr|di  |di }nhd| d}|d d }|d }	| dd|	d ||dddI dH }|d rt|d	 d i i \ }  fdd| D d}
|
|d	< d|d< |S ) z(Handle a rich inspect variables message.r   ri   Fry   )rE   Zsequence_seqr   ry   r   ZvariableName)datametadatar   zspecial variableszfunction variablesTr   r   errorr   r   r   z'get_ipython().display_formatter.format()frameIdrw   Zevaluater
   Z	clipboard)
expressionr   contextrE   ry   ri   r   Nresultc                    s   i | ]\}}| kr||qS r   r   )r1   kr   Z	repr_datar   r   
<dictcomp>  s       z1Debugger.richInspectVariables.<locals>.<dictcomp>)	rJ   isidentifierr   r   Zuser_expressionsrW   r   evalr   )r   r   r   Zvar_nameZ
valid_nameZrepr_metadatar  r   Zframe_idri   r   r   r  r   r   o  sJ    



zDebugger.richInspectVariablesc              	      s^   |d d }|d d }|d d }d| d}|d }|  dd	|d
 |||ddI d H S )Nr   ZdstVariableNameZsrcVariableNameZ
srcFrameIdzglobals()['z']ri   rw   ZsetExpressionr
   )r   r   r   r   )r   )r   r   Zdst_var_nameZsrc_var_nameZsrc_frame_idr   ri   r   r   r   r     s    zDebugger.copyToGlobalsc           	         s   t tj }|dd}|dt|}g }t||D ]B}|| }tt|dddd}|r8|dr8|	||j
|d q8d	|t|d
iS )zHandle a modules message.startModuler   moduleCountr   Noriginr   )r4   r   r   r   )r   ZtotalModules)r   sysr   valuesrW   rU   ranger   endswithr   r   )	r   r   r   r  r  modsr   modulefilenamer   r   r   r     s    zDebugger.modulesc                    s   i }|d dkrV| j r$| jd n2|  | _ | j rB| jd nd|d dddd	}| j|d d
}|d
k	r||I d
H }n@| j r| j|d d
}|d
k	r||I d
H }n| |I d
H }|d dkr|   i | _	t
 | _d| _ | jd |S )zProcess a request.ry   Z
initializez The debugger has already startedzThe debugger has startedri      Fr   )ry   r   ri   r   rE   Nr   zThe debugger has stopped)r   r?   infor   r   rW   r   r   r   r   rj   r   )r   r   r   Zhandlerr   r   r   process_request  s8    
zDebugger.process_requestN)T)r   r   r   r    r   r   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r6   r   rx   r   r   r   r   r   r  r   r   r   r   r   0  sP   	 
!


4r   )1r    r   r   r
  typingrH   pathlibr   r}   ZIPython.core.getipythonr   ZIPython.core.inputtransformer2r   Ztornado.locksr   Ztornado.queuesr   Z	zmq.utilsr   Zjupyter_client.jsonutilr   ImportErrorr	   Zcompilerr   r   r   Zdebugpy.serverr   Z_pydevd_bundler   Z&_pydevd_bundle.pydevd_suspended_framesr   r   Z_is_debugpy_available	Exceptione	__class__r   r   ZIDENTITYr   r   r!   r&   r(   r7   rY   r   r   r   r   r   <module>   sF   	
Vo