o
    1&iX                     @   s  d dl mZ d dlZd dlmZmZmZmZ d dl	m
Z
mZmZmZ d dlmZmZm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mZm Z m!Z!m"Z"m#Z#m$Z$m%Z% d dl&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0 dZ1G dd deeZ2edddG dd deZ3G dd deeZ4G dd deeZ5G dd deeZ6G dd deZ7dd Z8G dd  d eZ9G d!d" d"eZ:e;d#kre<  dS dS )$    )
namedtupleN)TestCaseMemoryLeakMixinskip_parfors_unsupportedcaptured_stdout)njittypedliteral_unrollprange)typeserrorsir)unittest)overload)PassManagerregister_passFunctionPassAnalysisPassCompilerBase)	FixupArgsTranslateByteCodeIRProcessingInlineClosureLikesSimplifyCFGIterLoopCanonicalizationLiteralUnroll
PreserveIR)NopythonTypeInferenceIRLegalizationNoPythonBackendPartialTypeInferenceNativeLowering)compute_cfg_from_blocksflatten_labels)_header_lead
      c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestLiteralTupleInterpretationc                 C   sP   |j |jd  }|jj| }| t|tj |D ]}| t|tjd qd S )Nr   non literal)		overloads
signaturesfndesctypemap
assertTrue
isinstancer   TupleLiteral)selffuncvarcrestyZsubty r8   PC:\wamp64\www\opt\env\Lib\site-packages\numba/tests/test_mixed_tuple_unroller.pycheck   s   z$TestLiteralTupleInterpretation.checkc                 C   .   t dd }| | |  | |d d S )Nc                  S      d} | d S )N         r>   r8   xr8   r8   r9   foo$      zDTestLiteralTupleInterpretation.test_homogeneous_literal.<locals>.foorB   r   assertEqualpy_funcr:   r3   rC   r8   r8   r9   test_homogeneous_literal#      
z7TestLiteralTupleInterpretation.test_homogeneous_literalc                 C   r;   )Nc                  S   r<   )N)r>   r?   r@   ar@   r8   rA   r8   r8   r9   rC   -   rD   zFTestLiteralTupleInterpretation.test_heterogeneous_literal.<locals>.foorB   rE   rH   r8   r8   r9   test_heterogeneous_literal,   rJ   z9TestLiteralTupleInterpretation.test_heterogeneous_literalc                 C   sj   t dd }| | |  | t}| |d W d    n1 s%w   Y  | dt|j d S )Nc                  S   r<   )N)r>   r?   r@   rK                 ?   r8   rA   r8   r8   r9   rC   6   rD   z<TestLiteralTupleInterpretation.test_non_literal.<locals>.foorB   r*   )	r   rF   rG   assertRaisesAssertionErrorr:   assertInstr	exception)r3   rC   er8   r8   r9   test_non_literal5   s   
z/TestLiteralTupleInterpretation.test_non_literalN)__name__
__module____qualname__r:   rI   rL   rU   r8   r8   r8   r9   r)      s
    		r)   FZmutates_CFGZanalysis_onlyc                   @   s    e Zd ZdZdd Zdd ZdS )ResetTypeInfoZreset_the_type_informationc                 C      t |  d S Nr   __init__r3   r8   r8   r9   r^   F      zResetTypeInfo.__init__c                 C   s   d |_ d |_d |_dS )NT)r.   return_type	calltypes)r3   stater8   r8   r9   run_passI   s   zResetTypeInfo.run_passN)rV   rW   rX   _namer^   rd   r8   r8   r8   r9   rZ   B   s    rZ   c                   @   st   e Zd ZdddZedZedZeddZdd Zdd Ze	
d	d
d Zdd Ze	
d	dd Zdd ZdS )TestLoopCanonicalisationFc                    s   G  fdddt }|S )Nc                       s   e Zd Z fddZdS )z:TestLoopCanonicalisation.get_pipeline.<locals>.NewCompilerc                    s   t d}|td |td |td r|td  r&|td |td r4|td |t	d	 |t
d
 |td |td |td |  |gS )NZcustom_pipelineanalyzing bytecodeprocessing IRz(inline calls to locally defined closureszdo partial typingzCanonicalise loopszSimplify the CFGzresets the type info statenopython frontendzensure IR is legalzsave IR for later inspectionnative loweringnopython mode backend)r   add_passr   r   r   r!   r   r   rZ   r   r   r   r"   r    finalize)r3   pmuse_canonicaliseruse_partial_typingr8   r9   define_pipelinesU   s(   zKTestLoopCanonicalisation.get_pipeline.<locals>.NewCompiler.define_pipelinesN)rV   rW   rX   rr   r8   ro   r8   r9   NewCompilerS   s    rs   r   )rp   rq   rs   r8   ro   r9   get_pipelineR   s   $z%TestLoopCanonicalisation.get_pipelineTc                        fdd}| j \}}| j\}} fdd}|||  t|jd t|j dd }||d} t|d	 ||d}	 t|	d	 ||d
}
 t|
d	  |d jj|
d jj |j|	d  jd } t	|t
j dS )- This heavily checks a simple loop transform c                    P   t | ddd }d} |||| |j|jd  }|jd }||jfS )NZpipeline_classc                 S   s   d}| D ]}||7 }q|S Nr   r8   )tupaccir8   r8   r9   rC         
zQTestLoopCanonicalisation.test_simple_loop_in_depth.<locals>.get_info.<locals>.foor=   r   preserved_irr   rF   rG   r+   r,   metadatar-   pipelinerC   rB   r6   func_irr_   r8   r9   get_info   s   


zDTestLoopCanonicalisation.test_simple_loop_in_depth.<locals>.get_infoc                    ,   t t| j}t t|j} || d S r\   r#   r$   blocksrF   rK   bZa_cfgZb_cfgr_   r8   r9   compare_cfg      zGTestLoopCanonicalisation.test_simple_loop_in_depth.<locals>.compare_cfgr@   c                        fdd| j  D S )Nc                    &   g | ]}t |tjr|j kr|qS r8   r0   r   Exprop.0rB   r   r8   r9   
<listcomp>       

zYTestLoopCanonicalisation.test_simple_loop_in_depth.<locals>.find_getX.<locals>.<listcomp>rb   keysfdr   r8   r   r9   	find_getX      zETestLoopCanonicalisation.test_simple_loop_in_depth.<locals>.find_getXgetiterr>   getitemr   NLoopIgnoringCompilerLoopCanonicalisingCompilerrF   lenrb   valuenameargsr/   r0   r   	RangeTyper3   r   ignore_loops_irignore_loops_fndesccanonicalise_loops_ircanonicalise_loops_fndescr   r   il_getiterscl_getiterscl_getitems
range_instr8   r_   r9   test_simple_loop_in_depth~   s(   



z2TestLoopCanonicalisation.test_simple_loop_in_depthc                    ru   )z This checks the transform, when there's no typemap, will happily
        transform a loop on something that's not tuple-like
        c                    sH   t | ddd } | |  |j|jd  }|jd }||jfS )Nrx   c                  S      d} dD ]}| |7 } q| S Nr   r=   r8   r{   r|   r8   r8   r9   rC      r}   zLTestLoopCanonicalisation.test_transform_scope.<locals>.get_info.<locals>.foor   r~   r   )r   rC   r6   r   r_   r8   r9   r      s   


