a
    b$                     @   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   k/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/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 d S )Nz%s%s)	r   Ztypeobj_prefixZfunc_prefixZ
var_prefixZ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 )CythonUtilityCodeContextNTc                 C   s\   |rt d|| jkr4|| jvr*t dn
| j| S | jd u rVt| 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&   relative_tor   Zneed_pxdZabsolute_fallbackr   r   r   find_module#   s    




z$CythonUtilityCodeContext.find_module)NNTT)r   r   r    r(   r*   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 Z
edddZd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rTddl m} | D ]"\}}t||r |||< ||
|< q t||||}|| _|| _|| _|| _	|prg | _
|| _|	| _|| _|
| _d S )Nr   )BaseType)Z
PyrexTypesr.   items
isinstancer   Zsub_tempitaimplr   filer   requires
from_scopeouter_module_scopecompiler_directivescontext_types)r   r1   r   r   r3   r2   r4   r$   r6   r5   r7   r.   keyvaluer   r   r   r   F   s"    	


zCythonUtilityCode.__init__c                 C   s"   t |tr|  | kS dS d S )NF)r0   r+   _equality_params)r   otherr   r   r   __eq__a   s    
zCythonUtilityCode.__eq__c                 C   s&   | j }t|tr|j}q| j|| jfS N)r5   r0   r	   outer_scoper1   r6   )r   r>   r   r   r   r:   g   s    
z"CythonUtilityCode._equality_paramsc                 C   s
   t | jS r=   )hashr1   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|r8| ndd} j	|_	||_
t j j|dd}|j|d|d	}	|rg }
|	D ]}|
| t|
|jr~ qq~|
}	||}|j}|j|	||d
}	dd } jr|j|	| j|jd
}	 jD ]6}t|trt|dr|s|j|	||jj|jd
}	q jrL fdd}|j|	||jd
}	 jrr fdd}|j|	||jd
}	|j|	|dd\}}|rJ || _|S )Nr   )AutoTestDictTransform)PipelineParseTreeTransformsF)r6   r
   T)r$   Zallow_struct_enum_decoratorZpyx)Z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(   rJ   r   rI   r   merge_scope   s    z/CythonUtilityCode.get_tree.<locals>.merge_scopetreec                    s    j | j_| S r=   )r5   r(   r>   rG   r@   r   r   scope_transform   s    
z3CythonUtilityCode.get_tree.<locals>.scope_transformc                    s2    j  D ]"\}}| jj||d dd}d|_q
| S )NZextern)Z
visibilityT)r7   r/   r(   Zdeclare_typeZin_cinclude)rH   r   typer   r@   r   r   rM      s    )Z	printtree)ZAnalysedTreeTransformsrB   r-   rC   rD   r"   r   r6   Zis_cppr   r   r   r1   Zcreate_pipelineappendr0   ZAnalyseDeclarationsTransformZCnameDirectivesTransformZInterpretCompilerDirectivesZinsert_into_pipeliner4   r3   r+   hasattrrL   r(   r5   r7   Zrun_pipeline)r   entries_onlyr   rB   excludesrC   rD   r$   rL   ZpipelineptZ	transformrE   rK   deprM   errr   r@   r   get_treep   sj    



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protor1   )clsZ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 ]}| |_||_qF|j}|j|d|d ||_| jD ]}	|	j	rz|	j
||d qz|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__)Zmerge_unused	whitelist)r   )rW   r(   entriesr   valuesZutility_code_definitionr   rF   r3   is_cython_utilitydeclare_in_scope)
r   Z
dest_scoper   r   rd   rL   re   r   Zoriginal_scoperU   r   r   r   rh      s     




z"CythonUtilityCode.declare_in_scope)r,   r-   NNNNNN)FN)N)FNN)r   r   r    rc   rg   r   r<   r:   rA   rW   rY   classmethodr`   rh   r   r   r   r   r+   3   s       

N  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)r+   rh   )Zdeclaration_stringenvZprivate_typer   r^   r   r   r   declare_declarations_in_scope   s    rk   N)T)
__future__r   ZTreeFragmentr   r   r-   r   r   r   r   r	   r"   ZUtilityCodeBaser+   rk   r   r   r   r   <module>   s    5