
    Ǆg/8                        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c mZ  ej6                         Z G d
 de      Z G d de      Z G d de      Z  G d de      Z! G d de      Z" G d de      Z# G d de      Z$dZ%d Z& edd      Z' G d de      Z( edd       Z) G d! d"e      Z* e*       Z+[*	 e+jX                  Z-y)#    N)abstractmethodABCMeta)
namedtupleOrderedDict)pformat)global_compiler_lock)errorsconfig
transformsutils)event)PostProcessor)enforce_no_delslegalize_single_scopec                       e Zd ZdZd Zd Zy)SimpleTimerz(
    A simple context managed timer
    c                 8    t        j                         | _        | S N)timeitdefault_timertsselfs    e/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/numba/core/compiler_machinery.py	__enter__zSimpleTimer.__enter__   s    &&(    c                 P    t        j                         | j                  z
  | _        y r   )r   r   r   elapsed)r   excs     r   __exit__zSimpleTimer.__exit__   s    ++-7r   N)__name__
__module____qualname____doc__r   r     r   r   r   r      s    8r   r   c                       e Zd ZdZed        Zed        Zed        Z	e	j                  d        Z	ed        Zej                  d        Zd Zed	        Zd
 Zd Zd Zy)CompilerPassz- The base class for all compiler passes.
    c                      d | _         d | _        y r   )	_analysis_pass_idr   argskwargss      r   __init__zCompilerPass.__init__$   s    r   c                     | j                   S )z.
        Returns the name of the pass
        )_name)clss    r   namezCompilerPass.name)   s    
 yyr   c                     | j                   S )z$
        The ID of the pass
        r*   r   s    r   pass_idzCompilerPass.pass_id0   s    
 }}r   c                     || _         y)z)
        Sets the ID of the pass
        Nr4   r   vals     r   r5   zCompilerPass.pass_id7   s    
 r   c                     | j                   S )z,
        Analysis data for the pass
        r)   r   s    r   analysiszCompilerPass.analysis>   s    
 ~~r   c                     || _         y)z4
        Set the analysis data for the pass
        Nr:   r7   s     r   r;   zCompilerPass.analysisE   s    
 r   c                      yzd
        Runs the initialization sequence for the pass, will run before
        `run_pass`.
        Fr%   r+   s      r   run_initializationzCompilerPass.run_initializationL       
 r   c                      y)z
        Runs the pass itself. Must return True/False depending on whether
        statement level modification took place.
        Nr%   r+   s      r   run_passzCompilerPass.run_passS   s     	r   c                      yr>   r%   r+   s      r   run_finalizerzCompilerPass.run_finalizer[   r@   r   c                      y)z( Override to set analysis usage
        Nr%   )r   AUs     r   get_analysis_usagezCompilerPass.get_analysis_usageb   s     	r   c                      | j                   |   S )z5
        Gets the analysis from a given pass
        r:   )r   	pass_names     r   get_analysiszCompilerPass.get_analysisg   s     ~~i((r   N)r!   r"   r#   r$   r   r.   classmethodr2   propertyr5   setterr;   r?   rB   rD   rG   rJ   r%   r   r   r'   r'       s           ^^    __   
)r   r'   )	metaclassc                       e Zd ZdZy)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   rP   rP   n   s     	r   rP   c                       e Zd ZdZy)FunctionPassz$ Base class for function passes
    NrQ   r%   r   r   rS   rS   u   
    r   rS   c                       e Zd ZdZy)AnalysisPasszD Base class for analysis passes (no modification made to state)
    NrQ   r%   r   r   rV   rV   {   rT   r   rV   c                       e Zd ZdZy)LoweringPassz$ Base class for lowering passes
    NrQ   r%   r   r   rX   rX      rT   r   rX   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	AnalysisUsagezLThis looks and behaves like LLVM's AnalysisUsage because its like that.
    c                 @    t               | _        t               | _        y r   )set	_required
