U
    e=                     @   sD  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d4ddZdd Zdd Zdd Zd5dd Zd6d"d#Zd$d% Zd&d' Zd(d) Zd7d*d+Zi Zzd d,lmZ W n& e k
r&   G d-d. d.e!ZY nX e Z"d/d0 Z#d8d2d3Z$dS )9    )absolute_importN)time   )Errors)
DebugFlags)Options)CompileErrorInternalError
AbortError)Namingc                 C   s   t |   | S N)printdump)t r   </tmp/pip-unpacked-wheel-7k3cqui1/Cython/Compiler/Pipeline.pydumptree   s    r   c                 C   s   t  dkrtd| S )Nr   zpipeline break)r   get_errors_countr
   )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)posZneed_pxdpxdfull_module_name)	source_descr   r   Zcimport_from_pyxfind_moduleparsecompilation_sourcescopeis_pxd)Zcompsrcr   r   Z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 )NTr   )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   parse_pxd_stage_factory)   s    r&   c                    s    fdd}|S )Nc                    s   |    | j_S r   )Z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   generate_pyx_code_stage_factory2   s    r,   c                    s    fdd}|S )Nc                    s,    j  D ]\}\}}| j||dd q
| S )Nr   )stage)Z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"   r1   r   r!   r   inject_pxd_code_stage_factory:   s    r2   c                 C   s|   |d krt  }| j D ]^}||kr&q|| |jrb|jrb||j |jjD ]}|| qPq|jrt	|j|| qd S r   )
setentriesvaluesaddusedZutility_code_definitionZuse_utility_coderequiresZ	as_moduleuse_utility_code_definitions)r   targetseenentryZrequired_utilityr   r   r   r9   B   s    
r9   c                    s8   i j  fdd | D ]} | qtdS )Nc                    sZ   | }|d krVd| < t }d| jr@t fdd| jD nd |d   }| < |S )Nr   r   c                    s   g | ]} |qS r   r   .0dep)calculate_rankr   r   
<listcomp>]   s     zIsorted_utility_codes_and_deps.<locals>.calculate_rank.<locals>.<listcomp>g:0yE>)lenr8   min)utilcodeZrankZoriginal_orderr@   Zget_rankZranksr   r   r@   W   s     z5sorted_utility_codes_and_deps.<locals>.calculate_rank)key)getsortedZ	utilcodesrE   r   rF   r   sorted_utility_codes_and_depsS   s    

rK   c                    s6   dd | D  | D ]} fdd|j p(dD |_ qd S )Nc                 S   s   i | ]
}||qS r   r   )r>   rE   r   r   r   
<dictcomp>i   s      z"normalize_deps.<locals>.<dictcomp>c                    s   g | ]}  ||qS r   )
setdefaultr=   depsr   r   rA   k   s     z"normalize_deps.<locals>.<listcomp>r   )r8   rJ   r   rN   r   normalize_depsh   s    rP   c                    s    fdd}|S )Nc                    s   |    t j| j | jj}t||d d < t| t }|D ]f}||krNq@|| |j	r||j	D ]}||krd|
| qd|j jd}|r@| j| |jddd q@| S )N)cython_scopeZutilityT)r-   Zmerge_scope)Zprepare_utility_coder9   rQ   r   utility_code_listrK   rP   r3   r6   r8   appendZget_treer/   Zwith_compiler_directives)r'   rR   addedrE   r?   r    r!   r   r   inject_utility_code_stageo   s,    


 zDinject_utility_code_stage_factory.<locals>.inject_utility_code_stager   )r"   rU   r   r!   r   !inject_utility_code_stage_factoryn   s    rV   r   c           2   *      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}m} ddlm}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l0m1}+ ddl2m3},m4}- |dkr|-}.|| }/n|,}.d }/|dkr|| }0nd }0|| || |/| || | j5|| | || |0|| || || |' |! || || |	 |
| || | | |$| || || || || || |+| |.|&| || || || |#| |"| |%| || || |*| |) |(| || | g*}1 r fdd|1D }1|1S )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AutoCpdefFunctionDefinitions)RemoveUnreachableCodeGilCheckCoerceCppTemps)ControlFlowAnalysis)AutoTestDictTransform)EmbedSignature)FlattenInListTransformSwitchTransformIterationTransform)EarlyReplaceBuiltinCallsOptimizeBuiltinCalls)InlineDefNodeCalls)ConstantFoldingFinalOptimizePhase)DropRefcountingTransform)ConsolidateOverflowCheck)IntroduceBufferAuxiliaryVars)check_c_declarationscheck_c_declarations_pxdr   rX   c                    s   g | ]}|j  kr|qS r   )	__class__)r>   sexclude_classesr   r   rA      s     
 z#create_pipeline.<locals>.<listcomp>)6AssertionErrorVisitorrZ   ParseTreeTransformsr[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   ZTypeInferencerm   rn   ro   rp   rq   rr   rs   rt   ZFlowControlru   ZAnalysedTreeTransformsrv   ZAutoDocTransformsrw   Optimizerx   ry   rz   r{   r|   r}   r~   r   r   r   ZBufferr   Z
