3
[6                 @   s  d dl mZ d dl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m	Z	m
Z
 dd	lmZ d
d Zdd Zdd Zdd Zdd Zdd Zd.ddZdd Zdd Zdd Zf fddZd f fd!d"Zd#d$ Zd%d& Zd'd( Zd/d)d*Zi Zd0d,d-ZdS )1    )absolute_importN)time   )Errors)
DebugFlags)Options)CompileErrorInternalError
AbortError)Namingc             C   s   t | j  | S )N)printdump)t r   h/home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python3.6/site-packages/Cython/Compiler/Pipeline.pydumptree   s    r   c             C   s   t jdkrtd| S )Nr   zpipeline break)r   
num_errorsr
   )noder   r   r   abort_on_errors   s    
r   c                s    fdd}|S )Nc                sb   | j }| j}|ddf}tjd }t_ j||dd}|t_ j||d|d}| |_||_d|_|S )Nr   r   F)posneed_pxd)pxdfull_module_name)	source_descr   r   cimport_from_pyxfind_moduleparsecompilation_sourcescopeis_pxd)Zcompsrcr   r   initial_posZsaved_cimport_from_pyxr   tree)contextr   r   r      s    
z"parse_stage_factory.<locals>.parser   )r"   r   r   )r"   r   parse_stage_factory   s    r#   c                s    fdd}|S )Nc                s"    j | dd}|_d|_|S )NT)r   r   )r   r   r   )r   r!   )r"   module_namer   r   r   r   *   s
    
z&parse_pxd_stage_factory.<locals>.parser   )r"   r   r$   r   r   )r"   r$   r   r   parse_pxd_stage_factory)   s    r%   c                s    fdd}|S )Nc                s   | j   | j_S )N)process_implementationr   )module_node)optionsresultr   r   generate_pyx_code_stage3   s    z@generate_pyx_code_stage_factory.<locals>.generate_pyx_code_stager   )r(   r)   r*   r   )r(   r)   r   generate_pyx_code_stage_factory2   s    r+   c                s    fdd}|S )Nc                s,   x& j j D ]\}\}}| j|| qW | S )N)pxdsitemsmerge_in)r'   nameZstatlistnoder   )r"   r   r   inject_pxd_code_stage;   s    z<inject_pxd_code_stage_factory.<locals>.inject_pxd_code_stager   )r"   r0   r   )r"   r   inject_pxd_code_stage_factory:   s    r1   c             C   s   |d krt  }xp| jj D ]b}||kr(q|j| |jrh|jrh|j|j x0|jjD ]}|j| qTW q|jrt	|j|| qW d S )N)
setentriesvaluesaddusedutility_code_definitionuse_utility_coderequires	as_moduleuse_utility_code_definitions)r   targetseenentryZrequired_utilityr   r   r   r;   B   s    
r;   c                sF   i  fdd x| D ]} | qW dd t j dd dD S )Nc                sR   | krJd| < t }dt fdd| jp.f D p8dg |d  | < |  S )Nr   r   c                s   g | ]} |qS r   r   ).0dep)get_rankr   r   
<listcomp>Y   s    z8sort_utility_codes.<locals>.get_rank.<locals>.<listcomp>g:0yE>)lenminr9   )utilcodeZoriginal_order)rA   ranksr   r   rA   U   s
    2z$sort_utility_codes.<locals>.get_rankc             S   s   g | ]\}}|qS r   r   )r?   rF   _r   r   r   rB   ]   s    z&sort_utility_codes.<locals>.<listcomp>c             S   s   | d S )Nr   r   )kvr   r   r   <lambda>]   s    z$sort_utility_codes.<locals>.<lambda>)key)sortedr-   )	utilcodesrF   r   )rA   rG   r   sort_utility_codesS   s
    
rN   c                sR   i  x| D ]}| |< q
W  fddx&| D ]}fdd|j pBf D |_ q,W d S )Nc                s    |  kr |  S |  | < | S d S )Nr   )r@   )depsr   r   	unify_depe   s    z!normalize_deps.<locals>.unify_depc                s   g | ]} |qS r   r   )r?   r@   )rP   r   r   rB   m   s    z"normalize_deps.<locals>.<listcomp>)r9   )rM   rF   r   )rO   rP   r   normalize_deps`   s    

rQ   c                s    fdd}|S )Nc                s   | j   t j| j t| jj| j_t| jj g }x| jjD ]v}||krNq@|j| |jrx0|jD ]&}||krf|| jjkrf| jjj| qfW |j	 jd}|r@| j
|j|jdd q@W | S )N)cython_scopeT)merge_scope)prepare_utility_coder;   rR   r   rN   utility_code_listrQ   appendr9   get_treer.   body)r'   addedrF   r@   r!   )r"   r   r   inject_utility_code_stageq   s"    
zDinject_utility_code_stage_factory.<locals>.inject_utility_code_stager   )r"   rZ   r   )r"   r   !inject_utility_code_stage_factoryp   s    r[   c       2   (   C   s  |dkst ddlm} ddlm}m}m}m} ddlm}m	}	m
}
 ddlm}m} dd	lm}m}m} dd
