3
PO[$                 @   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   s2   || _ d | _|jdd| _tjj| f|| d S )NcppF)prefixcython_scopepopr
   r   ModuleScope__init__)selfr   argskw r   k/home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python3.6/site-packages/Cython/Compiler/UtilityCode.pyr      s    zNonManglingModuleScope.__init__c                s   d|_ tt| j|||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kr"| j}d||f S tjj| |S d 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 )CythonUtilityCodeContextNTc             C   s\   |rt d|| jkr4|| jkr*t dn
| j| S | jd k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   need_pxd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 k	rXddl m} x.|j D ]"\}}t||r"|||< ||
|< q"W tj||||}|| _|| _|| _|| _	|pvg | _
|| _|	| _|| _|
| _d S )Nr   )BaseType)
PyrexTypesr3   items
isinstancer   sub_tempitaimplr   filer   requires
from_scopeouter_module_scopecompiler_directivescontext_types)r   r8   r   r   r:   r9   r;   r'   r=   r<   r>   r3   keyvaluer   r   r   r   F   s"    	

zCythonUtilityCode.__init__c             C   s"   t |tr| j |j kS dS d S )NF)r6   r0   _equality_params)r   otherr   r   r   __eq__a   s    
zCythonUtilityCode.__eq__c             C   s*   | j }xt|tr|j}qW | j|| jfS )N)r<   r6   r	   outer_scoper8   r=   )r   rD   r   r   r   rA   g   s    
z"CythonUtilityCode._equality_paramsc             C   s
   t | jS )N)hashr8   )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|j ndd} j	|_	||_
t j j|dd}|j|d|d	}	|rg }
x$|	D ]}|
j| t|
|jrP qW |
}	|j|}|j}|j|	||d
}	dd } jr|j|	| j|jd
}	xB jD ]8}t|trt|dr| r|j|	||jj|jd
}	qW  jrT fdd}|j|	||jd
}	 jrz fdd}|j|	||jd
}	|j|	|dd\}}| st|| _|S )Nr   )AutoTestDictTransform)PipelineParseTreeTransformsF)r=   r
   T)r'   allow_struct_enum_decoratorpyx)exclude_classes)beforec                s    fdd}|S )Nc                s   | j j  | S )N)r+   merge_in)module_node)r+   r   r   merge_scope_transform   s    zNCythonUtilityCode.get_tree.<locals>.merge_scope.<locals>.merge_scope_transformr   )r+   rP   r   )r+   r   merge_scope   s    z/CythonUtilityCode.get_tree.<locals>.merge_scopetreec                s    j | j_| S )N)r<   r+   rD   )rO   )r   r   r   scope_transform   s    
z3CythonUtilityCode.get_tree.<locals>.scope_transformc                s6   x0 j j D ]"\}}| jj||d dd}d|_qW | S )Nextern)
visibilityT)r>   r5   r+   declare_typein_cinclude)rO   r   typer   )r   r   r   rS      s    
)	printtree)AnalysedTreeTransformsrG   r2   rH   rI   r%   r   r=   is_cppr   r   r   r8   create_pipelineappendr6   AnalyseDeclarationsTransformCnameDirectivesTransformInterpretCompilerDirectivesinsert_into_pipeliner;   r:   r0   hasattrrR   r+   r<   r>   run_pipeliner(   )r   entries_onlyr   rG   excludesrH   rI   r'   rR   pipelinept	transformrM   rQ   deprS   errr   )r   r   get_treep   s\    






zCythonUtilityCode.get_treec             C   s   d S )Nr   )r   outputr   r   r   put_code   s    zCythonUtilityCode.put_codec             K   s   | j ||f|}|j|jfS )zR
        Load a utility code as a string. Returns (proto, implementation)
        )loadprotor8   )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}|jd |jd |jd |jd x|j D ]}| |_||_qHW |j}|j|d|d ||_x"| jD ]}	|	j	r|	j
||d qW |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)rd   r   r!   __file____builtins____doc__)merge_unused	whitelist)r   )rl   r+   entriesr   valuesutility_code_definitionr   rN   r:   is_cython_utilitydeclare_in_scope)
r   
dest_scoper   r   r{   rR   r|   r   original_scoperj   r   r   r   r      s     




z"CythonUtilityCode.declare_in_scope)r1   r2   NNNNNN)FN)N)FNN)r!   r"   r#   ry   r   r   rC   rA   rF   rl   rn   classmethodrv   r   r   r   r   r   r0   3   s     

N r0   Tc             O   s   t | f||j| dS )z`
    Declare some declarations given as Cython code in declaration_string
    in scope env.
    N)r0   r   )declaration_stringenvprivate_typer   rt   r   r   r   declare_declarations_in_scope   s    r   N)T)
__future__r   TreeFragmentr   r   r2   r   r   r   r   r	   r%   UtilityCodeBaser0   r   r   r   r   r   <module>   s    5