z?TestLoopCanonicalisation.test_transform_scope.<locals>.get_infoc                    r   r\   r   r   r_   r8   r9   r      r   zBTestLoopCanonicalisation.test_transform_scope.<locals>.compare_cfgr@   c                    r   )Nc                    r   r8   r   r   r   r8   r9   r      r   zTTestLoopCanonicalisation.test_transform_scope.<locals>.find_getX.<locals>.<listcomp>r   r   r8   r   r9   r      r   z@TestLoopCanonicalisation.test_transform_scope.<locals>.find_getXr   r>   r   r   Nr   r   r8   r_   r9   test_transform_scope   s(   



z-TestLoopCanonicalisation.test_transform_scopez-Waiting for pass to be enabled for all tuplesc                        fdd}| j \}}| j\}} fdd}|||  t|jd t|j dd }||d} t|d ||d}	 t|	d ||d	}
 t|
d
  |d
 jj|
d jj |	D ]}|j| jd } t	|t
j qhdS )zT This heavily checks a typed transformation only impacts tuple
        induced loopsc                    rw   )Nrx   c                 S   s6   d}t dD ]}| D ]}t dD ]}|d7 }qq
q|S Nr   rN   r@   r>   rangerz   r{   r|   yjr8   r8   r9   rC      s   
zYTestLoopCanonicalisation.test_influence_of_typed_transform.<locals>.get_info.<locals>.foor=   r   r   r   r   r_   r8   r9   r         


zLTestLoopCanonicalisation.test_influence_of_typed_transform.<locals>.get_infoc                    r   r\   r   r   r_   r8   r9   r     r   zOTestLoopCanonicalisation.test_influence_of_typed_transform.<locals>.compare_cfgr@   c                    r   )Nc                    r   r8   r   r   r   r8   r9   r     r   zaTestLoopCanonicalisation.test_influence_of_typed_transform.<locals>.find_getX.<locals>.<listcomp>r   r   r8   r   r9   r     r   zMTestLoopCanonicalisation.test_influence_of_typed_transform.<locals>.find_getXr   r   r>   r   Nr   TypedLoopCanonicalisingCompilerrF   r   rb   r   r   r   r/   r0   r   r   r3   r   r   r   r   r   r   r   r   r   r   rB   r   r8   r_   r9   !test_influence_of_typed_transform   s,   



z:TestLoopCanonicalisation.test_influence_of_typed_transformc                    r   )za This heavily checks a typed transformation only impacts loops with
        literal_unroll markerc                    rw   )Nrx   c                 S   s:   d}t dD ]}t| D ]}t dD ]}|d7 }qqq|S r   )r   r	   r   r8   r8   r9   rC   6  s   
zhTestLoopCanonicalisation.test_influence_of_typed_transform_literal_unroll.<locals>.get_info.<locals>.foor=   r   r~   r   r   r_   r8   r9   r   5  r   z[TestLoopCanonicalisation.test_influence_of_typed_transform_literal_unroll.<locals>.get_infoc                    r   r\   r   r   r_   r8   r9   r   K  r   z^TestLoopCanonicalisation.test_influence_of_typed_transform_literal_unroll.<locals>.compare_cfgr@   c                    r   )Nc                    r   r8   r   r   r   r8   r9   r   Z  r   zpTestLoopCanonicalisation.test_influence_of_typed_transform_literal_unroll.<locals>.find_getX.<locals>.<listcomp>r   r   r8   r   r9   r   Y  r   z\TestLoopCanonicalisation.test_influence_of_typed_transform_literal_unroll.<locals>.find_getXr   r   r>   r   Nr   r   r8   r_   r9   0test_influence_of_typed_transform_literal_unroll1  s,   



zITestLoopCanonicalisation.test_influence_of_typed_transform_literal_unrollc                    ^    fdd}| j \}}| j\}} fdd}|||  t|jd t|j dS )rv   c                    rw   )Nrx   c                 S   s^   d}| D ]}||7 }| d D ]}|d| 7 }|dkr nq|d8 }q| D ]}||d 8 }q$|S )Nr   )rN         r>   r   r?   r8   )rz   r{   r|   r   r8   r8   r9   rC   t  s   zJTestLoopCanonicalisation.test_lots_of_loops.<locals>.get_info.<locals>.foor=   r   r~   r   r   r_   r8   r9   r   s  s   


z=TestLoopCanonicalisation.test_lots_of_loops.<locals>.get_infoc                    r   r\   r   r   r_   r8   r9   r     r   z@TestLoopCanonicalisation.test_lots_of_loops.<locals>.compare_cfg	   Nr   r   rF   r   rb   r3   r   r   r   r   r   r   r8   r_   r9   test_lots_of_loopso  s   
z+TestLoopCanonicalisation.test_lots_of_loopsc                    r   )z( Checks a loop appearing from a closure c                    rw   )Nrx   c                 S   s.   dd }d}| D ]}||7 }|||7 }q|S )Nc                 S   s   d}t | D ]}|d7 }q|S Nr   r>   r   )nr{   r|   r8   r8   r9   bar     
zWTestLoopCanonicalisation.test_inlined_loops.<locals>.get_info.<locals>.foo.<locals>.barr   r8   )rz   r   r{   r|   r8   r8   r9   rC     s   zJTestLoopCanonicalisation.test_inlined_loops.<locals>.get_info.<locals>.foor=   r   r~   r   r   r_   r8   r9   r     s   


z=TestLoopCanonicalisation.test_inlined_loops.<locals>.get_infoc                    r   r\   r   r   r_   r8   r9   r     r   z@TestLoopCanonicalisation.test_inlined_loops.<locals>.compare_cfgr   Nr   r   r8   r_   r9   test_inlined_loops  s   
z+TestLoopCanonicalisation.test_inlined_loopsN)F)rV   rW   rX   rt   r   r   r   r   r   r   skipr   r   r   r   r8   r8   r8   r9   rf   P   s    
(
::
>>
.rf   c                   @   s:  e Zd Zdd Zdd Zdd Zdd Zd	d
 Ze	ddd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Ze d8d9 Z!e d:d; Z"e d<d= Z#d>d? Z$d@dA Z%dBdC Z&dDdE Z'dFdG Z(dHS )ITestMixedTupleUnrollc                 C   2   t dd }d}|}| |d||d| d S )Nc                 S   sV   dddd|d| f}d}t tt|D ]}||| 7 }|jdk r&|d8 }q |S |S 	N   ffffff)@              @rN   r?   r      r>   r   r   r	   real)idxzrK   r{   r|   r8   r8   r9   rC     s   

z)TestMixedTupleUnroll.test_01.<locals>.foor   r?   r   rF   rG   r3   rC   fkr8   r8   r9   test_01  s
   
zTestMixedTupleUnroll.test_01c                 C   r   )Nc                 S   sJ   dddd|d| f}d}t |D ]}||7 }|jdk r |d8 }q |S |S r   r	   r   )r   r   rB   r{   rK   r8   r8   r9   rC     s   

z)TestMixedTupleUnroll.test_02.<locals>.foor   r?   r   r   r8   r8   r9   test_02  s
   
zTestMixedTupleUnroll.test_02c                 C   r   )Nc                 S   sr   dddd|d| f}d|d| f}d}t |D ]}||7 }|jdk r'|d	8 }qt |D ]}||d
u 7 }q+ |S |S )Nr   r   r   rN   r?   rC   r   r   r>   Fr   )r   r   rB   r   r{   rK   tr8   r8   r9   rC     s   

z)TestMixedTupleUnroll.test_03.<locals>.foor   r?   r   r   r8   r8   r9   test_03  s
   