lm}m}m} ddlm}m} ddlm} ddlm}m} ddlm}m} ddlm}m} ddlm} ddlm } ddl!m"} ddl#m$}m%} m&}! ddl#m'}"m(}# ddl#m)}$ ddl#m*}%m+}& ddl#m,}' ddl#m-}( ddl.m/}) ddl0m1}*m2}+ |dkrx|+},|| }-n|*},d }-|dkr|| }.nd }.|| || |-| || | j3|| || || || |.|| |% | || || |	 |
| || || |"| || || || || || |)| |,|$| || || || |!| | | |#| || || |(| |' |&| | g(}/g }0x$|/D ]}1|1j4|kr|0j5|1 qW |0S )Npyxpyr   r   )	PrintTree)WithTransformNormalizeTree	PostParsePxdPostParse)ForwardDeclareTypesInjectGilHandlingAnalyseDeclarationsTransform)AnalyseExpressionsTransformFindInvalidUseOfFusedTypes)CreateClosureClassesMarkClosureVisitorDecoratorTransform)TrackNumpyAttributesInterpretCompilerDirectivesTransformBuiltinMethods)ExpandInplaceOperatorsParallelRangeTransform) CalculateQualifiedNamesTransform)MarkParallelAssignmentsMarkOverflowingArithmetic)AdjustDefByDirectivesAlignFunctionDefinitions)RemoveUnreachableCodeGilCheck)ControlFlowAnalysis)AutoTestDictTransform)EmbedSignature)FlattenInListTransformSwitchTransformIterationTransform)EarlyReplaceBuiltinCallsOptimizeBuiltinCalls)InlineDefNodeCalls)ConstantFoldingFinalOptimizePhase)DropRefcountingTransform)ConsolidateOverflowCheck)IntroduceBufferAuxiliaryVars)check_c_declarationscheck_c_declarations_pxd)r\   r]   r   )6AssertionErrorVisitorr^   ParseTreeTransformsr_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   TypeInferencerq   rr   rs   rt   ru   rv   ZFlowControlrw   AnalysedTreeTransformsrx   ZAutoDocTransformsry   Optimizerz   r{   r|   r}   r~   r   r   r   r   r   Bufferr   
ModuleNoder   r   compiler_directives	__class__rV   )2r"   modeexclude_classesr^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   Z_check_c_declarationsZ_specific_post_parseZ_align_function_definitionsZstagesZfiltered_stagessr   r   r   create_pipeline   s    





r   Fc          
   C   s   |r
d}nd}g }|j r0ddlm} |j|  |jrlddlm} ddlm}	 |j	|j
| _|	| ||g}
ng }
ttjt| gt| ||d|t| t| tg|
t||gS )	Nr]   r\      )TreeAssertVisitor)DebugWriterr   )DebugTransform)r   )evaluate_tree_assertionsZ	TestUtilsr   rV   	gdb_debugZDebuggerr   r   r   ZCythonDebugWriter
output_dirgdb_debug_outputwriterlist	itertoolschainr#   r   r1   r[   r   r+   )r"   r(   r)   r]   r   r   Ztest_supportr   r   r   Zdebug_transformr   r   r   create_pyx_pipeline   s.    
r   c             C   s,   ddl m} t| ||gt| d | g S )Nr   )ExtractPxdCoder   )ZCodeGenerationr   r%   r   )r"   r   r$   r   r   r   r   create_pxd_pipeline  s    r   c             C   s   t | ||ddS )NT)r]   )r   )r"   r(   r)   r   r   r   create_py_pipeline  s    r   c          	      s   ddl m}m}m}m} ddlm}m} ddlm	  g }t
| | j||||||gd}	x"|	D ]}
|j|
 t|
|rZP qZW  fdd}|j| |S )Nr   )rt   ri   r_   re   )r   rz   )StatListNode)r   c                s`   xJ| j jj D ]:}|jsd|_|j|jkr|jdkr|j jt	j
|j|_qW  | jg d| j fS )Nr   extern)stats)r   r3   r4   in_cincludedefined_in_pxdr/   cname
visibilitymangler   func_prefixr   )rootr>   )r   r   r   fake_pxd$  s    z,create_pyx_as_pxd_pipeline.<locals>.fake_pxd)r   rt   ri   r_   re   r   r   rz   Nodesr   r   r(   rV   
isinstance)r"   r)   rt   ri   r_   re   r   rz   pipelineZpyx_pipelineZstager   r   )r   r   create_pyx_as_pxd_pipeline  s"    





r   c             C   s`   |s|st |p|}x t| D ]\}}t||rP qW |rB|d7 }| d| |g | |d  S )z
    Insert a new transform into the pipeline after or before an instance of
    the given class. e.g.

        pipeline = insert_into_pipeline(pipeline, transform,
                                        after=AnalyseDeclarationsTransform)
    r   N)r   	enumerater   )r   	transformbeforeafterclsir   r   r   r   insert_into_pipeline/  s    
r   Tc             C   s  ddl m} tjrt j nd }dd }d }|}yyx| D ]}|d k	r:| rXt||rXq:tjrt }	td|  t	|dt
|j}
yt|
 }W n2 tk
r   td|
 | ||
  }t|
< Y nX |||}tjr:tdt |	   q:W W n6 tk
r  } ztj|d	d
 |}W Y d d }~X nX W n\ tk
rZ } ztjdkrF |}W Y d d }~X n( tk
r } z
|}W Y d d }~X nX ||fS )Nr   )r^   c             S   s   | |S )Nr   )phasedatar   r   r   runN  s    zrun_pipeline.<locals>.runzEntering pipeline phase %r__name__z'def %s(phase, data): return phase(data)z    %.3f secondsF)	use_stackr   )r   r^   r   debug_verbose_pipelineglobalscopyr   r   r   getattrtyper   _pipeline_entry_pointsKeyErrorexecr   r   report_errorr	   r   r
   )r   source	printtreer^   Zexec_nsr   errorr   r   r   Z
phase_nameerrr   r   r   run_pipelineJ  sB    

r   )N)NN)T)
__future__r   r   r    r   r   r   r   r	   r
   r   r   r   r#   r%   r+   r1   r;   rN   rQ   r[   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s2   	
Z
