U
    ?h/8                     @   sf  d dl Z d dlmZmZ d dlmZmZ d dlZd dlm	Z	 d dl
mZ d dlmZmZmZmZ d dlmZ d dlmZ d d	lmZmZ d dlm  mZ e ZG d
d deZG dd dedZG dd deZ G dd deZ!G dd deZ"G dd deZ#G dd deZ$dZ%dd Z&eddZ'G dd deZ(ed d!Z)G d"d# d#eZ*e* Z+[*e+j,Z-dS )$    N)abstractmethodABCMeta)
namedtupleOrderedDict)pformat)global_compiler_lock)errorsconfig
transformsutils)event)PostProcessor)enforce_no_delslegalize_single_scopec                   @   s    e Zd ZdZdd Zdd ZdS )SimpleTimerz(
    A simple context managed timer
    c                 C   s   t  | _| S N)timeitdefault_timertsself r   O/var/www/html/venv/lib/python3.8/site-packages/numba/core/compiler_machinery.py	__enter__   s    
zSimpleTimer.__enter__c                 G   s   t  | j | _d S r   )r   r   r   elapsed)r   excr   r   r   __exit__   s    zSimpleTimer.__exit__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZedd Zedd Zedd Z	e	j
dd Z	ed	d
 Zej
dd
 Zdd Zedd Zdd Zdd Zdd ZdS )CompilerPassz- The base class for all compiler passes.
    c                 O   s   d | _ d | _d S r   )	_analysis_pass_idr   argskwargsr   r   r   __init__$   s    zCompilerPass.__init__c                 C   s   | j S )z.
        Returns the name of the pass
        )_name)clsr   r   r   name)   s    zCompilerPass.namec                 C   s   | j S )z$
        The ID of the pass
        r#   r   r   r   r   pass_id0   s    zCompilerPass.pass_idc                 C   s
   || _ dS )z)
        Sets the ID of the pass
        Nr+   r   valr   r   r   r,   7   s    c                 C   s   | j S )z,
        Analysis data for the pass
        r"   r   r   r   r   analysis>   s    zCompilerPass.analysisc                 C   s
   || _ dS )z4
        Set the analysis data for the pass
        Nr/   r-   r   r   r   r0   E   s    c                 O   s   dS zd
        Runs the initialization sequence for the pass, will run before
        `run_pass`.
        Fr   r$   r   r   r   run_initializationL   s    zCompilerPass.run_initializationc                 O   s   dS )z
        Runs the pass itself. Must return True/False depending on whether
        statement level modification took place.
        Nr   r$   r   r   r   run_passS   s    zCompilerPass.run_passc                 O   s   dS r1   r   r$   r   r   r   run_finalizer[   s    zCompilerPass.run_finalizerc                 C   s   dS )z( Override to set analysis usage
        Nr   )r   ZAUr   r   r   get_analysis_usageb   s    zCompilerPass.get_analysis_usagec                 C   s
   | j | S )z5
        Gets the analysis from a given pass
        r/   )r   	pass_namer   r   r   get_analysisg   s    zCompilerPass.get_analysisN)r   r   r   r    r   r'   classmethodr*   propertyr,   setterr0   r2   r3   r4   r5   r7   r   r   r   r   r!       s&   






r!   )	metaclassc                   @   s   e Zd ZdZdS )SSACompliantMixinzn Mixin to indicate a pass is SSA form compliant. Nothing is asserted
    about this condition at present.
    Nr   r   r   r    r   r   r   r   r<   n   s   r<   c                   @   s   e Zd ZdZdS )FunctionPassz$ Base class for function passes
    Nr=   r   r   r   r   r>   u   s   r>   c                   @   s   e Zd ZdZdS )AnalysisPasszD Base class for analysis passes (no modification made to state)
    Nr=   r   r   r   r   r?   {   s   r?   c                   @   s   e Zd ZdZdS )LoweringPassz$ Base class for lowering passes
    Nr=   r   r   r   r   r@      s   r@   c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )AnalysisUsagezLThis looks and behaves like LLVM's AnalysisUsage because its like that.
    c                 C   s   t  | _t  | _d S r   )set	_required
_preservedr   r   r   r   r'      s    zAnalysisUsage.__init__c                 C   s   | j S r   rC   r   r   r   r   get_required_set   s    zAnalysisUsage.get_required_setc                 C   s   | j S r   )rD   r   r   r   r   get_preserved_set   s    zAnalysisUsage.get_preserved_setc                 C   s   | j | d S r   )rC   addr   pssr   r   r   add_required   s    zAnalysisUsage.add_requiredc                 C   s   | j | d S r   )rD   rH   rI   r   r   r   add_preserved   s    zAnalysisUsage.add_preservedc                 C   s
   d| j  S )Nzrequired: %s
