
    Zh+                         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Zd	 Zdd
Zd ZddZd ZddZddZddZd ZddZddZddZddZy)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   varnamesc                     ddl m}  || |      }|s|s|S ddl}ddlm}  || d      }|t        |      j                         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   names           Z/mounts/lovelace/software/anaconda3/envs/py312/lib/python3.12/site-packages/dill/detect.pyr   r      sK    +FI&FU6M6&DtH~22448>$>    c                    t        |       r| j                  j                  xs i }nt        |       r| j                  xs i }ny|j	                         }ddlm}  || d      \  }}dj                  |      fd|D        }|D ]  \  }}	  ||      ||fk(  r|c S  y# t        $ r g d}}Y Hw xY w# t        $ r Y 9w xY w)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   6   K   | ]  \  }}|v s||f  y wN ).0r)   objr   s      r*   	<genexpr>zoutermost.<locals>.<genexpr>3   s     EjtCSzEs   	)	r   __func____globals__r   itemsr"   r-   	Exceptionjoin)	func_globalsr-   lineslnum_localsr)   r4   r   s	           @r*   r   r       s    
 ~==,,2	D	##)r~~H&$TT:t 775>DEHEG S	c"uTl23J2
   d  		s$   B! B4!B10B14	C ?C c                     t        |       } t        |       sg S t               }| j                  D ]@  }|t        |      }|s|j	                  |       |s(|t        t        |d            z  }B t        |      S )zAget the code objects for any nested functions (e.g. in a closure)Trecurse)r   r   set	co_constsaddr   list)r;   rB   nestedcos       r*   r   r   <   st    :D$<UFnn D:x"XJJrN#jT&B"CCD <r+   c                     t        |       r| j                  } t        |       r| j                  } t	        |       r| j
                  } t        |       r| j                  } t        |       r| S y)z~get the code object for the given function or method

    NOTE: use dill.source.getsource(CODEOBJ) to get the source code
    N)	r   r6   r   __code__r   tb_framer   f_coder   r;   s    r*   r   r   I   sP    
 ~dmmt$4$t}T[[dd|D[
r+   c                    ddl }t               }t        | |      D ]  }|j                  |      D ]  }t	        |dd      }t	        |dd      |u r|j                  |       1t	        |dd      |u r|j                  |       Rt	        |dd      |u r|j                  |       st        |d      s||u s|j                  |         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   Nr6   rJ   rL   co_code)gcrC   r   get_referrersgetattrrE   hasattrrF   )r;   rB   rP   funcsrH   r4   _s          r*   r   r   V   s     EEw' G##B' 		GCZ.Aq*d+r1599S>j$/25uyy~h-3UYYs^i(SBY		#		GG" ;r+   c                      t               r j                   t               r' j                  xs d j                  j
                   ni S  fd}t         |             S )zgget objects defined in enclosing code that are referred to by func

    returns a dict of {name:object}r2   c               3      K   t              D ]"  \  } }	 |j                  }| |j                  f $ y # t        $ r Y 1w xY wwr1   )zipcell_contents
ValueError)r)   crY   closuresr;   s      r*   get_cell_contentsz#freevars.<locals>.get_cell_contents   sS     4* 	(GD! ! ''	(  s$   A6A	AAAA)r   r6   r   __closure__rJ   co_freevarsdict)r;   r]   r\   s   ` @r*   r   r   u   sV     ~dmmt$##)r}}((	( !#$$r+   c                    t        |       } | 
t               S ddl}ddlm} |j
                  dk\  }t               } |d      5 }	 t        j                  |        ddd       j                         j                         D ]r  }d|v s|j                  d      d	   j                  d
      d   }|r2|j                  |j                  dd      j                  dd             b|j                  |       t t        | dt                     D ]0  }	|	s|s	t!        |	      s|j#                  t%        |	d             2 t        |      S # t        $ r Y w xY w# 1 sw Y   xY w)z.get the names of any globals found within funcNr   r   )capturei stdout_GLOBAL()zNULL + r/   z + NULLrD   TrA   )r   rF   systemprb   
