o
    Zhi                  
   @   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yQ   dd
lmZ Y nw ddlmZmZmZ zddlmZ ddlmZ ddlm Z m!Z! dZ"W n' ey   dZ"Y n e#y Z$ ze$j%j&dkrdZ"ne$W Y dZ$[$ndZ$[$ww e'eddpe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                   @      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   I/var/www/html/lang_env/lib/python3.10/site-packages/ipykernel/debugger.py__init__3   s   
z_FakeCode.__init__N__name__
__module____qualname____doc__r   r   r   r   r   r   0       r   c                   @   r   )
_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   r"   r#   c                   @   r   )
_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   r"   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   r0   X   s   zVariableExplorer.trackc                 C   s   | j   dS )zStop tracking.N)r,   untrack_allr.   r   r   r   r2   ^   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   r7   b   s
   
z'VariableExplorer.get_children_variablesN)r   r   r    r!   r   r0   r2   r7   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@   rB   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r.| j d | j | | 	| d S | j d | j | | j
| d S )NzQUEUE - _put_message:typeeventzQUEUE - received event:zQUEUE - put message:)rB   debugtcastDictstrAnyr   loadsr@   rA   
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r| j tj| _| jdkr"dS | jd| j | jdkr>| jtj }| j tj	|| _| jdkrEdS | jd| j | j
dkrj| jtj }| jtj | _
t| j || j | _| jd| j
 | jd| j t| j | j
 | jk rdS | | j | j
| j
| j   t| j | j
 | jkr| jd	 d
| _ |   dS | j | j
| j d | _ | jd| j  |   q)zPut a tcp frame in the queue.zQUEUE - received frameTrC   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>   rB   rJ   rD   findr:   HEADERrE   HEADER_LENGTH	SEPARATORrG   SEPARATOR_LENGTHintrF   lenrS   r?   )r   r-   hintZsize_posr   r   r   put_tcp_frame   sD   




z!DebugpyMessageQueue.put_tcp_framec                    s   | j  I dH S )zGet a message from the queue.N)rA   getr.   r   r   r   get_message   s   zDebugpyMessageQueue.get_messageN)r   r   r    r!   rU   rV   rW   rX   r   r?   rS   r\   r^   r   r   r   r   r:   k   s    /r:   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.1rC   NT)rB   debugpy_streamr@   r:   _forward_eventrA   debugpy_hostdebugpy_port
routing_idwait_for_attachr   
init_eventinit_event_seq)r   rB   ra   r@   r   r   r   r      s   
zDebugpyClient.__init__c                 C   s    |   \}}d| d t| S )Ntcp://:)get_host_portrN   )r   hostportr   r   r   _get_endpoint   s   zDebugpyClient._get_endpointc                 C   s.   |d dkr| j   |d | _| | d S )NrI   Zinitializedseq)rg   setrh   r@   r   rR   r   r   r   rb      s   

zDebugpyClient._forward_eventc                 C   s   | j d u 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)defaultensure_ascii	allow_nanasciizDEBUGPYCLIENT:)re   ra   socket
getsockoptr   r   dumpsr   rN   rZ   r:   rU   rW   encoderB   rJ   Zsend_multipart)r   rR   contentcontent_lengthbufr   r   r   _send_request   s"   
zDebugpyClient._send_requestc                    s   | j  I d H S r9   )rA   r^   r.   r   r   r   _wait_for_response   s   z DebugpyClient._wait_for_responsec                    sN   | j  I d H  dt| jd dd}| | |  I d H  |  I d H S )Nrequestr
   configurationDone)rH   ro   command)rg   waitrY   rh   r}   r~   )r   r   r   r   r   _handle_init_sequence   s   
z#DebugpyClient._handle_init_sequencec                 C   sn   | j dkr1| jj}|d| j  |tjd| _	|
| j	 | j	d}| j	|d d | _ | j| j fS )zGet the host debugpy port.rC   ri   utf-8rj   r
   N)rd   ra   rv   Zbind_to_random_portrc   rw   zmqZLAST_ENDPOINTdecodeendpointZunbindrfind)r   rv   indexr   r   r   rk     s   
zDebugpyClient.get_host_portc                 C   s&   | j j|   | j jt| _dS )zConnect to the tcp socket.N)ra   rv   connectrn   rw   r   re   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.NrC   T)	ra   rv   
disconnectrn   re   r   rg   rh   rf   r.   r   r   r   disconnect_tcp_socket  s
   