rE   r   r   r   r   __str__   s    zAnalysisUsage.__str__N)
r   r   r   r    r'   rF   rG   rK   rL   rM   r   r   r   r   rA      s   rA   Fc                  O   s   t rt| | d S r   )_DEBUGprint)r%   r&   r   r   r   debug_print   s    rP   pass_timingszinit run finalizec                   @   sv   e Zd ZdZdZdd Zdd Zddd	Zd
d Zdd Z	dd Z
edd Zdd Zedd Zdd Zdd ZdS )PassManagerzR
    The PassManager is a named instance of a particular compilation pipeline
    Fc                 C   s*   g | _ t | _d| _d| _d| _|| _dS )zA
        Create a new pipeline with name "pipeline_name"
        FN)passesr   
exec_times
_finalizedr"   _print_afterpipeline_name)r   rW   r   r   r   r'      s    zPassManager.__init__c                 C   s^   t |ts.t|rt|ts.d| }t|t |trDt|}nt	|sZt
d| d S )NzKPass must be referenced by name or be a subclass of a CompilerPass. Have %szPass %s is not registered)
isinstancestrinspectisclass
issubclassr!   	TypeError_pass_registryfind_by_nameis_registered
ValueError)r   pass_clsmsgr   r   r   _validate_pass   s    


zPassManager._validate_pass c                 C   s(   |  | ||f}| j| d| _dS )zI
        Append a pass to the PassManager's compilation pipeline
        FN)rd   rS   appendrU   )r   rJ   descriptionZfunc_desc_tupler   r   r   add_pass   s    
zPassManager.add_passc                 C   sr   | j s
t| | | | t| j D ]\}\}}||kr( qNq(td| | j |d |t|f d| _dS )zt
        Add a pass `pass_cls` to the PassManager's compilation pipeline after
        the pass `location`.
        zCould not find pass %s   FN)rS   AssertionErrorrd   	enumeratera   insertrY   rU   )r   rb   locationidxx_r   r   r   add_pass_after   s    


zPassManager.add_pass_afterc                    s,    fdd}|t j|t j|t jf}|S )Nc                    sB   g }| dkr>| dkr&dd  j D }n| d}dd |D }|S )Nnoneallc                 S   s   g | ]\}}|  qS r   )r*   ).0ro   rp   r   r   r   
<listcomp>   s     z:PassManager._debug_init.<locals>.parse.<locals>.<listcomp>,c                 S   s   g | ]}|  qS r   )strip)rt   ro   r   r   r   ru      s     )rS   split)Z	conf_itemZprint_passesZsplittedr   r   r   parse   s    
z&PassManager._debug_init.<locals>.parse)r	   ZDEBUG_PRINT_AFTERZDEBUG_PRINT_BEFOREZDEBUG_PRINT_WRAP)r   ry   retr   r   r   _debug_init   s    zPassManager._debug_initc                 C   s(   |   | _|  \| _| _| _d| _dS )zt
        Finalize the PassManager, after which no more passes may be added
        without re-finalization.
        TN)dependency_analysisr"   r{   rV   _print_before_print_wraprU   r   r   r   r   finalize   s    
zPassManager.finalizec                 C   s   | j S r   )rU   r   r   r   r   	finalized   s    zPassManager.finalizedc                 C   s   dj ||d}|f|_|S )zG
        Patches the error to show the stage that it arose in.
        z{desc}
{exc})descr   )formatr%   )r   r   r   Znewmsgr   r   r   _patch_error  s    zPassManager._patch_errorc              
      s  d}fdd} fdd}|  jj d j_ jj}t   d| d| jjt	 j
 t jt jd	}tjd
|dl t }	||j O }W 5 Q R X t }
||j O }W 5 Q R X t }||j O }W 5 Q R X W 5 Q R X ttrt j jrxtjjrZ|rHt j  nt ! jj" j_"t# jj"sxt$%d t&|	j'|
j'|j'}|j(d|  f < |  j)j d d S )NFc                    s(   | |}|dkr$d}t |   |S )N)TFz[CompilerPass implementations should return True/False. CompilerPass with name '%s' did not.)ra   r*   )funcZcompiler_stateZmangledrc   )rJ   r   r   check  s
    z#PassManager._runPass.<locals>.checkc                    sX   | |krT j }|j|jj|| f}td| dd  jd k	rL j  ntd d S )Nz%s.%s: %s: %s %sx   -zfunc_ir is None)func_idmodnamefunc_qualnamerW   rO   centerfunc_irdump)r6   Zprint_conditionZprintable_conditionZfidr%   )internal_stater   r   r   rP     s     
