
    f4                        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j6                  j9                  ej6                  j;                  e      d      ZdZ d Z!d Z"d Z#d Z$d Z% G d d      Z& G d de&      Z' G d de&      Z( G d d      Z) G d d      Z* G d d      Z+y)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                      t         j                  dk(  r	 t        j                  }||d<   dt
        j                  v |d<   t        j                  | i |S # t        $ r d}Y <w xY w)Nnti   creationflagsposix	close_fds)osname
subprocessCREATE_NO_WINDOWAttributeErrorsysbuiltin_module_namesPopen)argskwargsr   s      f/var/www/cvtools/html/venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/__init__.py_GeneralizedPopenr   !   sn    	ww$	*):: #3 "S%=%==F;T,V,,  	*)	*s   A A"!A"c                 \    t        | j                  d      D ]  }|j                  |        y )N    )iterreadlineput)outqueue_lines      r   _enqueue_outputr(   0   s(    S\\3' 

4r!   c                     	 	 | j                         }|j                  dd      }t        j                  d|j	                  d      z         K# t
        j                  $ r Y y w xY w)Nutf-8replacezstderr output: %s
)
get_nowaitdecoder   warningrstripqueueEmpty)stderr_queuer'   s     r   _add_stderr_to_debugr4   5   s`    
	**,D;;w	2DMM-D0AAB  {{ 		s   A	A A#"A#c                 "    t        t        |       S N)getattrr	   )r   s    r   _get_functionr8   A   s    9d##r!   c                    	 | j                          | j                          |j                          | j                  | j
                  | j                  fD ]  }	 |j                           y # t        $ r Y Uw xY w# t        $ r Y 1w xY wr6   )killwaitOSErrorjoinstdinstdoutstderrclose)processthreadstreams      r   _cleanup_processrE   E   s{     KKM=='..'..A 	LLN	    		s#    A, A;,	A87A8;	BBc                   $    e Zd Zd Zd Zd Zd Zy)_InferenceStateProcessc                 f    t        j                  |      | _        t        |      | _        i | _        y r6   )weakrefref_inference_state_weakrefid_inference_state_id_handles)selfinference_states     r   __init__z_InferenceStateProcess.__init__V   s'    (/O(D%#%o#6 r!   c                     t        |      }	 | j                  |      S # t        $ r= t        | j	                         |      }t        | ||      }| j                  |       |cY S w xY wr6   )rL   get_access_handleKeyErrorr
   rK   AccessHandleset_access_handle)rO   objid_accesshandles        r   get_or_create_access_handlez2_InferenceStateProcess.get_or_create_access_handle[   sf    g	))#.. 	'(E(E(GMF!$4F""6*M		s    AA$#A$c                      | j                   |   S r6   )rN   )rO   rX   s     r   rS   z(_InferenceStateProcess.get_access_handlee   s    }}S!!r!   c                 6    || j                   |j                  <   y r6   )rN   rL   )rO   rZ   s     r   rV   z(_InferenceStateProcess.set_access_handleh   s    #)fii r!   N)__name__
__module____qualname__rQ   r[   rS   rV    r!   r   rG   rG   U   s    
"*r!   rG   c                       e Zd ZdZd Zy)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                 H    t        t        |      | j                               S r6   )r   r8   rK   rO   r   s     r   __getattr__z%InferenceStateSameProcess.__getattr__r   s    }T*D,I,I,KLLr!   N)r^   r_   r`   __doc__rf   ra   r!   r   rc   rc   l   s    
Mr!   rc   c                   0     e Zd Z fdZd Zd Zd Z xZS )InferenceStateSubprocessc                 @    t         |   |       d| _        || _        y )NF)superrQ   _used_compiled_subprocess)rO   rP   compiled_subprocess	__class__s      r   rQ   z!InferenceStateSubprocess.__init__w   s    )
$7!r!   c                 ,     t        |       fd}|S )Nc                      d_         j                  j                  j                         | |      }j	                  |      S )NT)r   r   )rl   rm   runrK   _convert_access_handles)r   r   resultfuncrO   s      r   wrapperz5InferenceStateSubprocess.__getattr__.<locals>.wrapper   sM    DJ..22--/	 3 F //77r!   )r8   )rO   r   rv   ru   s   `  @r   rf   z$InferenceStateSubprocess.__getattr__|   s    T"	8 r!   c                 @    t        |t              r t         j                  t        |             S t        |t              rt         fd|D              S t        |t              r|D cg c]  } j                  |       c}S t        |t
              r	  j                  |j                        }|S t        |t              r$t         j                  |j                              S |S c c}w # t        $ r& |j                           j                  |       Y |S w xY w)Nc              3   @   K   | ]  }j                  |        y wr6   )rs   ).0orO   s     r   	<genexpr>zCInferenceStateSubprocess._convert_access_handles.<locals>.<genexpr>   s     FQ55a8Fs   )
