o
    "ifj+                     @   s   d Z ddlZddlmZmZmZmZmZ ddlm	Z	m
Z
mZmZmZ ddlmZ g dZd&d	d
Zdd Zd'ddZdd Zd'ddZdd Zd'ddZd(ddZd(ddZdd Zd)ddZd*d d!Zd*d"d#Zd*d$d%ZdS )+z=
Methods for detecting objects leading to pickling failures.
    N)ismethod
isfunctionistracebackisframeiscode   )parent	referenceatparentschildren)trace)baditems
badobjectsbadtypescodeerrorsfreevars	getmodule
globalvars
nestedcodenestedglobals	outermostreferredglobalsreferrednestedr   varnamesFc                 C   sZ   ddl m} || |}|s|s|S ddl}ddlm} || dd}|t| v r+|S dS )zget the module of the objectr   )r   Nr   )getnameT)force)inspectr   builtinssourcer   varskeys)object	_filenamer   getmodmoduler   r   name r(   D/var/www/html/corbot_env/lib/python3.10/site-packages/dill/detect.pyr      s   
r   c              	      s   t | r| jjp	i }nt| r| jpi }ndS | }ddlm} z
|| dd\}}W n ty9   g d}}Y nw d|  fdd|D }|D ]\}}z||||fkr\|W   S W qJ tyf   Y qJw dS )	zget outermost enclosing object (i.e. the outer function in a closure)

    NOTE: this is the object-equivalent of getsource(func, enclosing=True)
    Nr   )getsourcelinesT)	enclosing c                 3   s$    | ]\}}| v r||fV  qd S Nr(   ).0r'   objr   r(   r)   	<genexpr>3      " zoutermost.<locals>.<genexpr>)	r   __func____globals__r   itemsr    r*   	Exceptionjoin)func_globalsr*   lineslnum_localsr'   r/   r(   r0   r)   r       s(   
r   Tc                 C   sf   t | } t| s
g S t }| jD ]}|du rqt |}|r.|| |r.|tt|ddO }qt|S )zAget the code objects for any nested functions (e.g. in a closure)NTrecurse)r   r   set	co_constsaddr   list)r8   r>   nestedcor(   r(   r)   r   <   s   


r   c                 C   sH   t | r| j} t| r| j} t| r| j} t| r| j} t| r"| S dS )z~get the code object for the given function or method

    NOTE: use dill.source.getsource(CODEOBJ) to get the source code
    N)	r   r3   r   __code__r   tb_framer   f_coder   r8   r(   r(   r)   r   I   s   r   c                 C   s   ddl }t }t| |D ]H}||D ]@}t|dd}t|dd|u r)|| qt|dd|u r7|| qt|dd|u rE|| qt|drS||u rS|| qqt|S )aJ  get functions defined inside of func (e.g. inner functions in a closure)

    NOTE: results may differ if the function has been executed or not.
    If len(nestedcode(func)) > len(referrednested(func)), try calling func().
    If possible, python builds code objects, but delays building functions
    until func() is called.
    r   Nr3   rE   rG   co_code)gcr?   r   get_referrersgetattrrA   hasattrrB   )r8   r>   rJ   funcsrD   r/   _r(   r(   r)   r   V   s   r   c                    sF   t rjtrjpd jjni S  fdd}t| S )zgget objects defined in enclosing code that are referred to by func

    returns a dict of {name:object}r(   c               	   3   sD    t  D ]\} }z|j}W n	 ty   Y qw | |jfV  qd S r-   )zipcell_contents
ValueError)r'   crQ   closuresr8   r(   r)   get_cell_contents   s   
z#freevars.<locals>.get_cell_contents)r   r3   r   __closure__rE   co_freevarsdict)r8   rV   r(   rT   r)   r   u   s   


r   c           
      C   s  t | } | du rt S ddl}ddlm} |jdk}t }|d}t|  W d   n1 s1w   Y  | 	 D ]'}d|v rc|