z)PassManager._runPass.<locals>.debug_printZBEFOREz [])r*   qualnamemoduleflagsr%   return_typeznumba:run_pass)dataz&multiple scope in func_ir detected in z%s_%sZAFTER)*r*   r}   r~   r"   r0   r   r   dictr   r   r   valuesrY   r%   r   evZtrigger_eventr   r2   r3   r4   rX   r>   r   r   
_ENFORCINGr^   get	__class__mutates_CFGr   runr
   Zcanonicalize_cfgblocksr   r   ZCompilerErrorrQ   r   rT   rV   )r   indexrJ   r   Zmutatedr   rP   r   Z
ev_detailsZ	init_timeZ	pass_timeZfinalize_timeptr   )r   rJ   r   r   _runPass  sN    $

zPassManager._runPassc           
      C   s   ddl m} | jstdt| jD ]\}\}}z>td|  t|j	}t
|trd| ||| ntdW q$ |k
r } z|W 5 d}~X Y q$ tk
r } z:t rt
|tjs|d| j|f }| ||}	|	W 5 d}~X Y q$X q$dS )z9
        Run the defined pipelines on the state.
        r   )_EarlyPipelineCompletionz!Cannot run non-finalised pipelinez-- %szLegacy pass in useNz%Failed in %s mode pipeline (step: %s))Znumba.core.compilerr   r   RuntimeErrorrk   rS   r   r^   r   	pass_instrX   r!   r   BaseException	Exceptionr   Zuse_new_style_errorsr   Z
NumbaErrorrW   r   )
r   stater   rn   rJ   Z	pass_descr   erc   Zpatched_exceptionr   r   r   r   V  s,    

zPassManager.runc                 C   s   t  }| jD ]0\}}t|j}t }|| ||t|< qt  }| D ]\}}|	 ||< qLdd }	t  }
| D ]\}}t
||	||B |
|< qx|
S )z.
        Computes dependency analysis
        c                    s.    fdd t  }| D ]}| ||O }q|S )Nc                    s@   | |kr||  nt  }|r6|D ]}| ||O }q|S t  S d S r   rB   )ZlkeyrmapZdep_setro   walkr   r   r     s    zGPassManager.dependency_analysis.<locals>.resolve_requires.<locals>.walkr   )keyr   rz   kr   r   r   resolve_requires  s
    z9PassManager.dependency_analysis.<locals>.resolve_requires)r   rS   r^   r   r   rA   r5   typeitemsrF   rB   )r   depsrJ   rp   ro   auZrequires_mapr   vr   Z	dep_chainr   r   r   r|   r  s    
zPassManager.dependency_analysisN)re   )r   r   r   r    r   r'   rd   rh   rq   r{   r   r9   r   r   r   r   r   r|   r   r   r   r   rR      s   
	


IrR   	pass_infoz#pass_inst mutates_CFG analysis_onlyc                   @   sJ   e Zd ZdZdZe Zdd Zdd Zdd Z	d	d
 Z
dd Zdd ZdS )PassRegistryz(
    Pass registry singleton class.
    r   c                    s    fdd}|S )Nc                    sN    | rt|  r tj| _ jd7  _t|   j| < | S )Nri   )r`   rj   _does_pass_name_aliasr*   _idr,   r   	_registry)Z
pass_classanalysis_onlyr   r   r   r   make_festive  s    
z+PassRegistry.register.<locals>.make_festiver   )r   r   r   r   r   r   r   register  s    zPassRegistry.registerc                 C   s   || j  kS r   )r   keysr   Zclazzr   r   r   r`     s    zPassRegistry.is_registeredc                 C   s   |  |st| j| S r   )r`   rj   r   r   r   r   r   r     s    zPassRegistry.getc                 C   s*   | j  D ]\}}|jj|kr
 dS q
dS )NTF)r   r   r   r*   )r   r   r   r   r   r   r   r     s    z"PassRegistry._does_pass_name_aliasc                 C   sF   t |tst| j D ]\}}|jj|kr|  S qtd| d S )Nz"No pass with name %s is registered)rX   rY   rj   r   r   r   r*   ra   )r   
class_namer   r   r   r   r   r_     s
    
zPassRegistry.find_by_namec                 C   s(   | j  D ]\}}td||f  q
d S )Nz%s: %s)r   r   rO   )r   r   r   r   r   r   r     s    zPassRegistry.dumpN)r   r   r   r    r   r   r   r   r`   r   r   r_   r   r   r   r   r   r     s   r   ).r   abcr   r   collectionsr   r   rZ   pprintr   Znumba.core.compiler_lockr   Z
numba.corer   r	   r
   r   Znumba.core.tracingr   Znumba.core.postprocr   Znumba.core.ir_utilsr   r   Znumba.core.eventcorer   Z	termcolorZ
_termcolorobjectr   r!   r<   r>   r?   r@   rA   rN   rP   rQ   rR   r   r   r^   r   Zregister_passr   r   r   r   <module>   s8   N
 m
.