o
    ˷e4                     @   sF  d Z ddlZddlZddl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
mZ ddlmZmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ejejedZdZ dd Z!dd Z"dd Z#dd Z$dd Z%G dd dZ&G dd de&Z'G dd de&Z(G dd dZ)G dd  d Z*G d!d" d"Z+dS )#a  
Makes it possible to do the compiled analysis in a subprocess. This has two
goals:

1. Making it safer - Segfaults and RuntimeErrors as well as stdout/stderr can
   be ignored and dealt with.
2. Make it possible to handle different Python versions as well as virtualenvs.
    N)partial)Thread)pickle_dumppickle_load)debug)memoize_method)	functions)DirectObjectAccess
AccessPathSignatureParam)InternalErrorz__main__.py   c                  O   sR   t jdkrztj}W n ty   d}Y nw ||d< dtjv |d< tj| i |S )Nnti   creationflagsposix	close_fds)osname
subprocessCREATE_NO_WINDOWAttributeErrorsysbuiltin_module_namesPopen)argskwargsr    r   b/var/www/ideatree/venv/lib/python3.10/site-packages/jedi/inference/compiled/subprocess/__init__.py_GeneralizedPopen!   s   

r   c                 C   s    t | jdD ]}|| qd S )N    )iterreadlineput)outqueue_liner   r   r   _enqueue_output0   s   r&   c                 C   sH   	 z|   }|dd}td|d  W n tjy"   Y d S w q)NTutf-8replacezstderr output: %s
)
get_nowaitdecoder   warningrstripqueueEmpty)stderr_queuer%   r   r   r   _add_stderr_to_debug5   s   r1   c                 C   s
   t t| S N)getattrr   )r   r   r   r   _get_functionA      
r4   c              	   C   sh   z
|    |   W n	 ty   Y nw |  | j| j| jfD ]}z|  W q  ty1   Y q w d S r2   )killwaitOSErrorjoinstdinstdoutstderrclose)processthreadstreamr   r   r   _cleanup_processE   s   rA   c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_InferenceStateProcessc                 C   s    t || _t|| _i | _d S r2   )weakrefref_inference_state_weakrefid_inference_state_id_handles)selfinference_stater   r   r   __init__V   s   

z_InferenceStateProcess.__init__c                 C   sP   t |}z| |W S  ty'   t|  |}t| ||}| | | Y S w r2   )rG   get_access_handleKeyErrorr	   rF   AccessHandleset_access_handle)rJ   objid_accesshandler   r   r   get_or_create_access_handle[   s   
z2_InferenceStateProcess.get_or_create_access_handlec                 C   s
   | j | S r2   )rI   )rJ   rR   r   r   r   rM   e   r5   z(_InferenceStateProcess.get_access_handlec                 C   s   || j |j< d S r2   )rI   rG   )rJ   rT   r   r   r   rP   h   s   z(_InferenceStateProcess.set_access_handleN)__name__
__module____qualname__rL   rU   rM   rP   r   r   r   r   rC   U   s
    
rC   c                   @   s   e Zd ZdZdd ZdS )InferenceStateSameProcessz
    Basically just an easy access to functions.py. It has the same API
    as InferenceStateSubprocess and does the same thing without using a subprocess.
    This is necessary for the Interpreter process.
    c                 C   s   t t||  S r2   )r   r4   rF   rJ   r   r   r   r   __getattr__r      z%InferenceStateSameProcess.__getattr__N)rV   rW   rX   __doc__r[   r   r   r   r   rY   l   s    rY   c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	InferenceStateSubprocessc                    s   t  | d| _|| _d S )NF)superrL   _used_compiled_subprocess)rJ   rK   compiled_subprocess	__class__r   r   rL   w   s   