zTestMixedTupleUnroll.test_03c                 C   sR   t dd }d}t|ft||ft|||ff}| |||| d S )Nc                 S   s"   d}t | D ]}|| 7 }q|S ry   r	   sumrz   r{   rK   r8   r8   r9   rC        z)TestMixedTupleUnroll.test_04.<locals>.foor'   r   nponesrF   rG   r3   rC   r   rz   r8   r8   r9   test_04  s
   
(zTestMixedTupleUnroll.test_04c                 C   s|   t dd }d}d}t|ft||ft|||ft||||ft|||||ff}| |||||| d S )Nc                 S   s   d}t | D ]F}|dkr||d  7 }q|dkr"||d  7 }q|dkr/||d  7 }q|dkr<||d  7 }q|d	krI||d
  7 }qtd|S )Nr   rK   r   r>   cr?   r   r@   r   rN   ZUnreachable)r	   r   RuntimeErrortup1tup2r{   rK   r8   r8   r9   rC     s   z)TestMixedTupleUnroll.test_05.<locals>.foor'   )rK   r   r   r   r   r   )r3   rC   r   r   r   r8   r8   r9   test_05  s   
$"zTestMixedTupleUnroll.test_05zneeds more clever branch prunec                 C   s*   t dd }d}| |||| d S )Nc                 S   s@   d}t jtj}t| D ]}|dkr|| q||7 }q|S )Nr   rK   )r   ListZ
empty_listr   Zunicode_typer	   append)rz   r{   Zstr_bufrK   r8   r8   r9   rC   7  s   
z)TestMixedTupleUnroll.test_06.<locals>.foo)rK   r   r   )r3   rC   rz   r8   r8   r9   test_063  s   

zTestMixedTupleUnroll.test_06c                 C   sP   t dd }d}t|ft||fdddh df}| |||| d S )Nc                 S   s"   d}t | D ]}|t|7 }q|S ry   r	   r   r   r8   r8   r9   rC   G  r   z)TestMixedTupleUnroll.test_07.<locals>.foor'   
ABCDEFGHJIr=   r>   rC   r?   r      r@   rN   r   r      r   r   r8   r8   r9   test_07E  s   
zTestMixedTupleUnroll.test_07c                 C   sL   t dd }dd }d}|d|d|df}| |||||| d S )	Nc                 S   s\   d}t | D ]%}|dkr||d  7 }q|dkr ||d  7 }q|dkr+||d  7 }q|S )Nr   rK   r   r>   r   r?   r	   r   r8   r8   r9   rC   V  s   z)TestMixedTupleUnroll.test_08.<locals>.fooc                    s    fdd}t |S )Nc                      s    S r\   r8   r8   rA   r8   r9   implc     z7TestMixedTupleUnroll.test_08.<locals>.gen.<locals>.implr   )rB   r   r8   rA   r9   genb  s   z)TestMixedTupleUnroll.test_08.<locals>.gen)rK   r   r   r   r   )r   r>   r?   r@   r   )r3   rC   r   r   r   r8   r8   r9   test_08S  s   
zTestMixedTupleUnroll.test_08c                 C   s   t dd }t dd }t dd }t dd }d	}d
}| tj}||| W d    n1 s2w   Y  | tt|j d S )Nc                 S   sf   d}d}t | D ]&}|dkr||| 7 }n|dkr ||| 7 }n
|dkr*||| 7 }|d7 }q||fS )Nr   rK   r   r   r>   r   )r   r   r{   r   rK   r8   r8   r9   rC   n  s   
z)TestMixedTupleUnroll.test_09.<locals>.fooc                   S      dS Nr>   r8   r8   r8   r8   r9   func1|     z+TestMixedTupleUnroll.test_09.<locals>.func1c                   S   r   Nr?   r8   r8   r8   r8   r9   func2  r  z+TestMixedTupleUnroll.test_09.<locals>.func2c                   S   r   Nr@   r8   r8   r8   r8   r9   func3  r  z+TestMixedTupleUnroll.test_09.<locals>.func3rK   r   r   )rM   r>   r?   r   rO   r   TypingErrorrQ   r%   rR   rS   )r3   rC   r  r  r  r   r   raisesr8   r8   r9   test_09k  s   



zTestMixedTupleUnroll.test_09c                    B   dd  t  dddd }t fdd}| | |  d S )	Nc                 S   8   | dkrdS | dkrdS | dkrdS | dkrd|  S d S 	Nappler>   oranger?   bananar@      +# \r8   r   r8   r8   r9   dt     z(TestMixedTupleUnroll.test_10.<locals>.dtalwaysinlinec                       t | tjr'| j  dkrdd }|S  dkrdd }|S  dkr%dd }|S t | tjr<| j  dkr> fd	d}|S d S d S )
Nr  c                 S   r   r  r8   lir8   r8   r9   r     r   z9TestMixedTupleUnroll.test_10.<locals>.ol_dt.<locals>.implr  c                 S   r   r  r8   r  r8   r8   r9   r     r   r  c                 S   r   r  r8   r  r8   r8   r9   r     r   r  c                       d  S Nr  r8   r  r  r8   r9   r        r0   r   StringLiteralliteral_valueIntegerLiteralr  r   r8   r  r9   ol_dt  $   z+TestMixedTupleUnroll.test_10.<locals>.ol_dtc                     s"   d} t dD ]}|  |7 } q| S Nr   )r  r  r  r  r   r{   r   r  r8   r9   rC     r   z)TestMixedTupleUnroll.test_10.<locals>.foor   r   rF   rG   r3   r&  rC   r8   r*  r9   test_10     


zTestMixedTupleUnroll.test_10c                 C   "   t dd }| | |  d S )Nc                  S   sd   g } d}t tt|D ]#}|| }|dkr| d q|dkr&| | q|dkr/| d q| S N)r  r  r  r  0r  r  z2.0r   r   r	   r   rB   r   r|   r   r8   r8   r9   rC     s   
z)TestMixedTupleUnroll.test_11.<locals>.foor   rH   r8   r8   r9   test_11     
zTestMixedTupleUnroll.test_11c                 C   r/  )Nc                  S   sh   t  } d}ttt|D ]#}|| }|dkr| d q|dkr(| | q|dkr1| d q| S r0  )r   r   r   r   r	   r   r3  r8   r8   r9   rC     s   
z*TestMixedTupleUnroll.test_11a.<locals>.foor   rH   r8   r8   r9   test_11a  r5  zTestMixedTupleUnroll.test_11ac                 C   r   )Nc                 S   sp   dddd|d| f}d}t |D ]}||7 }|jdk r |d8 }qt |D ]}||7 }q$ |d d	k r6|d7 }|S 
Nr   r   r   rN   r?   r   r   r>      r   r   r   rK   r{   r|   rB   r8   r8   r9   rC     s   


z)TestMixedTupleUnroll.test_12.<locals>.foor   r?   r   r   r8   r8   r9   test_12  
   