isinstancer   rs   tuplelistrU   rS   rL   rT   add_subprocessrV   r   accesses)rO   rW   rz   s   `  r   rs   z0InferenceStateSubprocess._convert_access_handles   s    c>*!4#?#?c
#KLLU#F#FFFT"=@AD003AA\*,,,SVV4 
 Z(d::3<<HII
 B
  ,""4(&&s+ 
,s   *C)C. .+DDc                     | j                   r=| j                  j                  s&| j                  j                  | j                         y y y r6   )rl   rm   
is_crasheddelete_inference_staterM   rO   s    r   __del__z InferenceStateSubprocess.__del__   s9    ::d77BB%%<<T=U=UV C:r!   )r^   r_   r`   rQ   rf   rs   r   __classcell__)ro   s   @r   ri   ri   v   s    8
&$Wr!   ri   c                   X    e Zd ZdZddZd Zed        Zdi fdZd Z	d	 Z
di fd
Zd Zy)CompiledSubprocessFNc                 b    || _         || _        t        j                         | _        d | _        y )Nc                       y r6   ra   ra   r!   r   <lambda>z-CompiledSubprocess.__init__.<locals>.<lambda>   s    r!   )_executable	_env_varscollectionsdeque_inference_state_deletion_queue_cleanup_callable)rO   
executableenv_varss      r   rQ   zCompiledSubprocess.__init__   s*    %!/:/@/@/B,!-r!   c           	          t        j                         }d| j                  j                  d| j                  d| j
                  d|d	S )N<z _executable=z, is_crashed=z, pid=>)r   getpidro   r^   r   r   )rO   pids     r   __repr__zCompiledSubprocess.__repr__   s7    iikNN##OO	
 	
r!   c           	         t        j                  d| j                         t        j                  d   j
                  }| j                  t        t        j                  j                  t        j                  j                  |            dj                  d t        j                  d d D              f}t        |t        j                  t        j                  t        j                  | j                        }t!        j"                         | _        t'        t(        |j*                  | j$                  f      x| _        }d|_        |j1                          t3        j4                  | t6        ||      | _        |S )	NzStart environment subprocess %sparso.c              3   2   K   | ]  }t        |        y wr6   )str)ry   xs     r   r{   z2CompiledSubprocess._get_process.<locals>.<genexpr>   s     :SV:s      )r>   r?   r@   env)targetr   T)r   dbgr   r   modules__file__
_MAIN_PATHr   pathdirnamer=   version_infor   r   PIPEr   r1   Queue_stderr_queuer   r(   r@   _stderr_threaddaemonstartrI   finalizerE   r   )rO   
parso_pathr   rB   ts        r   _get_processzCompiledSubprocess._get_process   s   		3T5E5EF[[)22
GGOOBGGOOJ78HH:S%5%5bq%9::	
 $//????
 #[[]"("..$"4"45#
 	
a 		 ")!1!1$2B2923"5 r!   ra   c                     	 	 | j                   j                         }| j                  |d        .# t        $ r Y nw xY wt	        |      sJ | j                  t        |      |||      S r6   )r   pop_send
IndexErrorcallablerL   )rO   rP   functionr   r   inference_state_ids         r   rr   zCompiledSubprocess.run   ss    5%)%I%I%M%M%O" 

-t4   
 !!!zz"_-xvFFs   0 	<<c                 F    | j                  d t        j                  di       S )Nra   )r   r	   get_sys_pathr   s    r   r   zCompiledSubprocess.get_sys_path   s    zz$	 6 6B??r!   c                 2    d| _         | j                          y )NT)r   r   r   s    r   _killzCompiledSubprocess._kill   s     r!   c           
         | j                   rt        d| j                  z        ||||f}	 t        || j	                         j
                  t               	 t        | j	                         j                        \  }}}t!        | j"                         |r
|f|_        ||S # t        $ r) | j                          t        d| j                  z        w xY w# t        $ r}		 | j	                         j                  j                         j                  dd      }
n# t        $ r}d|z  }
Y d }~nd }~ww xY w| j                          t!        | j"                         t        d| j                  d|	d|
d	      d }	~	ww xY w)
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 z has crashed (z	, stderr=z).)r   r   r   r   r   r>   PICKLE_PROTOCOLBrokenPipeErrorr   r   r?   EOFErrorr@   readr.   	Exceptionr4   r   r   )rO   r   r   r   r   datais_exception	tracebackrt   	eof_errorr@   excs               r   r   zCompiledSubprocess._send   se   ?? @4CSCS STT!8T69	4d//177I	.9$:K:K:M:T:T.U+L)V 	T//0 %,FKL9  	4JJL T"&"2"2!3 4 4	4  	<**,3388:AA'9U <5;<JJL !3!34$$ 	sH   )B  'C  2C	E<8DE7	D0!D+&E7+D00AE77E<c                 :    | j                   j                  |       y)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)rO   r   s     r   r   z)CompiledSubprocess.delete_inference_state  s     	,,334FGr!   r6   )r^   r_   r`   r   rQ   r   r   r   rr   r   r   r   r   ra   r!   r   r   r      sP    J.
  > 35R G@! 8:" #JHr!   r   c                   $    e Zd Zd Zd Zd Zd Zy)Listenerc                 :    i | _         t        t              | _        y r6   )_inference_statesrG   r   _processr   s    r   rQ   zListener.__init__  s    !# /x8r!   c                     ddl m} 	 | j                  |   }|S # t        $ r( ddlm}  |d  |             }|| j                  |<   Y |S w xY w)Nr   )InferenceState)InterpreterEnvironment)projectenvironment)jedi.inferencer   r   rT   jedir   )rO   r   r   r   rP   r   s         r   _get_inference_statezListener._get_inference_state#  si    1
	I"445GHO   	I3, 24	O :ID""#56	Is    -A
	A
