
    wi*                        d dl Z d dlZd dlmZ d dlZd dlmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d dlZd dlmZ d dlmZ ej        ZdZd	Zd
 Zd ZdedfdZdedfdZddZddZd Z G d d          Z edd            Z!efdZ"e#dk    r? e$e j%        e j%        &                    d          dz                      Z' ee'           dS dS )    N)Popencheck_outputPIPESTDOUTCalledProcessError)pickle)contextmanager)ProcessPoolExecutor)dumps)TimeoutExpired<   a test valuec                      d } | S )Nc                 T    t           dk    sJ t          t          d                    S )Nr   
   )TEST_GLOBALSsumrange)xs    q/root/.openclaw/workspace/chatterbox_venv_py311/lib/python3.11/site-packages/srsly/tests/cloudpickle/testutils.pygzmake_local_function.<locals>.g   s'     ~----599~~     )r   s    r   make_local_functionr      s       Hr   c                  $   t          j        t          j        t          j        t                    d                    } t
          j                                        }d                    | t
          j	        t
          j
                  }||d<   | |fS )z5Helper to prepare environment for the child processesz..z{src}{sep}tests{pathsep}{src})srcseppathsep
PYTHONPATH)opnormpathjoindirname__file__osenvironcopyformatr   r   )cloudpickle_repo_folderenv
pythonpaths      r   _make_cwd_envr,      sz     k

8$$d++- -
*//

C077# 8 E EJ"C"C''r   c           	         t           j        dt          dt          |          g}t	                      \  }}|r|                    |           t          |t          t          t          ||d          }t          | |          }	 i }	||	d<    |j	        |fi |	\  }
}|j
        dk    st          |          r1d|j
        z  }||                    d	          z  }t          |          |
S # t          $ r}}|                                 |	                                \  }
}d
                    |
                    d	          |                    d	          g          }t          |          |d}~ww xY w)u  Retrieve pickle string of an object generated by a child Python process

    Pickle the input data into a buffer, send it to a subprocess via
    stdin, expect the subprocess to unpickle, re-pickle that data back
    and send it back to the parent process via stdout for final unpickling.

    >>> testutils.subprocess_pickle_string([1, 'a', None], protocol=2)
    b']q (KX   aqNe.'

    	-W ignore
--protocol   )stdinstdoutstderrcwdr*   bufsizeprotocoltimeoutr   zSubprocess returned %d: utf-8
N)sys
executabler$   strr,   updater   r   r   communicate
returncodelendecodeRuntimeErrorr   killr"   )
input_datar7   r8   add_envcmdr4   r*   procpickle_stringcomm_kwargsouterrmessagees                 r   subprocess_pickle_stringrO   (   sv   " >;,H
NCHC 

7Dd  D*x888M+!(I#4#MAA[AAS?a3s8804?BGszz'***Gw'''
 + + +		##%%S))SZZ00#**W2E2EFGG7##*	+s   A$C( (
E/2A8E**E/c                 F    t          | |||          }t          |          S )aH  Echo function with a child Python process
    Pickle the input data into a buffer, send it to a subprocess via
    stdin, expect the subprocess to unpickle, re-pickle that data back
    and send it back to the parent process via stdout for final unpickling.
    >>> subprocess_pickle_echo([1, 'a', None])
    [1, 'a', None]
    )r7   r8   rF   )rO   loads)rE   r7   r8   rF   rK   s        r   subprocess_pickle_echorR   P   s1     #:,4+2+24 4 4C ::r   r0   c                 j    d}	 |                      |          }||z  }t          |          |k     rn/|S )Nr   )readrA   )	stream_in
