
    J/Ph                     Z   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mZ ddlm	Z	 d Z
i Zd Zd Zd Zej        Z G d	 d
          Zd Zd Z ej        ee           d Zd Zd Zd Zd Z G d dej                  Zd Zeej        e<    G d dej                  Z G d d          ZdS )z/
Serialization support for compiled functions.
    N)cloudpickle)irc                      | j         | S )zM
    Global hook to rebuild a given class from its __reduce__ arguments.
    )_rebuild)clsargss     T/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/numba/core/serialize.py_rebuild_reductionr
      s     3<    c                     | |f}	 t           |         }n.# t          $ r! t          j        |          xt           |<   }Y nw xY w|S )zUsed by `numba_unpickle` from _helperlib.c

    Parameters
    ----------
    address : int
    bytedata : bytes
    hashed : bytes

    Returns
    -------
    obj : object
        unpickled object
    )_unpickled_memoKeyErrorr   loads)addressbytedatahashedkeyobjs        r	   _numba_unpickler      sb     F
CAc" A A A%0%6x%@%@@sssAJs    (??c                     t           }t          j                    5 } ||d          }|                    |            |                                }ddd           n# 1 swxY w Y   |S )zISimilar to `pickle.dumps()`. Returns the serialized object in bytes.
       )protocolN)NumbaPicklerioBytesIOdumpgetvalue)r   picklerbufppickleds        r	   dumpsr"   4   s     G	 !GC!$$$	s,,..! ! ! ! ! ! ! ! ! ! ! ! ! ! !
 Ns   7AA"%A"c                 &   t          j        |           \  }}}g }t          |          }|D ]T}t          |t          j                  r#|                    t          |                     ?|                    |           U|t          |          |fS N)	r   r   iter
isinstancer   Valueappendnexttuple)
static_excexc_argsexcstatic_argslocinfo	real_argsexc_args_iterargs           r	   runtime_build_excinfo_structr3   @   s     + 1* = =CgINNM " "c28$$ 	"T-001111S!!!!y!!7++r   c                   8    e Zd ZdZdZd Zd Zed             ZdS )_CustomPickleda  A wrapper for objects that must be pickled with `NumbaPickler`.

    Standard `pickle` will pick up the implementation registered via `copyreg`.
    This will spawn a `NumbaPickler` instance to serialize the data.

    `NumbaPickler` overrides the handling of this type so as not to spawn a
    new pickler for the object when it is already being pickled by a
    `NumbaPickler`.
    ctorstatesc                 "    || _         || _        d S r$   r6   )selfr7   r8   s      r	   __init__z_CustomPickled.__init__]   s    	r   c                 6    t           j        | j        | j        ffS r$   )r5   r   r7   r8   r:   s    r	   _reducez_CustomPickled._reducea   s    &DK(@@@r   c                      | ||          S r$    )r   r7   r8   s      r	   r   z_CustomPickled._rebuildd   s    s4   r   N)	__name__
__module____qualname____doc__	__slots__r;   r>   classmethodr   r@   r   r	   r5   r5   P   sa          !I  A A A ! ! [! ! !r   r5   c                 F    t          |           \  }}t          ||          S )zPstandard unpickling for `_CustomPickled`.

    Uses `NumbaPickler` to load.
    )r   r5   )