c                    | ||i |S || j                   |= y | j                  ||      }t        |      }t        |      D ]>  \  }}t	        |t
              s|j                  j                  |j                        ||<   @ |j                         D ]>  \  }}	t	        |	t
              s|j                  j                  |	j                        ||<   @  ||g|i |S r6   )
r   r   r~   	enumerater|   rU   rn   rS   rL   items)
rO   r   r   r   r   rP   iargkeyvalues
             r   _runzListener._run3  s    %T,V,,&&'9:"77BTUO :D#D/ \3c<0-AASSTWTZTZ[DG\ %lln b
Ue\2"1"E"E"W"WX]X`X`"aF3Kb O=d=f==r!   c                    t         j                  }t        t        j                  d      t         _        t         j
                  }|j                  }|j                  }	 	 t        |      }	 dd  | j                   f}t        ||t               1# t        $ r t        d       Y ;w xY w# t        $ r!}dt        j                         |f}Y d }~Qd }~ww xY w)NwTr   F)r   r?   openr   devnullr>   bufferr   r   exitr   r   r   
format_excr   r   )rO   r?   r>   payloadrt   es         r   listenzListener.listenF  s     "**c*
		%e,
9idii&99 8    Q  9y335q89s*   B *B( B%$B%(	C1CCN)r^   r_   r`   rQ   r   r   r   ra   r!   r   r   r     s    9 >&9r!   r   c                   F    e Zd Zd Zd Zd Zd Zd Zd Zd Z	e
d        Zy	)
rU   c                 .    || _         || _        || _        y r6   )rY   _subprocessrL   )rO   r   rY   rX   s       r   rQ   zAccessHandle.__init___  s    %r!   c                     || _         y r6   )r   )rO   r   s     r   r   zAccessHandle.add_subprocessd  s
    %r!   c                     	 | j                   }d| j                  j
                  d|dS # t        $ r dt        | j                        z   }Y @w xY w)N#r   z of r   )rY   r   r   rL   ro   r^   )rO   details     r   r   zAccessHandle.__repr__g  sK    	([[F  $~~66??  	(3tww<'F	(s   + !AAc                     | j                   S r6   rL   r   s    r   __getstate__zAccessHandle.__getstate__n  s    wwr!   c                     || _         y r6   r   )rO   states     r   __setstate__zAccessHandle.__setstate__q  s	    r!   c                 n    |dv s|j                  d      rt        d      t        | j                  |      S )N)rL   rY   _z$Something went wrong with unpickling)
startswithr   r   _workaroundre   s     r   rf   zAccessHandle.__getattr__t  s7    ##ts'; !GHH t''..r!   c                     |r>t        |d   t              r+ | j                  j                  | j                  |g|i |S  | j
                  |g|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   )r|   slicer   get_compiled_method_returnrL   _cached_resultsrO   r   r   r   s       r   r   zAccessHandle._workaround{  s[     JtAw.>4##>>tww^t^W]^^#t##D:4:6::r!   c                 X     | j                   j                  | j                  |g|i |S r6   )r   r   rL   r   s       r   r   zAccessHandle._cached_results  s,    :t::477DZ4ZSYZZr!   N)r^   r_   r`   rQ   r   r   r   r   rf   r   r   r   ra   r!   r   rU   rU   ^  s<    
&@/; [ [r!   rU   ),rg   r   r   r   r1   r   r   rI   	functoolsr   	threadingr   jedi._compatibilityr   r   r   r   
jedi.cacher   "jedi.inference.compiled.subprocessr	   jedi.inference.compiled.accessr
   r   r   jedi.api.exceptionsr   r   r=   r   r   r   r   r   r(   r4   r8   rE   rG   rc   ri   r   r   rU   ra   r!   r   <module>r	     s     	 
       8  % 8  - WW\\"''//(3]C
-
	$ * *.M 6 M-W5 -W`sH sHl?9 ?9D)[ )[r!   