ModuleNoder   r   Zcompiler_directives)2r"   moder   rZ   r[   r\   r]   r^   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   Z_check_c_declarationsZ_specific_post_parseZ_align_function_definitionsZstagesr   r   r   create_pipeline   s    




-r   Fc                 C   s   |rdnd}g }g }|j rDddlm} | }	||	 ||	  |jrddlm}
 ddlm	} |

|j| _|| ||g}ng }ttt| gt| ||d|t| t| tg|t||g|S )	NrX   rW      )TreeAssertVisitor)DebugWriterr   )DebugTransformr   )Zevaluate_tree_assertionsZ	TestUtilsr   rS   Zcreate_c_file_validatorZ	gdb_debugZDebuggerr   r   r   ZCythonDebugWriter
output_dirZgdb_debug_outputwriterlist	itertoolschainr#   r   r2   rV   r   r,   )r"   r)   r*   rX   r   r   Ztest_supportZctest_supportr   Ztest_validatorr   r   Zdebug_transformr   r   r   create_pyx_pipeline   s8    

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)rX   )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}	ddlm G fddd}
|	D ]*}|| t||rx|d	|
   qqx fd
d}|| |S )Nr   )rp   re   r[   ra   )r~   rx   StatListNoder   VisitorTransformc                       s   e Zd Zdd Z jZdS )z5create_pyx_as_pxd_pipeline.<locals>.SetInPxdTransformc                 S   s   t |drd|_| | |S )Nin_pxdT)hasattrr   Zvisitchildren)selfr   r   r   r   visit_StatNode,  s    

zDcreate_pyx_as_pxd_pipeline.<locals>.SetInPxdTransform.visit_StatNodeN)__name__
__module____qualname__r   Zrecurse_to_childrenZ
visit_Noder   r   r   r   SetInPxdTransform'  s   r   rB   c                    s\   | j j D ]:}|jsd|_|j|jkr|jdkr|j t	j
|j|_q | jg d| j fS )Nr   extern)stats)r   r4   r5   Zin_cincludeZdefined_in_pxdr0   cnameZ
visibilityZmangler   Zfunc_prefixr   )rootr<   r   r   r   fake_pxd9  s    z,create_pyx_as_pxd_pipeline.<locals>.fake_pxd)r   rp   re   r[   ra   r   r~   rx   ZNodesr   r   r)   r   r   rS   
isinstanceinsert)r"   r*   rp   re   r[   ra   r~   rx   pipelineZpyx_pipeliner   r-   r   r   )r   r   r   create_pyx_as_pxd_pipeline  s,    



r   c                 C   s^   |s|st |p|}t| D ]\}}t||r q4q|r@|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   Z	transformbeforeafterclsir   r   r   r   insert_into_pipelineD  s    
r   )localc                   @   s   e Zd ZdS )_threadlocalN)r   r   r   r   r   r   r   r   a  s    r   c                   C   s&   zt jW S  tk
r    i  Y S X d S r   )threadlocalcython_pipeline_timingsAttributeErrorr   r   r   r   get_timingsf  s    r   Tc              
   C   s  ddl m} tjrt  nd }z
tj}W n tk
rH   i  }t_Y nX dd }d }|}zBz| D ]}	|	d krtqf|st	|	|rqft
|	dt|	j}
tjrtd|	  zt|
 }W n2 tk
r   td|
 | ||
  }t|
< Y nX t }||	|}t | }z||
 \}}W n tk
r0   d\}}Y nX |t|d	  |d f||
< tjrftd
|  qfW n6 tk
r } ztj|dd |}W 5 d }~X Y nX W n^ tk
r } zt dkr |}W 5 d }~X Y n( tk
r } z|}W 5 d }~X Y nX ||fS )Nr   rY   c                 S   s   | |S r   r   )phasedatar   r   r   runv  s    zrun_pipeline.<locals>.runr   zEntering pipeline phase %rz'def %s(phase, data): return phase(data))r   r   i@B z    %.3f secondsF)Z	use_stackr   )r   rZ   r   Zdebug_verbose_pipelineglobalscopyr   r   r   r   getattrtyper   r   _pipeline_entry_pointsKeyErrorexecr   intr   r   Zreport_errorr	   r   r
   )r   sourceZ	printtreerZ   Zexec_nsZtimingsr   errorr   r   Z
phase_namer   Zold_tcounterrr   r   r   run_pipelinem  sX    


r   )N)r   )Fr   )NN)T)%
__future__r   r   r    r   r   r   r   r	   r
   r   r   r   r#   r&   r,   r2   r9   rK   rP   rV   r   r   r   r   r   r   r   	threadingr   r   ImportErrorobjectr   r   r   r   r   r   r   <module>   s>   	
"
Z
 ,
