o
    Ni7                     @   s   d dl Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 ddlmZ dd	lmZ d dlZd dlZd dlZG d
d de	jZG dd deZG dd dejZG dd deZG dd dejZdddZdS )    N   )parse_from_stringsStringParseContext)FileSourceDescriptor)CompileError)Symtab)Naming)Code)Optionsc                       s.   e Zd Zdd Z fddZdddZ  ZS )	NonManglingModuleScopec                 O   s8   || _ d | _|dd| _tjj| g|R i | d S )NcppF)prefixcython_scopepopr   r   ModuleScope__init__)selfr   argskw r   O/home/ubuntu/.local/lib/python3.10/site-packages/Cython/Compiler/UtilityCode.pyr      s   zNonManglingModuleScope.__init__c                    s   d|_ t |||S )NT)usedsuperadd_imported_entry)r   nameentrypos	__class__r   r   r      s   z)NonManglingModuleScope.add_imported_entryNc                 C   s<   |r|t jt jt jt jfv r| j}d||f S tj| |S )Nz%s%s)	r   typeobj_prefixfunc_prefix
var_prefixpyfunc_prefixr   r   r   mangle)r   r   r   r   r   r   r#      s
   zNonManglingModuleScope.mangleN)__name__
__module____qualname__r   r   r#   __classcell__r   r   r   r   r      s    r   c                   @   s   e Zd ZdZdddZdS )CythonUtilityCodeContextNTFc                 C   sZ   |rt d|| jkr|| jvrt d| j| S | jd u r*t| j|d | | jd| _| jS )Nz/Relative imports not supported in utility code.z%Only the cython cimport is supported.)parent_modulecontextr   )AssertionErrormodule_namemodulesscoper   r   r   )r   r-   from_moduler   need_pxdabsolute_fallbackrelative_importr   r   r   find_module)   s   



z$CythonUtilityCodeContext.find_module)NNTTF)r%   r&   r'   r/   r4   r   r   r   r   r)   &   s    r)   c                       s   e Zd ZdZdZ			dddZdd	 Zd
d Zdd ZdddZ	dddZ
e fddZedddZ		dddZedd Z  ZS )CythonUtilityCodeaR  
    Utility code written in the Cython language itself.

    The @cname decorator can set the cname for a function, method of cdef class.
    Functions decorated with @cname('c_func_name') get the given cname.

    For cdef classes the rules are as follows:
        obj struct      -> <cname>_obj
        obj type ptr    -> <cname>_type
        methods         -> <class_cname>_<method_cname>

    For methods the cname decorator is optional, but without the decorator the
    methods will not be prototyped. See Cython.Compiler.CythonScope and
    tests/run/cythonscope.pyx for examples.
    T	__pyxutil Nc
                 C   s   i }
|d ur*ddl m} | D ]\}}t||r!|||< ||
|< qt||||}|| _|| _|| _|| _	|p9g | _
|| _|	| _|| _|
| _d S )Nr   )BaseType)
PyrexTypesr8   items
isinstancer	   sub_tempitaimplr   filer   requires
from_scopeouter_module_scopecompiler_directivescontext_types)r   r=   r   r   r?   r>   r@   r+   rB   rA   rC   r8   keyvaluer   r   r   r   L   s$   	


zCythonUtilityCode.__init__c                 C   s   t |tr|  | kS dS )NF)r;   r5   _equality_params)r   otherr   r   r   __eq__g   s   
zCythonUtilityCode.__eq__c                 C   s.   | j }t|tr|j}t|ts| j|| jfS r$   )rA   r;   r   outer_scoper=   rB   )r   rI   r   r   r   rF   m   s
   

z"CythonUtilityCode._equality_paramsc                 C   s
   t | jS r$   )hashr=   r   r   r   r   __hash__s   s   
zCythonUtilityCode.__hash__Fc                    s  ddl m} |g}ddlm}m} t j j|r| ndd} j	|_	||_
t j j|ddd}|j|d|d	}	|rRg }
|	D ]}|
| t||jrO nq@|
}	||}|j}|j|	||d
}	dd } jru|j|	| j|jd
}	 jD ]}t|trt|dr|s|j|	||jj|jd
}	qx jr fdd}|j|	||jd
}	 jr fdd}|j|	||jd
}	|j|	|dd\}}|rJ || _|S )Nr   )AutoTestDictTransform)PipelineParseTreeTransformsF)rB   r   T)r+   allow_struct_enum_decoratorin_utility_codepyx)exclude_classes)beforec                    s    fdd}|S )Nc                    s   | j   | S r$   )r/   merge_inmodule_noder/   r   r   merge_scope_transform   s   zNCythonUtilityCode.get_tree.<locals>.merge_scope.<locals>.merge_scope_transformr   )r/   rY   r   rX   r   merge_scope   s   z/CythonUtilityCode.get_tree.<locals>.merge_scopetreec                    s    j | j_| S r$   )rA   r/   rI   rV   rK   r   r   scope_transform   s   
z3CythonUtilityCode.get_tree.<locals>.scope_transformc                    sR   t  } j D ]\}}t|d|}| jj||d dd}||ur#||_d|_q| S )Nr   extern)
visibilityT)objectrC   r:   getattrr/   declare_typer   in_cinclude)rW   dummy_entryr   typeold_type_entryr   rK   r   r   r\      s   )	printtree)AnalysedTreeTransformsrM   r7   rN   rO   r)   r   rB   is_cppr   r   r   r=   create_pipelineappendr;   AnalyseDeclarationsTransformCnameDirectivesTransformInterpretCompilerDirectivesinsert_into_pipeliner@   r?   r5   hasattrr[   r/   rA   rC   run_pipeline)r   entries_onlyr   rM   excludesrN   rO   r+   r[   pipelinept	transformrT   rZ   depr\   errr   rK   r   get_treev   sp   



zCythonUtilityCode.get_treec                 C   s   d S r$   r   )r   globalstateused_byr   r   r   put_code   s   zCythonUtilityCode.put_codec                    s0   t d|rtj||S t j||fi |S )Nz[.]c(pp)?::)researchr	   UtilityCodeload_cachedr   load)clsutil_code_name	from_filekwargsr   r   r   r      s   zCythonUtilityCode.loadc                 K   s    | j ||fi |}|j|jfS )zR
        Load a utility code as a string. Returns (proto, implementation)
        )r   protor=   )r   r   r   r   utilr   r   r   load_as_string   s   z CythonUtilityCode.load_as_stringc           
      C   s   | j d|d}|jj}|d |d |d |d | D ]}| |_||_q#|j}|j|d|d ||_| jD ]}	|	j	rI|	j