zTestMixedTupleUnroll.test_12c                 C   `   t dd }d}|}| tj}|d| W d    n1 s w   Y  | dt|j d S )Nc                 S   s   dddd|d| f}d}t |D ]1}||7 }|jdk r |d8 }nt |D ]}t |D ]}||7 }q*||7 }q$t |D ]}||7 }q:qt |D ]}||7 }qF|d d	k rW|d7 }|S r7  r   )r   r   rK   r{   r|   rB   r   r8   r8   r9   rC     s$   





z)TestMixedTupleUnroll.test_13.<locals>.foor   r?   (Nesting of literal_unroll is unsupportedr   rO   r   UnsupportedErrorrQ   rR   rS   r3   rC   r   r   r  r8   r8   r9   test_13  s   
zTestMixedTupleUnroll.test_13c                 C   r/  )Nc                  S   s"   d} d}t | D ]}||7 }q|S Nr>   r?   r@   rN   r   r   rB   r{   rK   r8   r8   r9   rC     s
   
z)TestMixedTupleUnroll.test_14.<locals>.foor   rH   r8   r8   r9   test_14  s   
zTestMixedTupleUnroll.test_14c                 C   s   t dd }d}t|ft||fdddh df}| tj}|| W d    n1 s0w   Y  | dt|j d S )	Nc                 S   s"   d}t | D ]}|t|7 }q|S ry   r   rD  r8   r8   r9   rC   '  r   z)TestMixedTupleUnroll.test_15.<locals>.foor   r   r=   r   r   Cannot unify)	r   r   r   rO   r   r
  rQ   rR   rS   )r3   rC   r   rz   r  r8   r8   r9   test_15$  s   

zTestMixedTupleUnroll.test_15c                    r  )	Nc                 S   s4   | dkrdS | dkrdS | dkrdS | dkrdS d S )	N  rK     r     r     dr8   r  r8   r8   r9   r  :  s   z(TestMixedTupleUnroll.test_16.<locals>.dtr  r  c                 S   sf   t | tjr1| j}|dkrdd }|S |dkrdd }|S |dkr'dd }|S |dkr/d	d }|S d S )
NrH  c                 S   r   NrK   r8   r  r8   r8   r9   r   I  r   z9TestMixedTupleUnroll.test_16.<locals>.ol_dt.<locals>.implrI  c                 S   r   Nr   r8   r  r8   r8   r9   r   L  r   rJ  c                 S   r   Nr   r8   r  r8   r8   r9   r   O  r   rK  c                 S   r   NrL  r8   r  r8   r8   r9   r   R  r   )r0   r   r$  r#  r  r   r   r8   r8   r9   r&  D  s   z+TestMixedTupleUnroll.test_16.<locals>.ol_dtc                     s.   d} d}t | d d D ]}| |7 }q|S )NrH  rI  rJ  rK   r?   r   rD  r*  r8   r9   rC   V  
   z)TestMixedTupleUnroll.test_16.<locals>.foor+  r,  r8   r*  r9   test_167  s   


zTestMixedTupleUnroll.test_16c                    r  )	Nc                 S   s@   | dkrdS | dkrdS | dkrdS | dkrdS | d	krd
S d S )NrH  rK   rI  r   rJ  r   rK  rL  r   EFFr8   r  r8   r8   r9   r  c  s   z(TestMixedTupleUnroll.test_17.<locals>.dtr  r  c                 S   s   t | tjr1| j}|dkrdd }|S |dkrdd }|S |dkr'dd }|S |dkr/d	d }|S t | tjrD| j}|d
krFdd }|S d S d S )NrH  c                 S   r   rM  r8   r  r8   r8   r9   r   t  r   z9TestMixedTupleUnroll.test_17.<locals>.ol_dt.<locals>.implrI  c                 S   r   rN  r8   r  r8   r8   r9   r   w  r   rJ  c                 S   r   rO  r8   r  r8   r8   r9   r   z  r   rK  c                 S   r   rP  r8   r  r8   r8   r9   r   }  r   r   c                 S   r   )NrV  r8   r  r8   r8   r9   r     r   )r0   r   r$  r#  r"  rQ  r8   r8   r9   r&  o  s*   z+TestMixedTupleUnroll.test_17.<locals>.ol_dtc                     s.   d} d}t | dd  D ]}| |7 }q|S )N)rH  rI  rJ  r   rS  r>   r   rD  r*  r8   r9   rC     rT  z)TestMixedTupleUnroll.test_17.<locals>.foor+  r,  r8   r*  r9   test_17`  s   

zTestMixedTupleUnroll.test_17c                 C   r/  )Nc                  S   s:   d} d}t | d d d D ]}|d7 }|dk r |S q|S )N)rH  rI  rJ  rK  i  ip  r   r>   rJ  r   )rB   countrK   r8   r8   r9   rC     s   z)TestMixedTupleUnroll.test_18.<locals>.foor   rH   r8   r8   r9   test_18     
	zTestMixedTupleUnroll.test_18c                 C   r/  )Nc                  S   s`   d} g d}ddg}||f}t d}t jdt jd}||||f}t|D ]}| t|7 } q%| S )Nr   rC  r'      r   dtyper   aranger   
complex128r	   r   r{   l1l2rz   a1a2r   r8   r8   r9   rC     s   
z)TestMixedTupleUnroll.test_19.<locals>.foor   rH   r8   r8   r9   test_19  s   
zTestMixedTupleUnroll.test_19c                 C   r/  )Nc                  S   sF   g } t d}t jdt jd}||f}t|D ]	}| |  q| S )Nr\  r   r]  )r   r`  r   ra  r	   r   r   )lre  rf  rz   r   r8   r8   r9   rC     s   
z)TestMixedTupleUnroll.test_20.<locals>.foor   rH   r8   r8   r9   test_20  s   
	zTestMixedTupleUnroll.test_20c                 C   .   t dd }d}|}| |||| d S )Nc                    s0   d  fdd}d}dD ]	}|| | 7 }q|S )Nr8  gfffff7@y              @   c                        d} t  D ]}| |7 } q| S ry   r   r{   r   r   r8   r9   r     r   z6TestMixedTupleUnroll.test_21.<locals>.foo.<locals>.barr   rC  r8   r   r   Z	outer_accrB   r8   ro  r9   rC     s   z)TestMixedTupleUnroll.test_21.<locals>.foor   r   r   r8   r8   r9   test_21  s
   
zTestMixedTupleUnroll.test_21c                 C   ^   t dd }d}|}| tj}|| W d    n1 sw   Y  | dt|j d S )Nc                    sF   dddd| d|  df}d  fdd	}d
}t |D ]}|| 7 }q|S )Nr   r   r   rN   r?   rK   rk  c                     rm  ry   r   rn  ro  r8   r9   r     r   z6TestMixedTupleUnroll.test_22.<locals>.foo.<locals>.barr   r   )r   rK   r   r{   rB   r8   ro  r9   rC     s   z)TestMixedTupleUnroll.test_22.<locals>.foor   r=  r>  r@  r8   r8   r9   test_22  s   

zTestMixedTupleUnroll.test_22c                 C   rr  )Nc                    s4   d  fdd}d}t  D ]	}|| | 7 }q|S )Nrk  c                     rm  ry   r   rn  ro  r8   r9   r     r   z6TestMixedTupleUnroll.test_23.<locals>.foo.<locals>.barr   r   rp  r8   ro  r9   rC     s   z)TestMixedTupleUnroll.test_23.<locals>.foor   r=  r>  r@  r8   r8   r9   test_23  s   