_preservedr   s    r   r.   zAnalysisUsage.__init__   s    %r   c                     | j                   S r   r]   r   s    r   get_required_setzAnalysisUsage.get_required_set   s    ~~r   c                     | j                   S r   )r^   r   s    r   get_preserved_setzAnalysisUsage.get_preserved_set   s    r   c                 :    | j                   j                  |       y r   )r]   addr   psss     r   add_requiredzAnalysisUsage.add_required   s    3r   c                 :    | j                   j                  |       y r   )r^   re   rf   s     r   add_preservedzAnalysisUsage.add_preserved   s    C r   c                      d| j                   z  S )Nzrequired: %s
r`   r   s    r   __str__zAnalysisUsage.__str__   s    $..00r   N)
r!   r"   r#   r$   r.   ra   rc   rh   rj   rl   r%   r   r   rZ   rZ      s%      !1r   rZ   Fc                  (    t         rt        | i | y y r   )_DEBUGprint)r,   r-   s     r   debug_printrp      s    tv r   pass_timingszinit run finalizec                   l    e Zd ZdZdZd Zd ZddZd Zd Z	d Z
ed	        Zd
 Zed        Zd Zd Zy)PassManagerzR
    The PassManager is a named instance of a particular compilation pipeline
    Fc                 h    g | _         t               | _        d| _        d| _        d| _        || _        y)zA
        Create a new pipeline with name "pipeline_name"
        FN)passesr   
exec_times
_finalizedr)   _print_afterpipeline_name)r   ry   s     r   r.   zPassManager.__init__   s2     %- *r   c                     t        |t              s5t        j                  |      rt	        |t
              sd|z  }t        |      t        |t              rt        j                  |      }y t        j                  |      st        d|z        y )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msgs      r   _validate_passzPassManager._validate_pass   sy    Hc*//(+X|4+-56CC. h$%228<H!//9 !<x!GHH :r   c                 r    | j                  |       ||f}| j                  j                  |       d| _        y)zI
        Append a pass to the PassManager's compilation pipeline
        FN)r   ru   appendrw   )r   rg   descriptionfunc_desc_tuples       r   add_passzPassManager.add_pass   s5     	C ,?+r   c                 0   | j                   sJ | j                  |       | j                  |       t        | j                         D ]  \  }\  }}||k(  s n t        d|z        | j                   j	                  |dz   |t        |      f       d| _        y)zt
        Add a pass `pass_cls` to the PassManager's compilation pipeline after
        the pass `location`.
        zCould not find pass %s   FN)ru   r   	enumerater   insertr|   rw   )r   r   locationidxx_s         r   add_pass_afterzPassManager.add_pass_after   s    
 {{{H%H%$T[[1 	BKC!QH}	B 5@AA37Xs8}$=>r   c                       fd} |t         j                         |t         j                         |t         j                        f}|S )Nc                     g }| dk7  ra| dk(  r.j                   D cg c]  \  }}|j                          }}}|S | j                  d      }|D cg c]  }|j                          }}|S c c}}w c c}w )Nnoneall,)ru   r2   splitstrip)	conf_itemprint_passesr   r   splittedr   s        r   parsez&PassManager._debug_init.<locals>.parse   s|    LF"%;?;;#G!QAFFH#GL#G    )s3H7?#@!AGGI#@L#@ $H $As   A,A2)r
   DEBUG_PRINT_AFTERDEBUG_PRINT_BEFOREDEBUG_PRINT_WRAP)r   r   rets   `  r   _debug_initzPassManager._debug_init   sB    	  V--.V../V,,-0 
r   c                     | j                         | _        | j                         \  | _        | _        | _        d| _        y)zt
        Finalize the PassManager, after which no more passes may be added
        without re-finalization.
        TN)dependency_analysisr)   r   rx   _print_before_print_wraprw   r   s    r   finalizezPassManager.finalize   s<    
 113 	@4-t/?r   c                     | j                   S r   )rw   r   s    r   	finalizedzPassManager.finalized   s    r   c                 <    dj                  ||      }|f|_        |S )zG
        Patches the error to show the stage that it arose in.
        z{desc}
{exc})descr   )formatr,   )r   r   r   newmsgs       r   _patch_errorzPassManager._patch_error  s'     !''Ts';9
r   c           
      D    d}fd} fd} |j                          j                   j                  z   d        j                  _        j
                  j                  }t        j                          d| d|j
                  j                  t        j                  j                               t        j                        t        j                              }t        j                   d|	      5  t#               5 }	| |j$                        z  }d d d        t#               5 }