||d q=|S )	z
        Declare all entries from the utility code in dest_scope. Code will only
        be included for used entries. If module_name is given, declare the
        type entries with that name.
        T)rq   r   r%   __file____builtins____doc__)merge_unused	allowlistr   )ry   r/   entriesr   valuesutility_code_definitionr   rU   r?   is_cython_utilitydeclare_in_scope)
r   
dest_scoper   r   r   r[   r   r   original_scoperw   r   r   r   r      s"   




z"CythonUtilityCode.declare_in_scopec                 C   s:   ddl m} t|}d}|D ]}|| v r| | ||< q|S )a   
        Cython utility code should usually only pick up a few directives from the
        environment (those that intentionally control its function) and ignore most
        other compiler directives. This function provides a sensible default list
        of directives to copy.
        r   )_directive_defaults)bindingalways_allow_keywordsallow_none_for_extension_argsauto_pickleccomplexc_string_typec_string_encodingzoptimize.inline_defnode_callszoptimize.unpack_method_callsz&optimize.unpack_method_calls_in_pyinitzoptimize.use_switch)r
   r   dict)current_directivesr   utility_code_directivesinherited_directive_namesr   r   r   r   filter_inherited_directives   s   z-CythonUtilityCode.filter_inherited_directives)r6   r7   NNNNNN)FNr$   FNN)r%   r&   r'   r   r   r   rH   rF   rL   ry   r|   classmethodr   r   r   staticmethodr   r(   r   r   r   r   r5   9   s*    


V
r5   c                       s*   e Zd Z fddZd fdd	Z  ZS )TemplatedFileSourceDescriptorc                    s   t  || || _d S r$   )r   r   _context)r   filenamepath_descriptionr+   r   r   r   r     s   
z&TemplatedFileSourceDescriptor.__init__Nc                    sn   t  ||&}| }t|| j| j}tjt	|
|j|j|d}W d    |S 1 s0w   Y  |S )N)encodingerrors)r   get_file_objectreadr	   r<   r   r   ioTextIOWrapperBytesIOencoder   )r   r   error_handlingfdataretstreamr   r   r   r     s   "
z-TemplatedFileSourceDescriptor.get_file_object)NN)r%   r&   r'   r   r   r(   r   r   r   r   r     s    r   c                   @   s2   e Zd Zdd Zdd Z		dddZd	d
 ZdS )CythonSharedUtilityCodec                 C   s"   || _ || _|| _|| _d | _d S r$   )	_pxd_name_shared_utility_qualified_nametemplate_contextr?   _shared_library_scope)r   pxd_nameshared_utility_qualified_namer   r?   r   r   r   r   "  s
   
z CythonSharedUtilityCode.__init__c                 C   s   |}|j | jddD ]\}}|j||d}q
tjtjtjd d| j	}z:| j
dtjtj|d  }t||| j}d|_|||| j\}}	|	\}
}|
|f|j| j	< d|_|r^|W |S  tyj   Y |S w )	NF)r3   )
as_packager   Utility.r   T)_split_qualified_namer   find_submoduleospathjoinsplitCythonr   r   replacesepsplitextr   r   rQ   process_pxdutility_pxdspxd_file_loadedr   )r   r+   r/   r   
is_packagepxd_pathnamerel_pathsource_descrx   resultpxd_codenodes	pxd_scoper   r   r   r4   )  s0    z#CythonSharedUtilityCode.find_moduleFNc                 C   s`   | j |jjvr| |j| _| jD ]}|jr|jt|d q| jj	D ]}|
|j||j q"|S )Nr   )r   r+   r   r4   r   r?   r   r   r/   c_class_entriesr   r   r   )r   r   r   r   r   rw   er   r   r   r   A  s   
z(CythonSharedUtilityCode.declare_in_scopec                 C   s"   | j |jjvr| |j| _| jS r$   )r   r+   r   r4   r   )r   r   r   r   r   get_shared_library_scopeL  s   z0CythonSharedUtilityCode.get_shared_library_scoper   )r%   r&   r'   r   r4   r   r   r   r   r   r   r   !  s    
r   Tc                 O   s    t | g|R i || dS )z`
    Declare some declarations given as Cython code in declaration_string
    in scope env.
    N)r5   r   )declaration_stringenvprivate_typer   r   r   r   r   declare_declarations_in_scopeR  s    r   )T)r   TreeFragmentr   r   Scanningr   Errorsr   r7   r   r   r	   r
   os.pathr   r}   r   r   r   r)   UtilityCodeBaser5   r   AbstractUtilityCoder   r   r   r   r   r   <module>   s$     Z1