z#DebugpyClient.disconnect_tcp_socketc                 C   s   | j | dS )zReceive a dap frame.N)rA   r\   )r   r-   r   r   r   receive_dap_frame  s   zDebugpyClient.receive_dap_framec                    s`   |  | | jr|d dkr|  I dH }d| _|S |  I dH }| jd | j| |S )zSend a dap request.r   attachNFzDEBUGPYCLIENT - returning:)r}   rf   r   r~   rB   rJ   )r   rR   repr   r   r   send_dap_request"  s   
zDebugpyClient.send_dap_requestN)r   r   r    r!   r   rn   rb   r}   r~   r   rk   r   r   r   r   r   r   r   r   r_      s    r_   c                   @   s   e Zd ZdZg dZg dZ	d4d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%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3S )5DebuggerzThe debugger class.)dumpCellsetBreakpointssource
stackTracer8   r   r   )	debugInfoinspectVariablesrichInspectVariablesmodulescopyToGlobalsTc                 C   s   || _ t||| j| _|| _|| _d| _|| _|| _t	 | _
i | _tjD ]
}t| || j|< q$i | _tjD ]
}t| || j|< q5i | _t | _d| _i | _d| _d| _d| _t | _dS )zInitialize the debugger.Fr`   r   N)rB   r_   _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_listrp   stopped_threadsdebugpy_initialized_removed_cleanuprc   rd   r   r*   variable_explorer)r   rB   ra   r@   r   r   r   msg_typer   r   r   r   G  s,   

zDebugger.__init__c                 C   s   |d dkr%|d d r| j | d S | j|d d  | | d S |d dkrG|d d r6t | _n
| j|d d  | | d S | | d S )NrI   stoppedbodyZallThreadsStoppedZthreadId	continuedZallThreadsContinued)r   rQ   r   addr@   rp   removerq   r   r   r   r   h  s   
zDebugger._handle_eventc                    s   | j |I d H S r9   )r   r   rq   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                       g | ]}  |d  r|qS nameaccept_variabler3   r1   r.   r   r   r5   }      z6Debugger._build_variables_response.<locals>.<listcomp>ro   responseTr   r8   )ro   rH   request_seqsuccessr   r   r   )r   r   r8   Zvar_listr   r.   r   _build_variables_response|  s   z"Debugger._build_variables_responsec                 C   s   g d}||vS )N)ZIPythonHistorySavingThreadzThread-2zThread-3zThread-4r   )r   Zthread_nameforbid_listr   r   r   _accept_stopped_thread  s   zDebugger._accept_stopped_threadc                    st   | j  I dH }|d d ddd}| |I dH }|d d D ]}| |d r2| j|d	  q!| | dS )
zHandle a stopped event.Nro   r
   r   threads)ro   rH   r   r   r   r6   )r   r]   r   r   r   r   r@   )r   rI   reqr   threadr   r   r   handle_stopped_event  s   zDebugger.handle_stopped_eventc                 C   s   | j S r9   )r   r.   r   r   r   
tcp_client  s   zDebugger.tcp_clientc           
   	   C   s   | j sQt }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|v rg|t}	||	| j|	< | j  | j S )zStart the debugger.T)parentszimport debugpy;zdebugpy.listen(("z",z)))codeZsilentZexecute_requestNr   )moderz   statusok)r   r   r   existsmkdirr   rk   r   sendr   rw   r   recvr   input_transformer_managercleanup_transformsr   r   popr   r   )
r   Ztmp_dirrl   rm   r   rz   identrR   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                    sj   |d d }t |}t|ddd}|| W d   n1 s"w   Y  d|d d	|d
 d|idS )zHandle a dump cell message.	argumentsr   wr   encodingNr   ro   Tr   Z
sourcePathrH   r   r   r   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r-d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   )r3   
breakpointr   r   r   r5     s    
z+Debugger.setBreakpoints.<locals>.<listcomp>r   )r   r   r]   )r   r   r   Zmessage_responser   r   r   r     s   

zDebugger.setBreakpointsc                    s   d|d |d d}|d d d }t | r>t|dd	}d
|d< d| i|d< W d   |S 1 s7w   Y  |S d|d< d|d< i |d< |S )zHandle a source message.r   ro   r   )rH   r   r   r   r   r   r   r   Tr   rz   r   NFzsource unavailabler   )r   is_filer   read)r   r   replysource_pathr   r   r   r   r     s   
zDebugger.sourcec                    s~   |  |I dH }z+|d d }t|tdd tt|dD  }|d d d|d  |d d< W |S  ty>   Y |S w )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   )r3   ivr   r   r   	<genexpr>   s    "z&Debugger.stackTrace.<locals>.<genexpr>r
   )r   rZ   next	enumeratereversedStopIteration)r   r   r   Zsf_listZ
module_idxr   r   r   r     s   

"zDebugger.stackTracec                 C   s>   g d}||v}|ot td| }|o|dd dk}|S )zAccept a variable by name.)r   r!   __package__
__loader____spec____annotations____builtins____builtin__Z__display__r   ZdebugpyexitquitInZOutZ_ohZ_dh______z^_\dr      Z_i)boolresearch)r   Zvariable_namer   Zcondr   r   r   r     s
   zDebugger.accept_variablec                    sb   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                    r   r   r   r   r.   r   r   r5   0  s
    z&Debugger.variables.<locals>.<listcomp>r   r8   )r   r   r7   r   r   )r   r   r   r8   r   r.   r   r8   %  s   


zDebugger.variablesc                    sR   | j  \}}||d|d d< d|d d< | js!dg|d d< | |I dH S )	zHandle an attach message.)rl   rm   r   r   TZ	logToFileZDebugStdLibZdebugOptionsN)r   rk   r   r   )r   r   rl   rm   r   r   r   r   5  s   zDebugger.attachc                    s   |d d|d d|d dS )z$Handle a configuration done message.ro   r   Tr   )ro   rH   r   r   r   r   )r   r   r   r   r   r   B  s   zDebugger.configurationDonec                    sl   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   ro   Tr   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                    s4   | j   t | _ | j   | j  }| ||S )z$Handle an inspect variables message.)r   r2   r*   r0   r7   r   )r   r   r8   r   r   r   r   d  s   


zDebugger.inspectVariablesc              	      s>  d|d d|d d}|d d }t |}|s.i i d|d	< |d
ks(|dkr,d|d< |S i  i }| jsTt ||i| }|dddkrS|di  |di }n3d| d}|d d }|d }	| dd|	d ||dddI dH }|d rt|d	 d i i \ }  fdd| D d}
|
|d	< d|d< |S ) z(Handle a rich inspect variables message.r   ro   Fr   )rH   Zsequence_seqr   r   r   ZvariableName)datametadatar   zspecial variableszfunction variablesTr   r   errorr   r	  r
  z'get_ipython().display_formatter.format()frameIdr   evaluater
   	clipboard)
expressionr  contextrH   r   ro   r   Nresultc                    s   i | ]\}}| v r||qS r   r   )r3   kr   Z	repr_datar   r   
<dictcomp>  r   z1Debugger.richInspectVariables.<locals>.<dictcomp>)	rN   isidentifierr   r   Zuser_expressionsr]   r   evalr  )r   r   r   var_nameZ
valid_nameZrepr_metadatar  r   Zframe_idro   r   r   r  r   r   o  sN   


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']ro   r   ZsetExpressionr
   )r  r  r  r  )r   )r   r   Zdst_var_nameZsrc_var_nameZsrc_frame_idr  ro   r   r   r   r     s    
zDebugger.copyToGlobalsc           	         s   t tj }|dd}|dt|}g }t||D ]!}|| }tt|dddd}|r>|dr>|	||j
|d qd	|t|d
iS )zHandle a modules message.startModuler   moduleCountr   Noriginr  )r6   r   r   r   )r   ZtotalModules)r  sysr   valuesr]   rZ   ranger   endswithr  r   )	r   r   r   r  r  modsr   modulefilenamer   r   r   r     s   zDebugger.modulesc                    s   i }|d dkr,| j r| jd n|  | _ | j r"| jd n
d|d dddd	}| j|d d
}|d
urA||I d
H }n | j ra| j|d d
}|d
urY||I d
H }n| |I d
H }|d dkr{|   i | _	t
 | _d| _ | jd |S )zProcess a request.r   Z
initializez The debugger has already startedzThe debugger has startedro      Fr   )r   r   ro   r   rH   Nr   zThe debugger has stopped)r   rB   infor   r   r]   r   r   r   r   rp   r   )r   r   r   handlerr   r   r   process_request  s:   
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   r8   r   r   r   r   r   r   r   r'  r   r   r   r   r   0  s:    	
!


4r   )1r!   r  r   r  typingrK   pathlibr   r   ZIPython.core.getipythonr   ZIPython.core.inputtransformer2r   Ztornado.locksr   Ztornado.queuesr   Z	zmq.utilsr   Zjupyter_client.jsonutilr   ImportErrorr	   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*   r:   r_   r   r   r   r   r   <module>   sP    
	
Vo