serializedr7   r8   s      r	   _unpickle__CustomPickledrI   i   s%    
 $$LD&$'''r   c                 L    t          | j        | j        f          }t          |ffS )zNstandard pickling for `_CustomPickled`.

    Uses `NumbaPickler` to dump.
    )r"   r7   r8   rI   )cprH   s     r	   _pickle__CustomPickledrL   r   s'    
 +,,J#j]22r   c                 2    t           t          | |          ffS )a  For customizing object serialization in `__reduce__`.

    Object states provided here are used as keyword arguments to the
    `._rebuild()` class method.

    Parameters
    ----------
    states : dict
        Dictionary of object states to be serialized.

    Returns
    -------
    result : tuple
        This tuple conforms to the return type requirement for `__reduce__`.
    )custom_rebuildr5   )r   r8   s     r	   custom_reducerO      s      N377999r   c                 8    | j         | j        }} |j        di |S )ziCustomized object deserialization.

    This function is referenced internally by `custom_reduce()`.
    r@   )r7   r8   r   )custom_pickledr   r8   s      r	   rN   rN      s+    
 !%~'<C3<!!&!!!r   c                     t          j                    5 }t          |          }	 |                    |            	 ddd           dS # t          j        $ r Y ddd           dS w xY w# 1 swxY w Y   dS )zCheck if *obj* can be serialized.

    Parameters
    ----------
    obj : object

    Returns
    --------
    can_serialize : bool
    NTF)r   r   r   r   picklePicklingError)r   foutr   s      r	   is_serialiablerV      s     
 t$$	LL         # 	 	 	       		         s3   A)AA)A&A)%A&&A))A-0A-c                 L    t          j        dt          |            d          )NzPickling of z is unsupported)rS   rT   type)r   s    r	   
_no_picklerY      s%    

Hd3iiHHH
I
IIr   c                 D    t           j                            |            | S )z1This is called on a type to disable pickling
    )r   disabled_typesadd)typs    r	   disable_picklingr^      s      ##C(((Jr   c                   4     e Zd Z e            Z	  fdZ xZS )r   c                     t          |          | j        v rt          |           t                                          |          S r$   )rX   r[   rY   superreducer_override)r:   r   	__class__s     r	   rb   zNumbaPickler.reducer_override   s:    99+++sOOOww'',,,r   )rA   rB   rC   setr[   rb   __classcell__rc   s   @r	   r   r      sH        SUUN- - - - - - - - -r   r   c                 *    |                                  S r$   )r>   )rK   s    r	   _custom_reduce__custompickledrh      s    ::<<r   c                   ^    e Zd ZdZej        d             Zej        d             Zd Z	d Z
dS )ReduceMixinznA mixin class for objects that should be reduced by the NumbaPickler
    instead of the standard pickler.
    c                     t           r$   NotImplementedErrorr=   s    r	   _reduce_stateszReduceMixin._reduce_states       !!r   c                     t           r$   rl   )r   kwargss     r	   r   zReduceMixin._rebuild   ro   r   c                     | j         S r$   rf   r=   s    r	   _reduce_classzReduceMixin._reduce_class   s
    ~r   c                 j    t          |                                 |                                           S r$   )rO   rs   rn   r=   s    r	   
__reduce__zReduceMixin.__reduce__   s*    T//1143F3F3H3HIIIr   N)rA   rB   rC   rD   abcabstractmethodrn   abstractclassmethodr   rs   ru   r@   r   r	   rj   rj      s         
 	" " " 	" " "
  
J J J J Jr   rj   c                   :    e Zd ZdZd Zd Zd Zed             ZdS )PickleCallableByPatha  Wrap a callable object to be pickled by path to workaround limitation
    in pickling due to non-pickleable objects in function non-locals.

    Note:
    - Do not use this as a decorator.
    - Wrapped object must be a global that exist in its parent module and it
      can be imported by `from the_module import the_object`.

    Usage:

    >>> def my_fn(x):
    >>>     ...
    >>> wrapped_fn = PickleCallableByPath(my_fn)
    >>> # refer to `wrapped_fn` instead of `my_fn`
    c                     || _         d S r$   _fn)r:   fns     r	   r;   zPickleCallableByPath.__init__   s    r   c                      | j         |i |S r$   r|   )r:   r   rq   s      r	   __call__zPickleCallableByPath.__call__   s    tx((((r   c                 Z    t          |           j        | j        j        | j        j        ffS r$   )rX   r   r}   rB   rA   r=   s    r	   ru   zPickleCallableByPath.__reduce__   s%    Dzz"TX%8$(:K$MMMr   c                 T     | t          t          j        |         |                    S r$   )getattrsysmodules)r   modnamefn_paths      r	   r   zPickleCallableByPath._rebuild  s#    s73;w/99:::r   N)	rA   rB   rC   rD   r;   r   ru   rF   r   r@   r   r	   rz   rz      si           ) ) )N N N ; ; [; ; ;r   rz   )rD   r   rv   r   copyregrS   numbar   llvmliter   r
   r   r   r"   r3   r   r5   rI   rL   rO   rN   rV   rY   r^   CloudPicklerr   rh   dispatch_tableABCrj   rz   r@   r   r	   <module>r      s    


 



 				                   ,	 	 		, 	, 	, 	! ! ! ! ! ! ! !2( ( (3 3 3 ~5 6 6 6: : :&" " "  *J J J  	- 	- 	- 	- 	-;+ 	- 	- 	-   /L N +J J J J J#' J J J2; ; ; ; ; ; ; ; ; ;r   