z!InferenceStateSubprocess.__init__c                    s   t |  fdd}|S )Nc                     s(   d_ jj  | |d}|S )NT)r   r   )r`   ra   runrF   _convert_access_handles)r   r   resultfuncrJ   r   r   wrapper   s   
	z5InferenceStateSubprocess.__getattr__.<locals>.wrapper)r4   )rJ   r   rj   r   rh   r   r[   |   s   z$InferenceStateSubprocess.__getattr__c                    s   t |trt t| S t |trt fdd|D S t |tr, fdd|D S t |trOz	 |j}W |S  tyN   |	   
| Y |S w t |tr\t |jS |S )Nc                 3   s    | ]}  |V  qd S r2   rf   .0orJ   r   r   	<genexpr>   s    zCInferenceStateSubprocess._convert_access_handles.<locals>.<genexpr>c                    s   g | ]}  |qS r   rk   rl   ro   r   r   
<listcomp>   s    zDInferenceStateSubprocess._convert_access_handles.<locals>.<listcomp>)
isinstancer   rf   tuplelistrO   rM   rG   rN   add_subprocessrP   r
   accesses)rJ   rQ   r   ro   r   rf      s$   





z0InferenceStateSubprocess._convert_access_handlesc                 C   s(   | j r| jjs| j| j d S d S d S r2   )r`   ra   
is_crasheddelete_inference_staterH   ro   r   r   r   __del__   s   z InferenceStateSubprocess.__del__)rV   rW   rX   rL   r[   rf   ry   __classcell__r   r   rc   r   r^   v   s
    r^   c                   @   sb   e Zd ZdZdddZdd Zedd Zd	i fd
dZdd Z	dd Z
d	i fddZdd ZdS )CompiledSubprocessFNc                 C   s$   || _ || _t | _dd | _d S )Nc                   S   s   d S r2   r   r   r   r   r   <lambda>   s    z-CompiledSubprocess.__init__.<locals>.<lambda>)_executable	_env_varscollectionsdeque_inference_state_deletion_queue_cleanup_callable)rJ   
executableenv_varsr   r   r   rL      s   
zCompiledSubprocess.__init__c                 C   s    t  }d| jj| j| j|f S )Nz*<%s _executable=%r, is_crashed=%r, pid=%r>)r   getpidrd   rV   r}   rw   )rJ   pidr   r   r   __repr__   s   zCompiledSubprocess.__repr__c              	   C   s   t d| j tjd j}| jttj	tj	|d
dd tjd d D f}t|tjtjtj| jd}t | _tt|j| jfd | _}d	|_|  t| t||| _|S )
NzStart environment subprocess %sparso.c                 s   s    | ]}t |V  qd S r2   )str)rm   xr   r   r   rp      s    z2CompiledSubprocess._get_process.<locals>.<genexpr>   )r:   r;   r<   env)targetr   T)r   dbgr}   r   modules__file__
_MAIN_PATHr   pathdirnamer9   version_infor   r   PIPEr~   r.   Queue_stderr_queuer   r&   r<   _stderr_threaddaemonstartrD   finalizerA   r   )rJ   
parso_pathr   r>   tr   r   r   _get_process   s6   

zCompiledSubprocess._get_processr   c                 C   sR   	 z| j  }W n	 ty   Y nw | |d  qt|sJ | t||||S r2   )r   pop
IndexError_sendcallablerG   )rJ   rK   functionr   r   inference_state_idr   r   r   re      s   zCompiledSubprocess.runc                 C   s   |  d tjdi S )Nr   )r   r   get_sys_pathro   r   r   r   r      r\   zCompiledSubprocess.get_sys_pathc                 C   s   d| _ |   d S )NT)rw   r   ro   r   r   r   _kill   s   zCompiledSubprocess._killc                 C   s  | j r
td| j ||||f}zt||  jt W n ty-   |   td| j w zt	|  j
\}}}W nC ty} }	 z7z|  j dd}
W n tye } z
d| }
W Y d }~nd }~ww |   t| j td| j|	|
f d }	~	ww t| j |r|f|_||S )NzThe subprocess %s has crashed.z2The subprocess %s was killed. Maybe out of memory?r'   r(   z<empty/not available (%r)>z.The subprocess %s has crashed (%r, stderr=%s).)rw   r   r}   r   r   r:   PICKLE_PROTOCOLBrokenPipeErrorr   r   r;   EOFErrorr<   readr+   	Exceptionr1   r   r   )rJ   r   r   r   r   datais_exception	tracebackrg   	eof_errorr<   excr   r   r   r      sH   