chunk_sizeall_datadatas       r   _read_all_bytesrY   `   sG    H~~j))Dt99z!!	
 Or   c                 r   | t           j        } |t           j        }t          | d          r| j        } t          |d          r|j        }t          |           }|                                  t          |          }t          ||          }|	                    |           |                                 dS )z5Read a pickle from stdin and pickle it back to stdoutNbufferr6   )
r;   r1   r2   hasattrr[   rY   closerQ   r   write)rU   
stream_outr7   input_bytesobjrepickled_bytess         r   pickle_echorc   j   s    I	Z
 y(## %$	z8$$ '&
!),,KOO


CC(333O_%%%r   c                     t          |           \  }}}	  ||i |}n# t          $ r}|}Y d}~nd}~ww xY wt          ||          S )zARemote function call that uses cloudpickle to transport everthingNr6   )rQ   BaseExceptionr   )payloadr7   funcargskwargsresultrN   s          r   	call_funcrk      sp    wD$t&v&&   (++++s    
4/4c                   (    e Zd ZddZd Zd Zd ZdS )_WorkerNc                     || _         t          d          | _        | j                            t          d                                           d S )N   )max_workers*   )r7   r
   poolsubmitidrj   )selfr7   s     r   __init__z_Worker.__init__   sE     'A666		R  '')))))r   c                     t          |||f| j                  }| j                            t          || j                                                  }t          |          }t          |t                    r||S )z Synchronous remote function callr6   )	r   r7   rr   rs   rk   rj   rQ   
isinstancere   )ru   rg   rh   ri   input_payloadresult_payloadrj   s          r   runz_Worker.run   st     tT62T]KKK))}dm5 55;VXX 	~&&fm,, 	Lr   c                    d t          | j        j                  D             }t          |          }|dk    rdS |dk    rt	          d|z            t          j        |d                                                   j        S )Nc                 @    g | ]}t          |d           r|j        n|S )pid)r\   r~   ).0ps     r   
<listcomp>z#_Worker.memsize.<locals>.<listcomp>   s=     = = = ")E!2!29 = = =r   r   ro   z Unexpected number of workers: %d)	listrr   
_processesrA   rC   psutilProcessmemory_inforss)ru   workers_pidsnum_workerss      r   memsizez_Worker.memsize   s    = =!%di&:!;!;= = =,''!11__A!, - . . .~l1o..::<<@@r   c                 <    | j                             d           d S )NT)wait)rr   shutdown)ru   s    r   r]   z_Worker.close   s!    	%%%%%r   N)__name__
__module____qualname__rv   r{   r   r]   r   r   r   rm   rm      sX        * * * *

 
 
	A 	A 	A& & & & &r   rm   c              #   Z   K   t          |           }|V  |                                 d S )Nr6   )rm   r]   )r7   workers     r   subprocess_workerr      s0      h'''F
LLL
LLNNNNNr   c                 z   t          j        d          \  }}t          j        |           	 t	          |d          5 }|                    |                     d                     ddd           n# 1 swxY w Y   t          j        d|g}t                      \  }}|t          |d}t          j                            d          }	|	r|	|d	         d<   ||d
<   	 	 t          |fi |}
n=# t          $ r0}t          d|j                            d          z            |d}~ww xY w|
dk    r"t%          |
                    d                    n=# t&          $ r0}t          d|j                            d          z            |d}~ww xY w	 t          j        |           dS # t          j        |           w xY w)zUtility to help check pickleability of objects defined in __main__

    The script provided in the source code should return 0 and not print
    anything on stderr or stdout.
    z_src_test_cloudpickle.py)suffixwbr9   Nr.   )r4   r3   r*   COVERAGE_PROCESS_STARTr*   r8   zscript errored with output:
%sr   z!script timeout, output so far:
%s)tempfilemkstempr%   r]   openr^   encoder;   r<   r,   r   r&   getr   r   rC   outputrB   AssertionErrorr   unlink)source_coder8   fdsource_filefrG   r4   r*   ri   coverage_rcrK   rN   s               r   assert_run_python_scriptr      s<    &.HIIIOBHRLLL+t$$ 	1GGK&&w//000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1~{K8 ??S
 
 jnn%=>> 	B6AF5M23#y
	BF"311&11% F F F"#D%&X__W%=%=$> ? ?DEFF czz$SZZ%8%8999  	B 	B 	BC!"!9!9 : ; ;@AB	B  		+	+sq   F$ )A3'F$ 3A77F$ :A7;AF$ C* )E *
D$4+DD$$+E F$ 
F
+FF

F$ $F:__main__r/   ro   r6   )r0   )NNNr   )(r;   r%   os.pathpathr    r   
subprocessr   r   r   r   r   srsly.cloudpickle.compatr   
contextlibr	   concurrent.futuresr
   r   srsly.cloudpickler   r   rQ   TIMEOUTr   r   r,   rO   rR   rY   rc   rk   rm   r   r   r   intargvindexr7   r   r   r   <module>r      s   



 				        L L L L L L L L L L L L L L + + + + + + % % % % % % 2 2 2 2 2 2  # # # # # # % % % % % %
  ( ( ( 37%)%+ %+ %+ %+P 15g#'          *, , ,& & & & & & & &B     3: # # # #L zs38CHNN<881<=>>HK"""""" r   