hexversionrC   dis
IndexErrorgetvalue
splitlinessplitrE   replacerR   tupler   updater   )
r;   rB   rh   rb   CAN_NULLnamesoutliner)   rH   s
             r*   r   r      s6   :D|DF]~~*HEE		 c	GGDM
 ))+  ::c?2&,,S1!4D		$,,y"5==iLM		$  dK1 :'fRjLLr489: ;  		 s*   EE	EEEEE c                 8    t        | ||      j                         S )z@get the names of objects in the global scope referred to by func)r   r$   )r;   rB   builtins      r*   r   r      s    dGW-2244r+   c                 l  	 t        |       r| j                  } t        |       r?|r&t        t	        t
                    j                         ni 	| t               } }|j                  xs i D ]B  }	 |j                  }t        |||      xs i }| j                  |       	j                  |       D 	j                  |j                  xs i        |s'| j                  |j                  j                         n| j                  t!        |j                               | j                         D ]4  }	j#                  |      }||u r| j                  t        |d|             6 nt%        |       r|r&t        t	        t
                    j                         ni 	|s| j                  } nj| j&                  }t        t!        |             } | j                         D ]4  }||u r	j#                  |      }| j                  t        |d|             6 ni S t)        	fd| D              S # t        $ r Y w xY w)zdget objects defined in global scope that are referred to by func

    return a dict of {name:object}Tc              3   6   K   | ]  }|v s||   f  y wr1   r2   )r3   r)   globss     r*   r5   zglobalvars.<locals>.<genexpr>   s      Ettu}eDk"Es   	)r   r6   r   r#   r   sumcopyrC   r^   rY   r   rr   rZ   r7   rJ   co_namesr   getr   co_namer`   )
r;   rB   rx   	orig_funcr4   rY   _varskeynested_funcr{   s
            @r*   r   r      s    ~dmmt$/6Ys^$))+B4	((.B 	$C$ # 1 1 #='7CIrE"U#	$ 	Y**0b1KK	**334KKi&8&89:yy{ D#iin)+J{D'BCD 
/6Ys^$))+B==DI}T*+Dyy{ D)##iinJ{D'BCD 	EtEEEM  s   /H&&	H32H3c                 `    t        |       } t        |       sy| j                  | j                  fS )ztget names of variables defined by func

    returns a tuple (local vars, local vars referrenced by nested functions)r2   )r   r   co_varnamesco_cellvarsrM   s    r*   r   r      s.     :D$<T----r+   c                 @   t        | d      s t        | d||      fD cg c]  }||	 c}S t        | dd      r| j                         n| } g }| D cg c]$  }||vs|j	                  t        |d||            & c} |D cg c]  }||	 c}S c c}w c c}w c c}w )z'get items in object that fail to pickle__iter__r   Nvalues)rS   r   rR   r   append)r4   exactsafej_objis         r*   r   r      s    3z"&s1U48:LaamLL!#ht4#**,#CD69KQd]T[[Aad+,K-!q}A--	 M L-s"   BB	BBB
Bc                 x     ddl m s        ry S t         fdt               D              S )zget objects that fail to pickler   picklesNc              3      K   | ]5  } t        |            s|t        t        |      d z
        f 7 ywr   N)rR   r   r3   attrdepthr   r4   r   r   s     r*   r5   zbadobjects.<locals>.<genexpr>   sH      Nwws4/@t'L 
73t#4U1WU4HI N   ;>)dillr   r`   dirr4   r   r   r   r   s   ````@r*   r   r      s>    3uT"4
 N3xN O Or+   c                      ddl m s        ryt               S t         fdt	               D              S )z)get types for objects that fail to pickler   r   Nc              3      K   | ]5  } t        |            s|t        t        |      d z
        f 7 ywr   )rR   r   r   s     r*   r5   zbadtypes.<locals>.<genexpr>   sH      Nwws4/@t'L T!2575FG Nr   )r   r   typer`   r   r   s   ````@r*   r   r      sC    3uT"4Cy N3xN O Or+   c                    ddl m}m} |sT	  ||       }|r|| k(  sJ d|d|        t        |      t        |       k(  sJ dt        |      dt        |              yi }t        |       D ].  }		 t        | |	      }
 ||
||      rt        |
|dz
  ||      ||	<   0 |S # t        $ r ddl}|j                         d   cY S w xY w# t        $ r ddl}|j                         d   ||	<   Y ~w xY w)z*get errors for objects that fail to pickler   )r   r}   zUnpickling produces z instead of Nr   )
r   r   r}   r   r9   rh   exc_infor   rR   r   )r4   r   r   r   r   r}   pikrh   _dictr   _attrs              r*   r   r     s
   "
	%s)Ccz G>A#FG9S	) O:>s)DINO EC ;	C%E
 uU4( uQwuT:E$K; L  	%<<>!$$	%  	,,.+E$K	s$   AB 0C CC#C+*C+)NF)T)TF)FF)r   FF)__doc__rk   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   r2   r+   r*   <module>r      sp     F F > > B?8
>%,252Fj..OOr+   