zTestMixedTupleUnroll.test_23c                 C   sX   t dd }| tj}|  W d    n1 sw   Y  d}| |t|j d S )Nc                  S   s   t dD ]} t|  qd S )NZABCDEr	   printrA   r8   r8   r9   rC      s   
z)TestMixedTupleUnroll.test_24.<locals>.fooz7argument should be a tuple or a list of constant valuesr>  )r3   rC   r  msgr8   r8   r9   test_24  s   
zTestMixedTupleUnroll.test_24c                 C   r/  )Nc                  S   s<   t ddddgdf} | }|}g }|D ]	}|t| q|S )Nr=   )               @r   r>   r?   Zxyz)r	   r   r   )valZalias1Zalias2ZlensrB   r8   r8   r9   rC   -  s   z)TestMixedTupleUnroll.test_25.<locals>.foor   rH   r8   r8   r9   test_25+  r[  zTestMixedTupleUnroll.test_25c                 C   rj  )Nc           	      S   sv   dddd| d|  f}d}d}d}d}t jt|ft jd	}t|D ]}||7 }|||< |d
7 }|| }q!|||||fS )Nr   r   r   rN   r?   r   6      r]  r>   )r   emptyr   ra  r	   )	r   rK   r{   rY  Z	untouchedZ	read_onlyZmutatedrB   escaper8   r8   r9   rC   >  s   
z)TestMixedTupleUnroll.test_26.<locals>.foor   )r   ZassertPreciseEqualrG   r   r8   r8   r9   test_269  s
   
zTestMixedTupleUnroll.test_26c                 C   4   t dddd }d}|}| |||| d S )NTZparallelc                 S   s@   dddd| d|  f}d}t |D ]}tdD ]}|d7 }qq|S )	Nr   r   r   rN   r?   r   r'   r>   r	   r
   r   rK   r{   rB   r   r8   r8   r9   rC   U     
z)TestMixedTupleUnroll.test_27.<locals>.foor   r   r   r8   r8   r9   test_27R  s
   
zTestMixedTupleUnroll.test_27c                 C   s6   t dddd }d}|}tj|||| d S )NTr  c                 S   s@   dddd| d|  f}d}t |D ]}tdD ]}||7 }qq|S Nr   r   r   rN   r?   r   r'   r  r  r8   r8   r9   rC   f  r  z)TestMixedTupleUnroll.test_28.<locals>.foor   )r   r   testingZassert_allcloserG   r   r8   r8   r9   test_28c  s
   
zTestMixedTupleUnroll.test_28c                 C   r  )NTr  c                 S   s@   dddd| d|  f}d}t dD ]}t|D ]}||7 }qq|S r  )r
   r	   )r   rK   r{   r   rB   r8   r8   r9   rC   y  r  z)TestMixedTupleUnroll.test_29.<locals>.foor   r   r   r8   r8   r9   test_29u  s
   
zTestMixedTupleUnroll.test_29c                 C   r/  )Nc                     $   d  fdd} dd t | dD S )N  c                    *   d}d}t |D ]}||  7 }q|| fS Nr   r   r   r   rN   r   r   r{   rK   rB   constr8   r9   r     
   z6TestMixedTupleUnroll.test_30.<locals>.foo.<locals>.barc                 S      g | ]}|qS r8   r8   r   r8   r8   r9   r         z=TestMixedTupleUnroll.test_30.<locals>.foo.<locals>.<listcomp>r>   r?   mapr   r8   r  r9   rC        z)TestMixedTupleUnroll.test_30.<locals>.foor   rH   r8   r8   r9   test_30     
zTestMixedTupleUnroll.test_30c                 C   sf   t dd }| tj}|  W d    n1 sw   Y  | tt|j | dt|j d S )Nc                     r  )Nr  c                    r  r  r   r  r  r8   r9   r     r  z6TestMixedTupleUnroll.test_31.<locals>.foo.<locals>.barc                 S   r  r8   r8   r   r8   r8   r9   r     r  z=TestMixedTupleUnroll.test_31.<locals>.foo.<locals>.<listcomp>)r>   ry  r  r  r8   r  r9   rC     r  z)TestMixedTupleUnroll.test_31.<locals>.foozipr	  r3   rC   r  r8   r8   r9   test_31  s   
zTestMixedTupleUnroll.test_31c                    s2   t dd  t  fdd}| | |  d S )Nc                 s       t | D ]}|V  qd S r\   r   rK   rB   r8   r8   r9   r     s   z)TestMixedTupleUnroll.test_32.<locals>.genc                      s   dd  dD S )Nc                 S   r  r8   r8   r   r8   r8   r9   r     r  z=TestMixedTupleUnroll.test_32.<locals>.foo.<locals>.<listcomp>r>   gffffff@y              @r8   r8   r   r8   r9   rC     s   z)TestMixedTupleUnroll.test_32.<locals>.foor   rH   r8   r  r9   test_32  s
   
zTestMixedTupleUnroll.test_32c                 C   s<   t dd }dd }||}||jj}| | |  d S )Nc                 s   s    | |V  d S r\   r8   )r4   argr8   r8   r9   consumer  s   z.TestMixedTupleUnroll.test_33.<locals>.consumerc                    s   t  fdd}|S )Nc                     s   dd } dd  | dD S )Nc                 s   r  r\   r   r  r8   r8   r9   r     s   zCTestMixedTupleUnroll.test_33.<locals>.get.<locals>.foo.<locals>.genc                 S   s   g | ]}t |qS r8   )nextr   r8   r8   r9   r     s    zJTestMixedTupleUnroll.test_33.<locals>.get.<locals>.foo.<locals>.<listcomp>r  r8   r  consr8   r9   rC     s   z6TestMixedTupleUnroll.test_33.<locals>.get.<locals>.foor   )r  rC   r8   r  r9   get  s   z)TestMixedTupleUnroll.test_33.<locals>.get)r   rG   rF   )r3   r  r  ZcfuncZpyfuncr8   r8   r9   test_33  s   
	zTestMixedTupleUnroll.test_33c                 C   sf   t dd }| tj}|  W d    n1 sw   Y  | dt|j | dt|j d S )Nc                  S   sn   d} g d}ddg}| d dkr||f}nt d}t jdt jd}||||f}t|D ]}| t|7 } q,| S )	Nr   rC  r'   r\  r?   r@   r   r]  r_  rb  r8   r8   r9   rC     s   

z)TestMixedTupleUnroll.test_34.<locals>.foozInvalid use ofz&found multiple definitions of variabler>  r  r8   r8   r9   test_34  s   
zTestMixedTupleUnroll.test_34N))rV   rW   rX   r   r   r   r   r   r   r   r   r   r   r  r-  r4  r6  r:  rA  rE  rG  rU  rW  rZ  rg  ri  rq  rs  rt  rx  r{  r  r   r  r  r  r  r  r  r  r  r8   r8   r8   r9   r     sP    
%, )1-


r   c                   @   s|   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )TestConstListUnrollc                 C   r/  )Nc                  S   sJ   g d} d}t tt| D ]}|| | 7 }|jdk r |d8 }q |S |S Nr  r   r   r>   r   )rK   r{   r|   r8   r8   r9   rC     s   

z(TestConstListUnroll.test_01.<locals>.foor   rH   r8   r8   r9   r     r  zTestConstListUnroll.test_01c                 C   r/  )Nc                  S   s>   g d} d}t | D ]}||7 }|jdk r|d8 }q
 |S |S r  r   rD  r8   r8   r9   rC     s   

