o
    f*                     @   s   d dl mZ ddlmZmZ ddlmZ ddlmZ ddlm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 )    )absolute_import   )parse_from_stringsStringParseContext)Symtab)Naming)Codec                       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   W/var/www/html/mig_web/myenv/lib/python3.10/site-packages/Cython/Compiler/UtilityCode.pyr      s   zNonManglingModuleScope.__init__c                    s   d|_ tt| |||S )NT)usedsuperr	   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-   r2   r   r   r   r   r'       s    r'   c                   @   sv   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 Z
edddZ		dddZedd Zd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)
PyrexTypesr6   items
isinstancer   sub_tempitaimplr   filer   requires
from_scopeouter_module_scopecompiler_directivescontext_types)r   r;   r   r   r=   r<   r>   r)   r@   r?   rA   r6   keyvaluer   r   r   r   F   s$   	


zCythonUtilityCode.__init__c                 C   s   t |tr|  | kS dS )NF)r9   r3   _equality_params)r   otherr   r   r   __eq__a   s   
zCythonUtilityCode.__eq__c                 C   s.   | j }t|tr|j}t|ts| j|| jfS r"   )r?   r9   r	   outer_scoper;   r@   )r   rG   r   r   r   rD   g   s
   

z"CythonUtilityCode._equality_paramsc                 C   s
   t | jS r"   )hashr;   r   r   r   r   __hash__m   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)r@   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-   rW   r   rV   r   merge_scope   s   z/CythonUtilityCode.get_tree.<locals>.merge_scopetreec                    s    j | j_| S r"   )r?   r-   rG   rT   rI   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)objectrA   r8   getattrr-   declare_typer   in_cinclude)rU   dummy_entryr   typeold_type_entryr   rI   r   r   rZ      s   )	printtree)AnalysedTreeTransformsrK   r5   rL   rM   r'   r   r@   is_cppr   r   r   r;   create_pipelineappendr9   AnalyseDeclarationsTransformCnameDirectivesTransformInterpretCompilerDirectivesinsert_into_pipeliner>   r=   r3   hasattrrY   r-   r?   rA   run_pipeline)r   entries_onlyr   rK   excludesrL   rM   r)   rY   pipelinept	transformrR   rX   deprZ   errr   rI   r   get_treep   sp   



zCythonUtilityCode.get_treec                 C   s   d S r"   r   )r   outputr   r   r   put_code   s   zCythonUtilityCode.put_codec                 K   s    | j ||fi |}|j|jfS )zR
        Load a utility code as a string. Returns (proto, implementation)
        )loadprotor;   )clsutil_code_name	from_filekwargs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)ro   r   r#   __file____builtins____doc__)merge_unused	allowlist)r   )rw   r-   entriesr   valuesutility_code_definitionr   rS   r=   is_cython_utilitydeclare_in_scope)
r   
dest_scoper   r   r   rY   r   r   original_scoperu   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)Optionsr   dict)current_directivesr   utility_code_directivesinherited_directive_namesr   r   r   r   filter_inherited_directives   s   z-CythonUtilityCode.filter_inherited_directives)r4   r5   NNNNNN)FNr"   )FNN)r#   r$   r%   r   r   r   rF   rD   rJ   rw   ry   classmethodr   r   staticmethodr   r   r   r   r   r3   3   s&    

V
r3   Tc                 O   s    t | g|R i || dS )z`
    Declare some declarations given as Cython code in declaration_string
    in scope env.
    N)r3   r   )declaration_stringenvprivate_typer   r   r   r   r   declare_declarations_in_scope  s    r   N)T)
__future__r   TreeFragmentr   r   r5   r   r   r   r   r	   r'   UtilityCodeBaser3   r   r   r   r   r   <module>   s     R