| |j&                        z  }d d d        t#               5 }| |j(                        z  }d d d        d d d        t+        t,              rt/        j0                          j2                  rt4        j7                  j8                        j:                  r^|r$t=        j0                        j?                          n8tA        jB                  j0                  jD                        j0                  _"        tG        j0                  jD                        stI        jJ                  d
       tM        	jN                  
jN                  jN                        }| jP                  |dj                         <    |j                          jR                   j                  z   d       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)NFc                 \     | |      }|dvrd}t        |j                         z        |S )N)TFz[CompilerPass implementations should return True/False. CompilerPass with name '%s' did not.)r   r2   )funccompiler_statemangledr   rg   s       r   checkz#PassManager._runPass.<locals>.check  s7    >*Gm+> sxxz!122Nr   c                    | |v rj                   }|j                  |j                  j                  || f}t	        d|z  j                  dd             j                  j                  j                          y t	        d       y y )Nz%s.%s: %s: %s %sx   -zfunc_ir is None)func_idmodnamefunc_qualnamery   ro   centerfunc_irdump)rI   print_conditionprintable_conditionfidr,   internal_stater   s        r   rp   z)PassManager._runPass.<locals>.debug_print  s    O+$,,S%6%68J8J+Y8)D088cBC!))5"**//1+, ,r   BEFOREz [])r2   qualnamemoduleflagsr,   return_typeznumba:run_pass)dataz&multiple scope in func_ir detected in r   AFTER)*r2   r   r   r)   r;   r   r   dictr   r   r   valuesr|   r,   r   evtrigger_eventr   r?   rB   rD   r{   rS   r   r   
_ENFORCINGr   get	__class__mutates_CFGr   runr   canonicalize_cfgblocksr   r	   CompilerErrorrq   r   rv   rx   )r   indexrg   r   mutatedr   rp   r   
ev_details	init_time	pass_timefinalize_timepts   ` ``         r   _runPasszPassManager._runPass  s   			- 	CHHJ 2 2T5E5E ExP ~~!))77HHJ<r(1-!))11...5578^(()N667

 .Z@ 	D I)5!7!7HHI ?)5~>>? D-5!2!2NCCD	D c<(N223?? !!#--0<<!."8"89==?4>4O4O&..5557N**1 ))?)?)F)FG**<SEB  )++Y->->'//19;5#((*56 	CHHJ 1 1D4D4D DgNAI I? ?D D	D 	DsT   >L	K. L2K;	LL2L.K8	3L;L	 LL	LLc                    ddl m} | j                  st        d      t	        | j
                        D ]e  \  }\  }}	 t        d|z         t        j                  |      j                  }t        |t              r| j                  |||       nt        d      g y# |$ r}|d}~wt        $ r\}t        j                          rt        |t"        j$                        s|d| j&                  d|d	}| j)                  ||      }	|	d}~ww xY w)
z9
        Run the defined pipelines on the state.
        r   )_EarlyPipelineCompletionz!Cannot run non-finalised pipelinez-- %szLegacy pass in useNz
Failed in z mode pipeline (step: ))numba.core.compilerr   r   RuntimeErrorr   ru   r   r   r   	pass_instr{   r'   r   BaseException	Exceptionr   use_new_style_errorsr	   
NumbaErrorry   r   )
r   stater   r   rg   	pass_descr   er   patched_exceptions
             r   r   zPassManager.runV  s     	A~~BCC &/t{{%; 	(!C!#y(g	)**..s3==	i6MM#y%8'(<== 9	( ,  (..0"1f&7&78G''4$($5$5c1$=!''(s%   ABD!B##D/ADDc                    t               }| j                  D ]M  \  }}t        j                  |      j                  }t               }|j                  |       ||t        |      <   O t               }|j                         D ]  \  }}|j                         ||<    d }	t               }
|j                         D ]  \  }}t        |       |	||      z  |
|<    |
S )z.
        Computes dependency analysis
        c                 L    fdt               }| D ]  }| ||      z  } |S )Nc                 l    | |v r||    n	t               }|r|D ]  }| ||      z  } |S t               S r   r\   )lkeyrmapdep_setr   walks       r   r   zGPassManager.dependency_analysis.<locals>.resolve_requires.<locals>.walk  sD    (,$t*#%$ 3DDM23"N5Lr   r   )keyr   r   kr   s       @r   resolve_requiresz9PassManager.dependency_analysis.<locals>.resolve_requires  s5    ! %C %tAt}$%Jr   )r   ru   r   r   r   rZ   rG   typeitemsra   r\   )r   depsrg   r   r   aurequires_mapr   vr   	dep_chains              r   r   zPassManager.dependency_analysisr  s     v 	HS!""3'11AB  $DaM		 vJJL 	3DAq002LO	3	 F	 &&( 	HDAqq6%5a%FGIaL	H r   N) )r!   r"   r#   r$   r   r.   r   r   r   r   r   rL   r   r   r   r   r   r   r%   r   r   rs   rs      si     J	+I  "&   GO GOR(8!r   rs   	pass_infoz#pass_inst mutates_CFG analysis_onlyc                   F    e Zd ZdZdZ e       Zd Zd Zd Z	d Z
d Zd Zy	)
PassRegistryz(
    Pass registry singleton class.
    r   c                       fd}|S )Nc                     j                  |       rJ j                  | j                               rJ j                  | _        xj                  dz  c_        t         |              j                  | <   | S )Nr   )r   _does_pass_name_aliasr2   _idr5   r  	_registry)
pass_classanalysis_onlyr   r   s    r   make_festivez+PassRegistry.register.<locals>.make_festive  sn    ))*55511*//2CDDD!%JHHMH)2:<3@*BDNN:&r   r%   )r   r   r  r  s   ``` r   registerzPassRegistry.register  s    	 r   c                 :    || j                   j                         v S r   )r	  keysr   clazzs     r   r   zPassRegistry.is_registered  s    ++---r   c                 F    | j                  |      sJ | j                  |   S r   )r   r	  r  s     r   r   zPassRegistry.get  s%    !!%(((~~e$$r   c                 ~    | j                   j                         D ]   \  }}|j                  j                  |k(  s  y y)NTF)r	  r   r   r2   )r   r   r   r   s       r   r  z"PassRegistry._does_pass_name_alias  s<    NN((* 	DAq{{5(	 r   c                     t        |t              sJ | j                  j                         D ]"  \  }}|j                  j
                  |k(  s |c S  t        d|z        )Nz"No pass with name %s is registered)r{   r|   r	  r   r   r2   r   )r   
class_namer   r   s       r   r   zPassRegistry.find_by_name  s^    *c***NN((* 	PDAq{{:-	P AJNOOr   c                 h    | j                   j                         D ]  \  }}t        |d|        y )Nz: )r	  r   ro   )r   r   r   s      r   r   zPassRegistry.dump  s/    NN((* 	%DAqa#$	%r   N)r!   r"   r#   r$   r  r   r	  r  r   r   r  r   r   r%   r   r   r  r    s4     CI	.%P%r   r  ).r   abcr   r   collectionsr   r   r}   pprintr   numba.core.compiler_lockr   
numba.corer	   r
   r   r   numba.core.tracingr   numba.core.postprocr   numba.core.ir_utilsr   r   numba.core.eventcorer   	termcolor
_termcolorobjectr   r'   rP   rS   rV   rX   rZ   rn   rp   rq   rs   r  r  r   r  register_passr%   r   r   <module>r%     s     ' /   : 8 8 $ - F   V

8& 
8K)W K)\	 		< 		< 		< 	1F 10 

 .*=>i& iX {$IJ	+%6 +%\  ''r   