U
    d                     @   s   d Z ddlmZmZmZmZmZmZmZ ddlm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZmZmZmZ G dd	 d	eZdddZdS )zisort:skip_file    )EXT1EXT2EXT4GLOBALSTACK_GLOBALPicklerPicklingError)_compat_pickle_extension_registry_getattribute_Pickler)pack)FunctionType   )ImporterObjMismatchErrorObjNotFoundErrorsys_importerc                       s0   e Zd ZdZed fddZdddZ  ZS )	PackagePicklerzPackage-aware pickler.

    This behaves the same as a normal pickler, except it uses an `Importer`
    to find objects and modules to save.
    )importerc                    s0   || _ t j|| tj | _tj| jt< d S )N)	r   super__init__r   dispatchcopyr   save_globalr   )selfr   argskwargs	__class__ B/tmp/pip-unpacked-wheel-ua33x9lu/torch/package/_package_pickler.pyr      s    zPackagePickler.__init__Nc              
   C   s2  | j }| j}z| j||\}}W n@ ttfk
rb } ztd| dt| d W 5 d }~X Y nX | j|}t	||\}}	| j
dkrt||f}
|
r|
dkst|
dkr|ttd|
  n.|
dkr|ttd|
  n|ttd	|
  d S |d
d }|	|kr|}| j
dkr:| | | | |t n|	|k	rV| t|	|f n| j
dkr|tt|d d t|d d  n| jrtj}tj}||f|kr|||f \}}n||kr|| }z(|tt|d d t|d d  W n, tk
r"   td||| j
f d Y nX | | d S )NzCan't pickle z:    r      z<Bi  z<Hz<i.      zutf-8   
asciiz?can't pickle global identifier '%s.%s' using pickle protocol %i)writememor   get_namer   r   r   strimport_moduler   protor
   getAssertionErrorr   r   r   r   
rpartitionsaver   save_reducegetattrr   bytesfix_importsr	   REVERSE_NAME_MAPPINGREVERSE_IMPORT_MAPPINGUnicodeEncodeErrormemoize)r   objnamer)   r*   module_nameerrmodule_parentcodelastnamer_name_mappingr_import_mappingr    r    r!   r      s    ,







zPackagePickler.save_global)N)__name__
__module____qualname____doc__r   r   r   __classcell__r    r    r   r!   r   
   s   r   r%   c                 C   s&   |t krt| |dS t|| |dS d S )N)protocol)r   r   r   )Zdata_bufr   rK   r    r    r!   create_picklere   s    rL   N)r%   )rI   pickler   r   r   r   r   r   r   r	   r
   r   r   structr   typesr   r   r   r   r   r   r   rL   r    r    r    r!   <module>   s   $[