z(TestConstListUnroll.test_02.<locals>.foor   rH   r8   r8   r9   r     s   
zTestConstListUnroll.test_02c                 C   r/  )Nc                  S   s`   g d} ddg}d}t | D ]}||7 }|jdk r|d8 }qt |D ]}||du 7 }q" |S |S )Nr  rC   rl  r   r   r>   Fr   rB   r   r{   rK   r   r8   r8   r9   rC     s   

z(TestConstListUnroll.test_03.<locals>.foor   rH   r8   r8   r9   r        
zTestConstListUnroll.test_03c                 C   r/  )Nc                  S   s\   g d} d}d}t | D ]}||7 }|jdk r|d8 }qt |D ]}||du 7 }q  |S |S )Nr  )rC   rl  r   r   r>   Fr   r  r8   r8   r9   rC   !  s   

z(TestConstListUnroll.test_04.<locals>.foor   rH   r8   r8   r9   r     r  zTestConstListUnroll.test_04c                 C   s   t dd }d}tdtdg}t|ft||ft|||ft||||ft|||||ff}| tj}||| W d    n1 sMw   Y  d}| |t|j	 d S )Nc                 S   s2   d}t | D ]}|d dkr||d  7 }q|S r   r   r   r8   r8   r9   rC   4  s   z(TestConstListUnroll.test_05.<locals>.foor'   z6Invalid use of literal_unroll with a function argument)
r   r   Zzerosr   rO   r   r?  rQ   rR   rS   )r3   rC   r   r   r   r  rw  r8   r8   r9   r   2  s   
$"zTestConstListUnroll.test_05c                 C   T   t dd }| tj}|  W d    n1 sw   Y  | dt|j d S )Nc                  S   sL   d} t | ft | | fdddh dg}d}t|D ]}|t|7 }q|S )Nr'   r   r=   r   r   r   )r   r   r	   r   )r   rz   r{   rK   r8   r8   r9   rC   I  s   z(TestConstListUnroll.test_06.<locals>.fooz&Found non-constant value at position 0r>  r  r8   r8   r9   r   G  s   
	zTestConstListUnroll.test_06c                    r  )	Nc                 S   r  r  r8   r  r8   r8   r9   r  \  r  z&TestConstListUnroll.test_7.<locals>.dtr  r  c                    r  )
Nr  c                 S   r   r  r8   r  r8   r8   r9   r   k  r   z7TestConstListUnroll.test_7.<locals>.ol_dt.<locals>.implr  c                 S   r   r  r8   r  r8   r8   r9   r   n  r   r  c                 S   r   r  r8   r  r8   r8   r9   r   q  r   r  c                    r  r  r8   r  r  r8   r9   r   w  r   r!  r%  r8   r  r9   r&  f  r'  z)TestConstListUnroll.test_7.<locals>.ol_dtc                     s&   d} t g dD ]}|  |7 } q| S r(  r   r)  r*  r8   r9   rC   |  s   z'TestConstListUnroll.test_7.<locals>.foor+  r,  r8   r*  r9   test_7Y  r.  zTestConstListUnroll.test_7c                 C   r/  )Nc                  S   sh   g } g d}t tt|D ]#}|| }|dkr| d q|dkr(| | q|dkr1| d q| S r0  r2  r3  r8   r8   r9   rC     s   
z'TestConstListUnroll.test_8.<locals>.foor   rH   r8   r8   r9   test_8  r5  zTestConstListUnroll.test_8c                 C   r   )Nc                 S   sd   g d}d}t |D ]}||7 }|jdk r|d8 }q
t |D ]}||7 }q |d dk r0|d7 }|S )Nr  r   r   r>   r8  r?   r   r9  r8   r8   r9   rC     s   


z'TestConstListUnroll.test_9.<locals>.foor   r?   r   r   r8   r8   r9   test_9  r;  zTestConstListUnroll.test_9c                 C   r<  )Nc                 S   s   dddd|d| f}g d}d}t |D ]1}||7 }|jdk r$|d	8 }nt |D ]}t |D ]}||7 }q.||7 }q(t |D ]}||7 }q>qt |D ]}||7 }qJ|d d
k r[|d7 }|S )Nr   r   r   rN   r?   r  r   r   r>   r8  r   )r   r   rK   r   r{   r|   rB   r   r8   r8   r9   rC     s&   





z(TestConstListUnroll.test_10.<locals>.foor   r?   r=  r>  r@  r8   r8   r9   r-    s   
zTestConstListUnroll.test_10c                 C   r/  )Nc                  S   s&   g d} d}t | D ]}||7 }q
|S rB  r   rD  r8   r8   r9   rC     
   
z(TestConstListUnroll.test_11.<locals>.foor   rH   r8   r8   r9   r4    s   
zTestConstListUnroll.test_11c                 C   r  )Nc                  S   s*   d} g d}t |D ]}| t|7 } q
|S )Nr   )r>   r?   rK   )r	   bool)r{   rB   rK   r8   r8   r9   rC     s
   z(TestConstListUnroll.test_12.<locals>.foorF  r   rO   r   r
  rQ   rR   rS   r  r8   r8   r9   r:    s   
zTestConstListUnroll.test_12c                 C   r  )Nc                  S   s.   g d} d}t | d d D ]}||7 }q|S )NrR  r   r?   r   rD  r8   r8   r9   rC     s
   
z(TestConstListUnroll.test_13.<locals>.foozInvalid use of literal_unrollr>  r  r8   r8   r9   rA    s   
zTestConstListUnroll.test_13c                 C   r  )Nc                  S   s0   g d} d}t | D ]}||7 }q
| d |S )NrR  r   r'   )r	   r   rD  r8   r8   r9   rC     s   

z(TestConstListUnroll.test_14.<locals>.fooz(Unknown attribute 'append' of type Tupler  r  r8   r8   r9   rE    s   
zTestConstListUnroll.test_14N)rV   rW   rX   r   r   r   r   r   r   r  r  r  r-  r4  r:  rA  rE  r8   r8   r8   r9   r    s    ,!r  c                   @   s   e Zd Zdd Zdd Zeddd Zedd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-S ).TestMorec                 C   r  )Nc                  S   s$   d} d}t | | D ]}||7 }q	|S )N)r'   r\  r   r   rB   rrK   r8   r8   r9   rC     s
   
z2TestMore.test_invalid_use_of_unroller.<locals>.fooz*literal_unroll takes one argument, found 2r>  r  r8   r8   r9   test_invalid_use_of_unroller  s   
z%TestMore.test_invalid_use_of_unrollerc                 C   sV   t dd }| tj}|d W d    n1 sw   Y  | dt|j d S )Nc                 S   &   d| g}d}t |D ]}||7 }q
|S Nr'   r   r   r   rB   r  rK   r8   r8   r9   rC   "  r  z,TestMore.test_non_constant_list.<locals>.foor'   zKFound non-constant value at position 1 in a list argument to literal_unrollr>  r  r8   r8   r9   test_non_constant_list   s   

zTestMore.test_non_constant_listz!numba.literally not supported yetc                    s>   ddl m tfdd  d t fdd}|  d S )Nr   	literallyc                    s*   d | g}d}t |D ]}||7 }q|S r  r   r  r  r8   r9   rC   7  
   
z2TestMore.test_literally_constant_list.<locals>.foor   c                          dS Nr   r8   r8   rC   r8   r9   r   C  r   z2TestMore.test_literally_constant_list.<locals>.bar)numbar  r   r3   r   r8   )rC   r  r9   test_literally_constant_list2  s   	
z%TestMore.test_literally_constant_listz8inlining of foo doesn't have const prop so y isn't constc                    s4   t dddd  t  fdd}| | d d S )Nr  r  c                 S   r  r  r   r  r8   r8   r9   rC   M  r  z.TestMore.test_inlined_unroll_list.<locals>.fooc                      r  r  r8   r8   r  r8   r9   r   U  r   z.TestMore.test_inlined_unroll_list.<locals>.bar   )r   rF   r  r8   r  r9   test_inlined_unroll_listK  s
   
z!TestMore.test_inlined_unroll_listc                 C   s<   t dd }| |d|d | |d|d d S )Nc                 S   s&   d| f}d}t |D ]}||7 }q
|S r  r   r  r8   r8   r9   rC   \  r  z+TestMore.test_unroll_tuple_arg.<locals>.foor   333333?r   rH   r8   r8   r9   test_unroll_tuple_arg[  s   
zTestMore.test_unroll_tuple_argc                 C   s<   t dd }| |d|d | |d|d d S )Nc                 S      d}t | D ]}||7 }q|S ry   r   r  r8   r8   r9   rC   h     
z,TestMore.test_unroll_tuple_arg2.<locals>.foo)r   r  r   rH   r8   r8   r9   test_unroll_tuple_arg2g  s   
zTestMore.test_unroll_tuple_arg2c                 C   r/  )Nc                  S   s2   d} d}t | D ]}|}|}||| | 7 }q|S )Nr'   r  r   r   )rB   outr|   r   r   r8   r8   r9   rC   s  s   z-TestMore.test_unroll_tuple_alias.<locals>.foor   rH   r8   r8   r9   test_unroll_tuple_aliasr  s   
	z TestMore.test_unroll_tuple_aliasc                 C   sj   t dd }| tj}|  W d    n1 sw   Y  | dt|j d}| t|j| d S )Nc                  S   s,   d} d}t | D ]}|D ]}||7 }qq|S )N)r  )rM   g      @r   r   )rB   r  r|   r   r8   r8   r9   rC     s   
z.TestMore.test_unroll_tuple_nested.<locals>.foor   z#.*Tuple\(int[0-9][0-9], float64\).*)r   rO   r   r
  rQ   rR   rS   assertRegex)r3   rC   r  rer8   r8   r9   test_unroll_tuple_nested  s   
z!TestMore.test_unroll_tuple_nestedc                 C   sX   t dd }t }|  W d    n1 sw   Y  |  }| |g d d S )Nc                  S   sZ   i } d| d< d| d< i }d|d< d|d< t | |fD ]}| D ]	\}}t|| q qd S )	Nr>   rK   r?   r   r   r@   rL  rN   )r	   itemsrv  )rB   r   itr   vr8   r8   r9   rC     s   z/TestMore.test_unroll_tuple_of_dict.<locals>.foo)za 1zb 2z3 cz4 d)r   r   getvalue
splitlinesrF   )r3   rC   stdoutlinesr8   r8   r9   test_unroll_tuple_of_dict  s   
z"TestMore.test_unroll_tuple_of_dictc                    4   t dg d t fdd}| | |  d S )NABCr  c                     *    ddd} d}t | D ]}||7 }q|S )Nr>   ry  333333@r   r   abcr  r|   r  r8   r9   rC     r  z-TestMore.test_unroll_named_tuple.<locals>.foor   r   rF   rG   rH   r8   r  r9   test_unroll_named_tuple     z TestMore.test_unroll_named_tuplec                 C   @   t dg d}tdd }|ddd}| |||| d S )Nr  r  c                 S   r  ry   r   rB   r  r|   r8   r8   r9   rC     r  z1TestMore.test_unroll_named_tuple_arg.<locals>.foor>   ry  r  r  r3   r  rC   r  r8   r8   r9   test_unroll_named_tuple_arg  
   
z$TestMore.test_unroll_named_tuple_argc                    r  )Nr  r  c                     r  )Nr>   r?   r@   r   r   r  r  r8   r9   rC     r  z0TestMore.test_unroll_named_unituple.<locals>.foor  rH   r8   r  r9   test_unroll_named_unituple  r  z#TestMore.test_unroll_named_unituplec                 C   r  )Nr  r  c                 S   r  ry   r   r  r8   r8   r9   rC     r  z4TestMore.test_unroll_named_unituple_arg.<locals>.foor>   r?   r@   r  r  r8   r8   r9   test_unroll_named_unituple_arg  r  z'TestMore.test_unroll_named_unituple_argc                 C   r/  )Nc                  S   s   d} t tD ]}| |7 } q| S ry   )r	   	_X_GLOBALr  r|   r8   r8   r9   rC     r  z.TestMore.test_unroll_global_tuple.<locals>.foor   rH   r8   r8   r9   test_unroll_global_tuple  s   
z!TestMore.test_unroll_global_tuplec                    s*   d t  fdd}| | |  d S )Nr&   c                     rm  ry   r   r  rA   r8   r9   rC     r  z/TestMore.test_unroll_freevar_tuple.<locals>.foor   rH   r8   rA   r9   test_unroll_freevar_tuple  s   z"TestMore.test_unroll_freevar_tuplec                    sF   t dd }t dd }||f t  fdd}| | |  d S )Nc                   S   r   r  r8   r8   r8   r8   r9   rK     r  z.TestMore.test_unroll_function_tuple.<locals>.ac                   S   r   r  r8   r8   r8   r8   r9   r     r  z.TestMore.test_unroll_function_tuple.<locals>.bc                     s    d} t  D ]}| | 7 } q| S ry   r   )r  r   rA   r8   r9   rC         z0TestMore.test_unroll_function_tuple.<locals>.foor   )r3   rK   r   rC   r8   rA   r9   test_unroll_function_tuple  s   

z#TestMore.test_unroll_function_tuplec                 C   s   t dd }dd tdD }t  | |||| W d    n1 s(w   Y  t }|| W d    n1 s?w   Y  |  }| |g d d S )Nc                 S   sL   d}d}dd | D }d}t |D ]}||| 7 }|d7 }t| q||fS )Nr   c                 S   r  r8   r8   )r   rK   r8   r8   r9   r     r  zCTestMore.test_unroll_indexing_list.<locals>.foo.<locals>.<listcomp>)rK      gq=
ףp?Nr>   ru  )contr|   r{   Znormal_listZheter_tupleitemr8   r8   r9   rC     s   
z/TestMore.test_unroll_indexing_list.<locals>.fooc                 S   r  r8   r8   )r   r   r8   r8   r9   r     r  z6TestMore.test_unroll_indexing_list.<locals>.<listcomp>rN   )rK   Z25z0.23None)r   r   r   rF   rG   r  r  )r3   rC   datar  r  r8   r8   r9   test_unroll_indexing_list	  s   

z"TestMore.test_unroll_indexing_listc                    sP   t dt dt dfddlm  t fdd}| | |  d S )N)r>   )r>   r>   )r>   r>   r>   r   r   c                     s    d}  D ]}| |j 7 } q| S ry   )ndimr  Zfreevar_unrollmixedr8   r9   rC   *  r  z.TestMore.test_unroller_as_freevar.<locals>.foo)r   r   r  r	   r   rF   rG   rH   r8   r  r9   test_unroller_as_freevar&  s
   z!TestMore.test_unroller_as_freevarc                 C   s   t ddd }d S )Nz(Tuple((int64, float64)),)c                 S   s.   t | D ]}qd}|dkrd}|dksd S d S )Nr>   r   r   )rz   r   rB   r8   r8   r9   rC   6  s   zCTestMore.test_unroll_with_non_conformant_loops_present.<locals>.foor   rH   r8   r8   r9   -test_unroll_with_non_conformant_loops_present3  s   z6TestMore.test_unroll_with_non_conformant_loops_presentc                    J   t jddgddgd}t|jj  t fdd}| ||d d S )	Nr  r?   r@   )re  f8)rf  r  r]  c                    ,   d}t  D ]}|t| |   }q|S ry   r	   r   absr   Zarrresr   fieldsr8   r9   rC   D     z>TestMore.test_literal_unroll_legalize_var_names01.<locals>.foo       @r   arraytupler^  r	  r   r   rF   r3   testrC   r8   r  r9   (test_literal_unroll_legalize_var_names01?  s
   z1TestMore.test_literal_unroll_legalize_var_names01c                    r   )	Nr  r  )za1[0]r  )za2[1]r  r]  c                    r  ry   r  r  r  r8   r9   rC   S  r
  z>TestMore.test_literal_unroll_legalize_var_names02.<locals>.foor  r  r  r8   r  r9   (test_literal_unroll_legalize_var_names02M  s   
z1TestMore.test_literal_unroll_legalize_var_names02N)rV   rW   rX   r  r  r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r8   r8   r8   r9   r    s0    

r  c                    s$   t dddG  fdddt}|S )zg Returns a compiler pass that captures the mutation state reported
    by the pass used in the argumentFTrY   c                       s.   e Zd Zd j Z Zdd Z fddZdS )zcapture.<locals>.ResultCapturerz
capture_%sc                 S   r[   r\   r]   r_   r8   r8   r9   r^   e  r`   z(capture.<locals>.ResultCapturer.__init__c                    s&      |}|jdi }|| < |S )Nmutation_results)rd   r   
setdefault)r3   rc   resultr  	real_passr8   r9   rd   h  s   z(capture.<locals>.ResultCapturer.run_passN)rV   rW   rX   re   Z
_real_passr^   rd   r8   r  r8   r9   ResultCapturer`  s
    
r  )r   r   )r  r  r8   r  r9   capture]  s   
r  c                   @   s   e Zd ZdZdd ZdS )CapturingCompilerz? Simple pipeline that wraps passes with the ResultCapturer passc                    sr   t d  fdd}|td |td |td |td |td |td	 |td
 |td  	   gS )NzCapturing Compilerc                    s     t| |S r\   )rl   r  )rB   r   rn   r8   r9   rl   w  s   z4CapturingCompiler.define_pipelines.<locals>.add_passrg   zfix up argsrh   zhandles literal_unrollri   z$ensure IR is legal prior to loweringrj   rk   )
r   r   r   r   r   r   r   r"   r    rm   )r3   rl   r8   r  r9   rr   t  s   






z"CapturingCompiler.define_pipelinesN)rV   rW   rX   __doc__rr   r8   r8   r8   r9   r  q  s    r  c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestLiteralUnrollPassTriggeringc                 C   @   t tddd }|  |j|jd  }| |jd t  d S )Nrx   c                  S   r   r   r8   r   r8   r8   r9   rC     r}   zLTestLiteralUnrollPassTriggering.test_literal_unroll_not_invoked.<locals>.foor   r  r   r  r+   r,   assertFalser   r   r3   rC   r6   r8   r8   r9   test_literal_unroll_not_invoked  
   
z?TestLiteralUnrollPassTriggering.test_literal_unroll_not_invokedc                 C   r  )Nrx   c                  S   s   d} t dD ]}| |7 } q| S r   r   r   r8   r8   r9   rC     r  zKTestLiteralUnrollPassTriggering.test_literal_unroll_is_invoked.<locals>.foor   r  )r   r  r+   r,   r/   r   r   r!  r8   r8   r9   test_literal_unroll_is_invoked  r#  z>TestLiteralUnrollPassTriggering.test_literal_unroll_is_invokedc                    sH   t  ttd fdd}|  |j|jd  }| |jd t  d S )Nrx   c                     s   d}  dD ]}| |7 } q| S r   r8   r   aliasr8   r9   rC     r  zUTestLiteralUnrollPassTriggering.test_literal_unroll_is_invoked_via_alias.<locals>.foor   r  )r	   r   r  r+   r,   r/   r   r   r!  r8   r%  r9   (test_literal_unroll_is_invoked_via_alias  s   zHTestLiteralUnrollPassTriggering.test_literal_unroll_is_invoked_via_aliasc                 C   r  )Nrx   c                   S   s   d S r\   r8   r8   r8   r8   r9   rC     r  zVTestLiteralUnrollPassTriggering.test_literal_unroll_assess_empty_function.<locals>.foor   r  r  r!  r8   r8   r9   )test_literal_unroll_assess_empty_function  s
   
zITestLiteralUnrollPassTriggering.test_literal_unroll_assess_empty_functionc                 C   sT   d}i }t |i | ttd|d }|  |j|jd  }| |jd t  d S )Nzdef foo():
	passrx   rC   r   r  )execr   r  r+   r,   r   r   r   )r3   r   rh  rC   r6   r8   r8   r9   "test_literal_unroll_not_in_globals  s   zBTestLiteralUnrollPassTriggering.test_literal_unroll_not_in_globalsc                 C   s~  d}i }t |i | ttd|d }| tj}|  W d    n1 s'w   Y  | dt|j i }t |dt	i| ttd|d }|  |j
|jd  }| |jd t  ddlm} d	}i }t ||i | ttd|d
 }|  |j
|jd  }| |jd t  ddlm} d}i }t ||i | ttd|d
 }|  |j
|jd  }| |jd t  d S )Nz1def foo():
	for x in literal_unroll((1,)):
		passrx   rC   z$Untyped global name 'literal_unroll'r	   r   r  )dedentz
            def gen():
                from numba import literal_unroll
                def foo():
                    for x in literal_unroll((1,)):
                        pass
                return foo
            bar = gen()
            r   a  
            def gen():
                from numba import literal_unroll as something_else
                def foo():
                    for x in something_else((1,)):
                        pass
                return foo
            bar = gen()
            )r)  r   r  rO   r   r
  rQ   rR   rS   r	   r+   r,   r/   r   r   textwrapr+  )r3   r   rh  rC   r  r6   r+  r8   r8   r9   &test_literal_unroll_globals_and_locals  s@   		zFTestLiteralUnrollPassTriggering.test_literal_unroll_globals_and_localsN)	rV   rW   rX   r"  r$  r'  r(  r*  r-  r8   r8   r8   r9   r    s    		r  __main__)=collectionsr   numpyr   Znumba.tests.supportr   r   r   r   r  r   r   r	   r
   Z
numba.corer   r   r   Znumba.testingr   Znumba.core.extendingr   Znumba.core.compiler_machineryr   r   r   r   Znumba.core.compilerr   Znumba.core.untyped_passesr   r   r   r   r   r   r   r   Znumba.core.typed_passesr   r   r    r!   r"   Znumba.core.ir_utilsr#   r$   Znumba.core.types.functionsr%   r  r)   rZ   rf   r   r  r  r  r  r  rV   mainr8   r8   r8   r9   <module>   sN    (
(        "  (  Pq