dd	 
d
d }|r^||dddd q<|| q<t| dt D ]}	|	r~|r~t|	r~|t|	dd qkt|S )z.get the names of any globals found within funcNr   r   )capturei stdout_GLOBAL()zNULL + r,   z + NULLr@   Tr=   )r   rB   systemprZ   
hexversionr?   disgetvalue
splitlinessplitrA   replacerL   tupler   updater   )
r8   r>   r`   rZ   CAN_NULLnamesoutliner'   rD   r(   r(   r)   r      s*   


r   c                 C   s   t | || S )z@get the names of objects in the global scope referred to by func)r   r"   )r8   r>   builtinr(   r(   r)   r      s   r   c           	   	      s  t | r| j} t| r{|rttt ni  | t }} |jp!i D ]#}z|j	}W n	 t
y2   Y q"w t|||p:i }| |  | q" |jpLi  |sX| |jj n_| t|j |  D ]} |}||u rpqd| t|d| qdn<t| r|rttt ni  |s| j} n&| j}tt| } |  D ]}||u rq |}| t|d| qni S t fdd| D S )zdget objects defined in global scope that are referred to by func

    return a dict of {name:object}Tc                 3   s$    | ]}| v r| | fV  qd S r-   r(   )r.   r'   globsr(   r)   r1      r2   zglobalvars.<locals>.<genexpr>)r   r3   r   r!   r   sumcopyr?   rW   rQ   rR   r   ri   r4   rE   co_namesr   getr   co_namerY   )	r8   r>   rn   	orig_funcr/   rQ   _varskeynested_funcr(   ro   r)   r      sJ   



r   c                 C   s    t | } t| s
dS | j| jfS )ztget names of variables defined by func

    returns a tuple (local vars, local vars referrenced by nested functions)r(   )r   r   co_varnamesco_cellvarsrH   r(   r(   r)   r      s   r   c                    sd   t | dsdd t| dfD S t| ddr|  n| } g   fdd| D  dd  D S )	z'get items in object that fail to pickle__iter__c                 S      g | ]}|d ur|qS r-   r(   r.   jr(   r(   r)   
<listcomp>       zbaditems.<locals>.<listcomp>r   valuesNc              	      s(   g | ]}| vr  t|d qS )r   )appendr   )r.   i_objexactsafer(   r)   r      s   ( c                 S   r}   r-   r(   r~   r(   r(   r)   r      r   )rM   r   rL   r   )r/   r   r   r(   r   r)   r      s   
r   c                    sF   ddl m  srdS S t fddtD S )zget objects that fail to pickler   picklesNc                 3   >    | ]}t |s|tt | d  fV  qdS r   N)rL   r   r.   attrdepthr   r/   r   r   r(   r)   r1          &zbadobjects.<locals>.<genexpr>)dillr   rY   dirr/   r   r   r   r(   r   r)   r      s   r   c                    sJ   ddl m  srdS tS t fddtD S )z)get types for objects that fail to pickler   r   Nc                 3   r   r   )rL   r   r   r   r(   r)   r1      r   zbadtypes.<locals>.<genexpr>)r   r   typerY   r   r   r(   r   r)   r      s   r   c              	   C   s   ddl m}m} |sGz)|| }|r|| ksJ d|| f t|t| ks1J dt|t| f W dS  tyF   ddl}| d  Y S w i }t| D ]0}	zt| |	}
W n tyk   ddl}| d ||	< Y qMw ||
||s}t	|
|d ||||	< qM|S )z*get errors for objects that fail to pickler   )r   rr   z$Unpickling produces %s instead of %sNr   )
r   r   rr   r   r6   r`   exc_infor   rL   r   )r/   r   r   r   r   rr   pikr`   _dictr   _attrr(   r(   r)   r      s:   

r   )NF)T)TF)FF)r   FF)__doc__rc   r   r   r   r   r   r   pointersr   r	   r
   r   r   loggerr   __all__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r(   r(   r(   r)   <module>   s(   






5




		