zCompiledSubprocess._sendc                 C   s   | j | dS )a0  
        Currently we are not deleting inference_state instantly. They only get
        deleted once the subprocess is used again. It would probably a better
        solution to move all of this into a thread. However, the memory usage
        of a single inference_state shouldn't be that high.
        N)r   append)rJ   r   r   r   r   rx     s   z)CompiledSubprocess.delete_inference_stater2   )rV   rW   rX   rw   rL   r   r   r   re   r   r   r   rx   r   r   r   r   r{      s    
	
%r{   c                   @   rB   )
Listenerc                 C   s   i | _ tt| _d S r2   )_inference_statesrC   r   _processro   r   r   r   rL     s   zListener.__init__c                 C   sV   ddl m} z| j| }W |S  ty*   ddlm} |d | d}|| j|< Y |S w )Nr   )InferenceState)InterpreterEnvironment)projectenvironment)jedi.inferencer   r   rN   jedir   )rJ   r   r   r   rK   r   r   r   r   _get_inference_state#  s   
zListener._get_inference_statec           
      C   s   |d u r||i |S |d u r| j |= d S | ||}t|}t|D ]\}}t|tr5|j|j||< q#|	 D ]\}}	t|	trL|j|	j||< q:||g|R i |S r2   )
r   r   rt   	enumeraterr   rO   rb   rM   rG   items)
rJ   r   r   r   r   rK   iargkeyvaluer   r   r   _run3  s   

zListener._runc              
   C   s   t j}ttjdt _t j}|j}|j}	 zt|}W n ty'   t	d Y nw z
dd | j
| f}W n tyK } zdt |f}W Y d }~nd }~ww t||t q)NwTr   F)r   r;   openr   devnullr:   bufferr   r   exitr   r   r   
format_excr   r   )rJ   r;   r:   payloadrg   er   r   r   listenF  s&   zListener.listenN)rV   rW   rX   rL   r   r   r   r   r   r   r   r     s
    r   c                   @   sP   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	e
dd ZdS )rO   c                 C   s   || _ || _|| _d S r2   )rS   _subprocessrG   )rJ   r   rS   rR   r   r   r   rL   _  s   
zAccessHandle.__init__c                 C   
   || _ d S r2   )r   )rJ   r   r   r   r   ru   d  r5   zAccessHandle.add_subprocessc                 C   s<   z| j }W n ty   dt| j }Y nw d| jj|f S )N#z
<%s of %s>)rS   r   r   rG   rd   rV   )rJ   detailr   r   r   r   g  s   
zAccessHandle.__repr__c                 C   s   | j S r2   rG   ro   r   r   r   __getstate__n  s   zAccessHandle.__getstate__c                 C   r   r2   r   )rJ   stater   r   r   __setstate__q  r5   zAccessHandle.__setstate__c                 C   s&   |dv s	| drtdt| j|S )N)rG   rS   _z$Something went wrong with unpickling)
startswithr   r   _workaroundrZ   r   r   r   r[   t  s   zAccessHandle.__getattr__c                 O   sH   |rt |d tr| jj| j|g|R i |S | j|g|R i |S )z
        TODO Currently we're passing slice objects around. This should not
        happen. They are also the only unhashable objects that we're passing
        around.
        r   )rr   slicer   get_compiled_method_returnrG   _cached_resultsrJ   r   r   r   r   r   r   r   {  s   zAccessHandle._workaroundc                 O   s   | j j| j|g|R i |S r2   )r   r   rG   r   r   r   r   r     s   zAccessHandle._cached_resultsN)rV   rW   rX   rL   ru   r   r   r   r[   r   r   r   r   r   r   r   rO   ^  s    
rO   ),r]   r   r   r   r.   r   r   rD   	functoolsr   	threadingr   jedi._compatibilityr   r   r   r   
jedi.cacher   "jedi.inference.compiled.subprocessr   jedi.inference.compiled.accessr	   r
   r   jedi.api.exceptionsr   r   r9   r   r   r   r   r   r&   r1   r4   rA   rC   rY   r^   r{   r   rO   r   r   r   r   <module>   s:    	
0vB