U
    ,d;                     @   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 )$    )
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 q2d S )Nr   non literal)		overloads
signaturesfndesctypemap
assertTrue
isinstancer   TupleLiteral)selffuncvarcrestyZsubty r8   I/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_mixed_tuple_unroller.pycheck   s
    z$TestLiteralTupleInterpretation.checkc                 C   s.   t dd }| | |  | |d d S )Nc                  S   s   d} | d S )N         r<   r8   xr8   r8   r9   foo$   s    zDTestLiteralTupleInterpretation.test_homogeneous_literal.<locals>.foor@   r   assertEqualpy_funcr:   r3   rA   r8   r8   r9   test_homogeneous_literal#   s    
z7TestLiteralTupleInterpretation.test_homogeneous_literalc                 C   s.   t dd }| | |  | |d d S )Nc                  S   s   d} | d S )N)r<   r=   r>   ar>   r8   r?   r8   r8   r9   rA   -   s    zFTestLiteralTupleInterpretation.test_heterogeneous_literal.<locals>.foor@   rB   rE   r8   r8   r9   test_heterogeneous_literal,   s    
z9TestLiteralTupleInterpretation.test_heterogeneous_literalc              	   C   sV   t dd }| | |  | t}| |d W 5 Q R X | dt|j d S )Nc                  S   s   d} | d S )N)r<   r=   r>   rG                 ?   r8   r?   r8   r8   r9   rA   6   s    z<TestLiteralTupleInterpretation.test_non_literal.<locals>.foor@   r*   )	r   rC   rD   assertRaisesAssertionErrorr:   assertInstr	exception)r3   rA   er8   r8   r9   test_non_literal5   s    
z/TestLiteralTupleInterpretation.test_non_literalN)__name__
__module____qualname__r:   rF   rH   rQ   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   s   t |  d S Nr   __init__r3   r8   r8   r9   rY   F   s    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)rR   rS   rT   _namerY   r^   r8   r8   r8   r9   rV   B   s   rV   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  rL|td |td rh|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   rV   r   r   r   r"   r    finalize)r3   pmuse_canonicaliseruse_partial_typingr8   r9   define_pipelinesU   s(    zKTestLoopCanonicalisation.get_pipeline.<locals>.NewCompiler.define_pipelinesN)rR   rS   rT   rl   r8   ri   r8   r9   NewCompilerS   s   rm   r   )rj   rk   rm   r8   ri   r9   get_pipelineR   s    $z%TestLoopCanonicalisation.get_pipelineTc                    s    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                    sP   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   rA      s    
zQTestLoopCanonicalisation.test_simple_loop_in_depth.<locals>.get_info.<locals>.foor;   r   preserved_irr   rC   rD   r+   r,   metadatar-   pipelinerA   r@   r6   func_irrZ   r8   r9   get_info   s    

zDTestLoopCanonicalisation.test_simple_loop_in_depth.<locals>.get_infoc                    s,   t t| j}t t|j} || d S rW   r#   r$   blocksrC   rG   bZa_cfgZb_cfgrZ   r8   r9   compare_cfg   s    zGTestLoopCanonicalisation.test_simple_loop_in_depth.<locals>.compare_cfgr>   c                    s    fdd| j  D S )Nc                    s&   g | ]}t |tjr|j kr|qS r8   r0   r   ZExprop.0r@   r   r8   r9   
<listcomp>   s     
zYTestLoopCanonicalisation.test_simple_loop_in_depth.<locals>.find_getX.<locals>.<listcomp>r\   keysfdr   r8   r   r9   	find_getX   s    zETestLoopCanonicalisation.test_simple_loop_in_depth.<locals>.find_getXgetiterr<   getitemr   NLoopIgnoringCompilerLoopCanonicalisingCompilerrC   lenr\   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   rZ   r9   test_simple_loop_in_depth~   s(    



z2TestLoopCanonicalisation.test_simple_loop_in_depthc                    s    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 )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 )Nrp   c                  S   s   d} dD ]}| |7 } q| S Nr   r;   r8   rs   rt   r8   r8   r9   rA      s    
zLTestLoopCanonicalisation.test_transform_scope.<locals>.get_info.<locals>.foor   ru   rv   )ry   rA   r6   rz   rZ   r8   r9   r{      s    

z?TestLoopCanonicalisation.test_transform_scope.<locals>.get_infoc                    s,   t t| j}t t|j} || d S rW   r|   r~   rZ   r8   r9   r      s    zBTestLoopCanonicalisation.test_transform_scope.<locals>.compare_cfgr>   c                    s    fdd| j  D S )Nc                    s&   g | ]}t |tjr|j kr|qS r8   r   r   r   r8   r9   r      s     
zTTestLoopCanonicalisation.test_transform_scope.<locals>.find_getX.<locals>.<listcomp>r   r   r8   r   r9   r      s    z@TestLoopCanonicalisation.test_transform_scope.<locals>.find_getXr   r<   r   r   Nr   r   r8   rZ   r9   test_transform_scope   s(    



z-TestLoopCanonicalisation.test_transform_scopez-Waiting for pass to be enabled for all tuplesc                    s    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 qdS )zT This heavily checks a typed transformation only impacts tuple
        induced loopsc                    sP   t | ddd }d} |||| |j|jd  }|jd }||jfS )Nrp   c                 S   s6   d}t dD ]$}| D ]}t dD ]}|d7 }q qq|S Nr   rJ   r>   r<   rangerr   rs   rt   yjr8   r8   r9   rA      s    zYTestLoopCanonicalisation.test_influence_of_typed_transform.<locals>.get_info.<locals>.foor;   r   rz   rv   rx   rZ   r8   r9   r{      s    

zLTestLoopCanonicalisation.test_influence_of_typed_transform.<locals>.get_infoc                    s,   t t| j}t t|j} || d S rW   r|   r~   rZ   r8   r9   r     s    zOTestLoopCanonicalisation.test_influence_of_typed_transform.<locals>.compare_cfgr>   c                    s    fdd| j  D S )Nc                    s&   g | ]}t |tjr|j kr|qS r8   r   r   r   r8   r9   r     s     
zaTestLoopCanonicalisation.test_influence_of_typed_transform.<locals>.find_getX.<locals>.<listcomp>r   r   r8   r   r9   r     s    zMTestLoopCanonicalisation.test_influence_of_typed_transform.<locals>.find_getXr   r   r<   r   Nr   TypedLoopCanonicalisingCompilerrC   r   r\   r   r   r   r/   r0   r   r   r3   r{   r   r   r   r   r   r   r   r   r   r@   r   r8   rZ   r9   !test_influence_of_typed_transform   s*    



z:TestLoopCanonicalisation.test_influence_of_typed_transformc                    s    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 qdS )za This heavily checks a typed transformation only impacts loops with
        literal_unroll markerc                    sP   t | ddd }d} |||| |j|jd  }|jd }||jfS )Nrp   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   rA   6  s    zhTestLoopCanonicalisation.test_influence_of_typed_transform_literal_unroll.<locals>.get_info.<locals>.foor;   r   ru   rv   rx   rZ   r8   r9   r{   5  s    

z[TestLoopCanonicalisation.test_influence_of_typed_transform_literal_unroll.<locals>.get_infoc                    s,   t t| j}t t|j} || d S rW   r|   r~   rZ   r8   r9   r   K  s    z^TestLoopCanonicalisation.test_influence_of_typed_transform_literal_unroll.<locals>.compare_cfgr>   c                    s    fdd| j  D S )Nc                    s&   g | ]}t |tjr|j kr|qS r8   r   r   r   r8   r9   r   Z  s     
zpTestLoopCanonicalisation.test_influence_of_typed_transform_literal_unroll.<locals>.find_getX.<locals>.<listcomp>r   r   r8   r   r9   r   Y  s    z\TestLoopCanonicalisation.test_influence_of_typed_transform_literal_unroll.<locals>.find_getXr   r   r<   r   Nr   r   r8   rZ   r9   0test_influence_of_typed_transform_literal_unroll1  s*    



zITestLoopCanonicalisation.test_influence_of_typed_transform_literal_unrollc                    s^    fdd}| j \}}| j\}} fdd}|||  t|jd t|j dS )ro   c                    sP   t | ddd }d} |||| |j|jd  }|jd }||jfS )Nrp   c                 S   s^   d}| D ]:}||7 }| d D ]}|d| 7 }|dkr qq|d8 }q| D ]}||d 8 }qH|S )Nr   )rJ         r<   r   r=   r8   )rr   rs   rt   r   r8   r8   r9   rA   t  s    
zJTestLoopCanonicalisation.test_lots_of_loops.<locals>.get_info.<locals>.foor;   r   ru   rv   rx   rZ   r8   r9   r{   s  s    

z=TestLoopCanonicalisation.test_lots_of_loops.<locals>.get_infoc                    s,   t t| j}t t|j} || d S rW   r|   r~   rZ   r8   r9   r     s    z@TestLoopCanonicalisation.test_lots_of_loops.<locals>.compare_cfg	   Nr   r   rC   r   r\   r3   r{   r   r   r   r   r   r8   rZ   r9   test_lots_of_loopso  s    
z+TestLoopCanonicalisation.test_lots_of_loopsc                    s^    fdd}| j \}}| j\}} fdd}|||  t|jd t|j dS )z( Checks a loop appearing from a closure c                    sP   t | ddd }d} |||| |j|jd  }|jd }||jfS )Nrp   c                 S   s.   dd }d}| D ]}||7 }|||7 }q|S )Nc                 S   s   d}t | D ]}|d7 }q|S Nr   r<   r   )nrs   rt   r8   r8   r9   bar  s    
zWTestLoopCanonicalisation.test_inlined_loops.<locals>.get_info.<locals>.foo.<locals>.barr   r8   )rr   r   rs   rt   r8   r8   r9   rA     s    zJTestLoopCanonicalisation.test_inlined_loops.<locals>.get_info.<locals>.foor;   r   ru   rv   rx   rZ   r8   r9   r{     s    

z=TestLoopCanonicalisation.test_inlined_loops.<locals>.get_infoc                    s,   t t| j}t t|j} || d S rW   r|   r~   rZ   r8   r9   r     s    z@TestLoopCanonicalisation.test_inlined_loops.<locals>.compare_cfgr   Nr   r   r8   rZ   r9   test_inlined_loops  s    
z+TestLoopCanonicalisation.test_inlined_loopsN)F)rR   rS   rT   rn   r   r   r   r   r   r   skipr   r   r   r   r8   r8   r8   r9   r`   P   s   
(
::
>>
.r`   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   s2   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 rL|d8 }q( qRq(|S 	N   ffffff)@              @rJ   r=   r      r<   r   r   r	   real)idxzrG   rs   rt   r8   r8   r9   rA     s    

z)TestMixedTupleUnroll.test_01.<locals>.foor   r=   r   rC   rD   r3   rA   fkr8   r8   r9   test_01  s
    
zTestMixedTupleUnroll.test_01c                 C   s2   t dd }d}|}| |d||d| d S )Nc                 S   sJ   dddd|d| f}d}t |D ]$}||7 }|jdk r@|d8 }q  qFq |S r   r	   r   )r   r   r@   rs   rG   r8   r8   r9   rA     s    

z)TestMixedTupleUnroll.test_02.<locals>.foor   r=   r   r   r8   r8   r9   test_02  s
    
zTestMixedTupleUnroll.test_02c                 C   s2   t dd }d}|}| |d||d| d S )Nc                 S   sr   dddd|d| f}d|d| f}d}t |D ]>}||7 }|jdk rN|d	8 }q.t |D ]}||d
k7 }qV qnq.|S )Nr   r   r   rJ   r=   rA   r   r   r<   Fr   )r   r   r@   r   rs   rG   tr8   r8   r9   rA     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 rq   r	   sumrr   rs   rG   r8   r8   r9   rA     s    z)TestMixedTupleUnroll.test_04.<locals>.foor'   r   nponesrC   rD   r3   rA   r   rr   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 ]}|dkr*||d  7 }q|dkrD||d  7 }q|dkr^||d  7 }q|dkrx||d  7 }q|d	kr||d
  7 }qtdq|S )Nr   rG   r   r<   cr=   r   r>   r   rJ   ZUnreachable)r	   r   RuntimeErrortup1tup2rs   rG   r8   r8   r9   rA     s    
z)TestMixedTupleUnroll.test_05.<locals>.foor'   )rG   r   r   r   r   r   )r3   rA   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r2|| q||7 }q|S )Nr   rG   )r   ListZ
empty_listr   Zunicode_typer	   append)rr   rs   Zstr_bufrG   r8   r8   r9   rA   7  s    
z)TestMixedTupleUnroll.test_06.<locals>.foo)rG   r   r   )r3   rA   rr   r8   r8   r9   test_063  s    

zTestMixedTupleUnroll.test_06c              
   C   sV   t dd }d}t|ft||fdddddd	d
dhf}| |||| d S )Nc                 S   s"   d}t | D ]}|t|7 }q|S rq   r	   r   r   r8   r8   r9   rA   G  s    z)TestMixedTupleUnroll.test_07.<locals>.foor'   
ABCDEFGHJIr;   r<   rA   r=   r   r>   rJ   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 ]J}|dkr(||d  7 }q|dkr@||d  7 }q|dkr||d  7 }q|S )Nr   rG   r   r<   r   r=   r	   r   r8   r8   r9   rA   V  s    z)TestMixedTupleUnroll.test_08.<locals>.fooc                    s    fdd}t |S )Nc                      s    S rW   r8   r8   r?   r8   r9   implc  s    z7TestMixedTupleUnroll.test_08.<locals>.gen.<locals>.implr   )r@   r   r8   r?   r9   genb  s    z)TestMixedTupleUnroll.test_08.<locals>.gen)rG   r   r   r   r   )r   r<   r=   r>   r   )r3   rA   r   r   r   r8   r8   r9   test_08S  s    
zTestMixedTupleUnroll.test_08c              	   C   sp   t dd }t dd }t dd }t dd }d	}d
}| tj}||| W 5 Q R X | tt|j d S )Nc                 S   sf   d}d}t | D ]L}|dkr*||| 7 }n*|dkr@||| 7 }n|dkrT||| 7 }|d7 }q||fS )Nr   rG   r   r   r<   r   )r   r   rs   r   rG   r8   r8   r9   rA   n  s    
z)TestMixedTupleUnroll.test_09.<locals>.fooc                   S   s   dS Nr<   r8   r8   r8   r8   r9   func1|  s    z+TestMixedTupleUnroll.test_09.<locals>.func1c                   S   s   dS Nr=   r8   r8   r8   r8   r9   func2  s    z+TestMixedTupleUnroll.test_09.<locals>.func2c                   S   s   dS Nr>   r8   r8   r8   r8   r9   func3  s    z+TestMixedTupleUnroll.test_09.<locals>.func3)rG   r   r   )rI   r<   r=   r   rK   r   TypingErrorrM   r%   rN   rO   )r3   rA   r   r   r   r   r   raisesr8   r8   r9   test_09k  s    



zTestMixedTupleUnroll.test_09c                    sB   dd  t  dddd }t fdd}| | |  d S )	Nc                 S   s8   | dkrdS | dkrdS | dkr$dS | dkr4d|  S d S 	Nappler<   oranger=   bananar>      +# \r8   r   r8   r8   r9   dt  s    z(TestMixedTupleUnroll.test_10.<locals>.dtalwaysinlinec                    sx   t | tjrJ| j  dkr$dd }n" dkr6dd }n dkrFdd }|S t | tjrt| j  dkrt fd	d}|S d S )
Nr   c                 S   s   dS r   r8   lir8   r8   r9   r     s    z9TestMixedTupleUnroll.test_10.<locals>.ol_dt.<locals>.implr   c                 S   s   dS r   r8   r   r8   r8   r9   r     s    r   c                 S   s   dS r   r8   r   r8   r8   r9   r     s    r   c                    s   d  S Nr   r8   r   r   r8   r9   r     s    r0   r   StringLiteralliteral_valueIntegerLiteralr   r   r8   r   r9   ol_dt  s    

z+TestMixedTupleUnroll.test_10.<locals>.ol_dtc                     s"   d} t dD ]}|  |7 } q| S )Nr   )r   r   r   r   r   rs   r   r   r8   r9   rA     s    z)TestMixedTupleUnroll.test_10.<locals>.foor   r   rC   rD   r3   r  rA   r8   r  r9   test_10  s    


zTestMixedTupleUnroll.test_10c                 C   s"   t dd }| | |  d S )Nc                  S   sd   g } d}t tt|D ]F}|| }|dkr8| d q|dkrL| | q|dkr| d q| S N)r   r   r   r   0r   r   2.0r   r   r	   r   r@   r   rt   r   r8   r8   r9   rA     s    z)TestMixedTupleUnroll.test_11.<locals>.foor   rE   r8   r8   r9   test_11  s    
zTestMixedTupleUnroll.test_11c                 C   s"   t dd }| | |  d S )Nc                  S   sh   t  } d}ttt|D ]F}|| }|dkr<| d q|dkrP| | q|dkr| d q| S r
  )r   r   r   r   r	   r   r  r8   r8   r9   rA     s    z*TestMixedTupleUnroll.test_11a.<locals>.foor   rE   r8   r8   r9   test_11a  s    
zTestMixedTupleUnroll.test_11ac                 C   s2   t dd }d}|}| |d||d| d S )Nc                 S   st   dddd|d| f}d}t |D ]:}||7 }|jdk r@|d8 }q t |D ]}||7 }qH q\q |d d	k rp|d7 }|S 
Nr   r   r   rJ   r=   r   r   r<      r   r   r   rG   rs   rt   r@   r8   r8   r9   rA     s    


z)TestMixedTupleUnroll.test_12.<locals>.foor   r=   r   r   r8   r8   r9   test_12  s
    
zTestMixedTupleUnroll.test_12c              	   C   sL   t dd }d}|}| tj}|d| W 5 Q R X | dt|j d S )Nc                 S   s   dddd|d| f}d}t |D ]b}||7 }|jdk r@|d8 }n,t |D ]"}t |D ]}||7 }qT||7 }qHt |D ]}||7 }qtq t |D ]}||7 }q|d d	k r|d7 }|S r  r   )r   r   rG   rs   rt   r@   r   r8   r8   r9   rA     s"    




z)TestMixedTupleUnroll.test_13.<locals>.foor   r=   (Nesting of literal_unroll is unsupportedr   rK   r   UnsupportedErrorrM   rN   rO   r3   rA   r   r   r   r8   r8   r9   test_13  s    
zTestMixedTupleUnroll.test_13c                 C   s"   t dd }| | |  d S )Nc                  S   s"   d} d}t | D ]}||7 }q|S )Nr<   r=   r>   rJ   r   r   r@   rs   rG   r8   r8   r9   rA     s
    
z)TestMixedTupleUnroll.test_14.<locals>.foor   rE   r8   r8   r9   test_14  s    
zTestMixedTupleUnroll.test_14c              
   C   sr   t dd }d}t|ft||fddddddd	d
hf}| tj}|| W 5 Q R X | dt|j d S )Nc                 S   s"   d}t | D ]}|t|7 }q|S rq   r   r  r8   r8   r9   rA   '  s    z)TestMixedTupleUnroll.test_15.<locals>.foor   r   r;   r   r>   rJ   r   r   Cannot unify)	r   r   r   rK   r   r   rM   rN   rO   )r3   rA   r   rr   r   r8   r8   r9   test_15$  s    
 zTestMixedTupleUnroll.test_15c                    sB   dd  t  dddd }t fdd}| | |  d S )	Nc                 S   s4   | dkrdS | dkrdS | dkr$dS | dkr0dS d S )	N  rG     r     r     dr8   r   r8   r8   r9   r   :  s    z(TestMixedTupleUnroll.test_16.<locals>.dtr   r   c                 S   s`   t | tjr\| j}|dkr$dd }n4|dkr6dd }n"|dkrHdd }n|dkrXd	d }|S d S )
Nr  c                 S   s   dS NrG   r8   r   r8   r8   r9   r   I  s    z9TestMixedTupleUnroll.test_16.<locals>.ol_dt.<locals>.implr   c                 S   s   dS Nr   r8   r   r8   r8   r9   r   L  s    r!  c                 S   s   dS Nr   r8   r   r8   r8   r9   r   O  s    r"  c                 S   s   dS Nr#  r8   r   r8   r8   r9   r   R  s    )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)r  r   r!  r"   r=   r   r  r  r8   r9   rA   V  s
    z)TestMixedTupleUnroll.test_16.<locals>.foor  r  r8   r  r9   test_167  s    


zTestMixedTupleUnroll.test_16c                    sB   dd  t  dddd }t fdd}| | |  d S )	Nc                 S   s@   | dkrdS | dkrdS | dkr$dS | dkr0dS | d	kr<d
S d S )Nr  rG   r   r   r!  r   r"  r#  r   EFFr8   r   r8   r8   r9   r   c  s    z(TestMixedTupleUnroll.test_17.<locals>.dtr   r   c                 S   s   t | tjr\| j}|dkr$dd }n4|dkr6dd }n"|dkrHdd }n|dkrXd	d }|S t | tjr| j}|d
krdd }|S d S )Nr  c                 S   s   dS r$  r8   r   r8   r8   r9   r   t  s    z9TestMixedTupleUnroll.test_17.<locals>.ol_dt.<locals>.implr   c                 S   s   dS r%  r8   r   r8   r8   r9   r   w  s    r!  c                 S   s   dS r&  r8   r   r8   r8   r9   r   z  s    r"  c                 S   s   dS r'  r8   r   r8   r8   r9   r   }  s    r   c                 S   s   dS )Nr+  r8   r   r8   r8   r9   r     s    )r0   r   r  r  r   r(  r8   r8   r9   r  o  s     


z+TestMixedTupleUnroll.test_17.<locals>.ol_dtc                     s.   d} d}t | dd  D ]}| |7 }q|S )N)r  r   r!  r   r)  r<   r   r  r  r8   r9   rA     s
    z)TestMixedTupleUnroll.test_17.<locals>.foor  r  r8   r  r9   test_17`  s    

zTestMixedTupleUnroll.test_17c                 C   s"   t dd }| | |  d S )Nc                  S   s8   d} d}t | d d d D ]}|d7 }|dk r q4q|S )N)r  r   r!  r"  i  ip  r   r<   r!  r   )r@   countrG   r8   r8   r9   rA     s    z)TestMixedTupleUnroll.test_18.<locals>.foor   rE   r8   r8   r9   test_18  s    
	zTestMixedTupleUnroll.test_18c                 C   s"   t dd }| | |  d S )Nc                  S   sd   d} ddddg}ddg}||f}t d}t jdt jd	}||||f}t|D ]}| t|7 } qN| S 
Nr   r<   r=   r>   rJ   r'      r   Zdtyper   aranger   
complex128r	   r   rs   l1l2rr   a1a2r   r8   r8   r9   rA     s    
z)TestMixedTupleUnroll.test_19.<locals>.foor   rE   r8   r8   r9   test_19  s    
zTestMixedTupleUnroll.test_19c                 C   s"   t dd }| | |  d S )Nc                  S   sF   g } t d}t jdt jd}||f}t|D ]}| |  q.| S )Nr1  r   r2  )r   r4  r   r5  r	   r   r   )lr9  r:  rr   r   r8   r8   r9   rA     s    
z)TestMixedTupleUnroll.test_20.<locals>.foor   rE   r8   r8   r9   test_20  s    
	zTestMixedTupleUnroll.test_20c                 C   s.   t dd }d}|}| |||| d S )Nc                    s0   d  fdd}d}dD ]}|| | 7 }q|S )Nr  gfffff7@y              @   c                     s   d} t  D ]}| |7 } q| S rq   r   rs   r   r   r8   r9   r     s    
z6TestMixedTupleUnroll.test_21.<locals>.foo.<locals>.barr   r  r8   r   r   Z	outer_accr@   r8   rA  r9   rA     s    z)TestMixedTupleUnroll.test_21.<locals>.foor   r   r   r8   r8   r9   test_21  s
    
zTestMixedTupleUnroll.test_21c                 C   s.   t dd }d}|}| |||| d S )Nc                    sD   dddd| d|  f}d  fdd}d	}t |D ]}|| 7 }q0|S )
Nr   r   r   rJ   r=   r>  c                     s   d} t  D ]}| |7 } q| S rq   r   r@  rA  r8   r9   r     s    
z6TestMixedTupleUnroll.test_22.<locals>.foo.<locals>.barr   r   )r   rG   r   rs   r@   r8   rA  r9   rA     s    z)TestMixedTupleUnroll.test_22.<locals>.foor   r   r   r8   r8   r9   test_22  s
    
zTestMixedTupleUnroll.test_22c              	   C   sJ   t dd }d}|}| tj}|| W 5 Q R X | dt|j d S )Nc                    s4   d  fdd}d}t  D ]}|| | 7 }q|S )Nr>  c                     s   d} t  D ]}| |7 } q| S rq   r   r@  rA  r8   r9   r     s    
z6TestMixedTupleUnroll.test_23.<locals>.foo.<locals>.barr   r   rB  r8   rA  r9   rA     s    z)TestMixedTupleUnroll.test_23.<locals>.foor   r  r  r  r8   r8   r9   test_23  s    
zTestMixedTupleUnroll.test_23c              	   C   sD   t dd }| tj}|  W 5 Q R X d}| |t|j d S )Nc                  S   s   t dD ]} t|  qd S )NZABCDEr	   printr?   r8   r8   r9   rA   
  s    z)TestMixedTupleUnroll.test_24.<locals>.fooz7argument should be a tuple or a list of constant valuesr  )r3   rA   r   msgr8   r8   r9   test_24  s    
zTestMixedTupleUnroll.test_24c                 C   s"   t dd }| | |  d S )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lensr@   r8   r8   r9   rA     s    z)TestMixedTupleUnroll.test_25.<locals>.foor   rE   r8   r8   r9   test_25  s    
	zTestMixedTupleUnroll.test_25c                 C   s.   t dd }d}|}| |||| d S )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 }|| }qB|||||fS )Nr   r   r   rJ   r=   r   6      r2  r<   )r   emptyr   r5  r	   )	r   rG   rs   r.  Z	untouchedZ	read_onlyZmutatedr@   escaper8   r8   r9   rA   (  s    
z)TestMixedTupleUnroll.test_26.<locals>.foor   )r   ZassertPreciseEqualrD   r   r8   r8   r9   test_26#  s
    
zTestMixedTupleUnroll.test_26c                 C   s4   t dddd }d}|}| |||| d S )NTparallelc                 S   s@   dddd| d|  f}d}t |D ]}tdD ]}|d7 }q,q |S )	Nr   r   r   rJ   r=   r   r'   r<   r	   r
   r   rG   rs   r@   r   r8   r8   r9   rA   ?  s    z)TestMixedTupleUnroll.test_27.<locals>.foor   r   r   r8   r8   r9   test_27<  s
    
zTestMixedTupleUnroll.test_27c                 C   s6   t dddd }d}|}tj|||| d S )NTrR  c                 S   s@   dddd| d|  f}d}t |D ]}tdD ]}||7 }q,q |S Nr   r   r   rJ   r=   r   r'   rT  rU  r8   r8   r9   rA   P  s    z)TestMixedTupleUnroll.test_28.<locals>.foor   )r   r   ZtestingZassert_allcloserD   r   r8   r8   r9   test_28M  s
    
zTestMixedTupleUnroll.test_28c                 C   s4   t dddd }d}|}| |||| d S )NTrR  c                 S   s@   dddd| d|  f}d}t dD ]}t|D ]}||7 }q,q |S rW  )r
   r	   )r   rG   rs   r   r@   r8   r8   r9   rA   c  s    z)TestMixedTupleUnroll.test_29.<locals>.foor   r   r   r8   r8   r9   test_29_  s
    
zTestMixedTupleUnroll.test_29c                 C   s"   t dd }| | |  d S )Nc                     s$   d  fdd} dd t | dD S )N  c                    s*   d}d}t |D ]}||  7 }q|| fS Nr   )r   r   r   rJ   r   r   rs   rG   r@   constr8   r9   r   w  s
    z6TestMixedTupleUnroll.test_30.<locals>.foo.<locals>.barc                 S   s   g | ]}|qS r8   r8   r   r8   r8   r9   r   }  s     z=TestMixedTupleUnroll.test_30.<locals>.foo.<locals>.<listcomp>)r<   r=   mapr   r8   r]  r9   rA   s  s    z)TestMixedTupleUnroll.test_30.<locals>.foor   rE   r8   r8   r9   test_30q  s    
zTestMixedTupleUnroll.test_30c              	   C   sR   t dd }| tj}|  W 5 Q R X | tt|j | dt|j d S )Nc                     s$   d  fdd} dd t | dD S )NrZ  c                    s*   d}d}t |D ]}||  7 }q|| fS r[  r   r\  r]  r8   r9   r     s
    z6TestMixedTupleUnroll.test_31.<locals>.foo.<locals>.barc                 S   s   g | ]}|qS r8   r8   r   r8   r8   r9   r     s     z=TestMixedTupleUnroll.test_31.<locals>.foo.<locals>.<listcomp>)r<   rJ  r_  ra  r8   r]  r9   rA     s    z)TestMixedTupleUnroll.test_31.<locals>.foozipr   r3   rA   r   r8   r8   r9   test_31  s    
zTestMixedTupleUnroll.test_31c                    s2   t dd  t  fdd}| | |  d S )Nc                 s   s   t | D ]
}|V  qd S rW   r   rG   r@   r8   r8   r9   r     s    z)TestMixedTupleUnroll.test_32.<locals>.genc                      s   dd  dD S )Nc                 S   s   g | ]}|qS r8   r8   r   r8   r8   r9   r     s     z=TestMixedTupleUnroll.test_32.<locals>.foo.<locals>.<listcomp>r<   gffffff@y              @r8   r8   r   r8   r9   rA     s    z)TestMixedTupleUnroll.test_32.<locals>.foor   rE   r8   rh  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 rW   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   s   t | D ]
}|V  qd S rW   r   rf  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>rg  r8   rh  consr8   r9   rA     s    z6TestMixedTupleUnroll.test_33.<locals>.get.<locals>.foor   )rn  rA   r8   rm  r9   get  s    z)TestMixedTupleUnroll.test_33.<locals>.get)r   rD   rC   )r3   rk  ro  ZcfuncZpyfuncr8   r8   r9   test_33  s    
	zTestMixedTupleUnroll.test_33c              	   C   sR   t dd }| tj}|  W 5 Q R X | dt|j | dt|j d S )Nc                  S   sr   d} ddddg}ddg}| d dkr.||f}n&t d}t jdt jd	}||||f}t|D ]}| t|7 } q\| S r0  r3  r6  r8   r8   r9   rA     s    

z)TestMixedTupleUnroll.test_34.<locals>.foozInvalid use ofz&found multiple definitions of variabler  rd  r8   r8   r9   test_34  s    
zTestMixedTupleUnroll.test_34N))rR   rS   rT   r   r   r   r   r   r   r   r   r   r   r   r	  r  r  r  r  r  r  r*  r,  r/  r;  r=  rC  rD  rE  rI  rL  rQ  r   rV  rX  rY  rb  re  ri  rp  rq  r8   r8   r8   r9   r     sN   
%, )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   s"   t dd }| | |  d S )Nc                  S   sN   ddddg} d}t tt| D ](}|| | 7 }|jdk rD|d8 }q  qJq |S Nr   r   r   rJ   r   r   r<   r   )rG   rs   rt   r8   r8   r9   rA     s    

z(TestConstListUnroll.test_01.<locals>.foor   rE   r8   r8   r9   r     s    
zTestConstListUnroll.test_01c                 C   s"   t dd }| | |  d S )Nc                  S   sB   ddddg} d}t | D ]$}||7 }|jdk r8|d8 }q q>q|S rs  r   r  r8   r8   r9   rA     s    

z(TestConstListUnroll.test_02.<locals>.foor   rE   r8   r8   r9   r     s    
zTestConstListUnroll.test_02c                 C   s"   t dd }| | |  d S )Nc                  S   sd   ddddg} ddg}d}t | D ]>}||7 }|jdk r@|d	8 }q t |D ]}||d
k7 }qH q`q |S )Nr   r   r   rJ   rA   r?  r   r   r<   Fr   r@   r   rs   rG   r   r8   r8   r9   rA     s    

z(TestConstListUnroll.test_03.<locals>.foor   rE   r8   r8   r9   r     s    
zTestConstListUnroll.test_03c                 C   s"   t dd }| | |  d S )Nc                  S   s`   ddddg} d}d}t | D ]>}||7 }|jdk r<|d8 }qt |D ]}||d	k7 }qD q\q|S )
Nr   r   r   rJ   )rA   r?  r   r   r<   Fr   rt  r8   r8   r9   rA     s    

z(TestConstListUnroll.test_04.<locals>.foor   rE   r8   r8   r9   r   	  s    
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 5 Q R X 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   rA     s
    z(TestConstListUnroll.test_05.<locals>.foor'   z6Invalid use of literal_unroll with a function argument)
r   r   zerosr   rK   r   r  rM   rN   rO   )r3   rA   r   r   r   r   rH  r8   r8   r9   r     s    
$ zTestConstListUnroll.test_05c              	   C   s@   t dd }| tj}|  W 5 Q R X | dt|j d S )Nc               
   S   sR   d} t | ft | | fdddddddd	hg}d
}t|D ]}|t|7 }q<|S )Nr'   r   r;   r   r>   rJ   r   r   r   r   )r   r   r	   r   )r   rr   rs   rG   r8   r8   r9   rA   3  s     z(TestConstListUnroll.test_06.<locals>.fooz&Found non-constant value at position 0r  rd  r8   r8   r9   r   1  s    
	zTestConstListUnroll.test_06c                    sB   dd  t  dddd }t fdd}| | |  d S )	Nc                 S   s8   | dkrdS | dkrdS | dkr$dS | dkr4d|  S d S r   r8   r   r8   r8   r9   r   F  s    z&TestConstListUnroll.test_7.<locals>.dtr   r   c                    sx   t | tjrJ| j  dkr$dd }n" dkr6dd }n dkrFdd }|S t | tjrt| j  dkrt fd	d}|S d S )
Nr   c                 S   s   dS r   r8   r   r8   r8   r9   r   U  s    z7TestConstListUnroll.test_7.<locals>.ol_dt.<locals>.implr   c                 S   s   dS r   r8   r   r8   r8   r9   r   X  s    r   c                 S   s   dS r   r8   r   r8   r8   r9   r   [  s    r   c                    s   d  S r   r8   r   r   r8   r9   r   a  s    r   r  r8   r   r9   r  P  s    

z)TestConstListUnroll.test_7.<locals>.ol_dtc                     s*   d} t ddddgD ]}|  |7 } q| S )Nr   r   r   r   r   r   r  r  r8   r9   rA   f  s    z'TestConstListUnroll.test_7.<locals>.foor  r  r8   r  r9   test_7C  s    


zTestConstListUnroll.test_7c                 C   s"   t dd }| | |  d S )Nc                  S   sj   g } dddg}t tt|D ]F}|| }|dkr>| d q|dkrR| | q|dkr| d q| S )Nr   r   r   r  r  r  r  r8   r8   r9   rA   q  s    
z'TestConstListUnroll.test_8.<locals>.foor   rE   r8   r8   r9   test_8o  s    
zTestConstListUnroll.test_8c                 C   s2   t dd }d}|}| |d||d| d S )Nc                 S   sl   ddddg}d}t |D ]:}||7 }|jdk r8|d8 }qt |D ]}||7 }q@ qTq|d dk rh|d	7 }|S )
Nr   r   r   rJ   r   r   r<   r  r=   r   r  r8   r8   r9   rA     s    


z'TestConstListUnroll.test_9.<locals>.foor   r=   r   r   r8   r8   r9   test_9  s
    
zTestConstListUnroll.test_9c              	   C   sL   t dd }d}|}| tj}|d| W 5 Q R X | dt|j d S )Nc                 S   s   dddd|d| f}ddddg}d}t |D ]b}||7 }|jdk rL|d8 }n,t |D ]"}t |D ]}||7 }q`||7 }qTt |D ]}||7 }qq,t |D ]}||7 }q|d d	k r|d7 }|S r  r   )r   r   rG   r   rs   rt   r@   r   r8   r8   r9   rA     s$    




z(TestConstListUnroll.test_10.<locals>.foor   r=   r  r  r  r8   r8   r9   r	    s    
zTestConstListUnroll.test_10c                 C   s"   t dd }| | |  d S )Nc                  S   s*   ddddg} d}t | D ]}||7 }q|S )Nr<   r=   r>   rJ   r   r   r  r8   r8   r9   rA     s
    
z(TestConstListUnroll.test_11.<locals>.foor   rE   r8   r8   r9   r    s    
zTestConstListUnroll.test_11c              	   C   s@   t dd }| tj}|  W 5 Q R X | dt|j d S )Nc                  S   s,   d} dddg}t |D ]}| t|7 } q|S )Nr   r<   r=   rG   )r	   bool)rs   r@   rG   r8   r8   r9   rA     s
    
z(TestConstListUnroll.test_12.<locals>.foor  r   rK   r   r   rM   rN   rO   rd  r8   r8   r9   r    s
    
zTestConstListUnroll.test_12c              	   C   s@   t dd }| tj}|  W 5 Q R X | dt|j d S )Nc                  S   s2   ddddg} d}t | d d D ]}||7 }q |S )Nr  r   r!  r"  r   r=   r   r  r8   r8   r9   rA     s
    
z(TestConstListUnroll.test_13.<locals>.foozInvalid use of literal_unrollr  rd  r8   r8   r9   r    s
    
zTestConstListUnroll.test_13c              	   C   s@   t dd }| tj}|  W 5 Q R X | dt|j d S )Nc                  S   s4   ddddg} d}t | D ]}||7 }q| d |S )Nr  r   r!  r"  r   r'   )r	   r   r  r8   r8   r9   rA     s    

z(TestConstListUnroll.test_14.<locals>.fooz(Unknown attribute 'append' of type Tuplerz  rd  r8   r8   r9   r    s    
zTestConstListUnroll.test_14N)rR   rS   rT   r   r   r   r   r   r   rv  rw  rx  r	  r  r  r  r  r8   r8   r8   r9   rr    s   ,!rr  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'S )(TestMorec              	   C   s@   t dd }| tj}|  W 5 Q R X | dt|j d S )Nc                  S   s$   d} d}t | | D ]}||7 }q|S )N)r'   r1  r   r   r@   rrG   r8   r8   r9   rA     s
    
z2TestMore.test_invalid_use_of_unroller.<locals>.fooz*literal_unroll takes one argument, found 2r  rd  r8   r8   r9   test_invalid_use_of_unroller  s    
z%TestMore.test_invalid_use_of_unrollerc              	   C   sB   t dd }| tj}|d W 5 Q R X | dt|j d S )Nc                 S   s&   d| g}d}t |D ]}||7 }q|S Nr'   r   r   r   r@   r}  rG   r8   r8   r9   rA     s
    
z,TestMore.test_non_constant_list.<locals>.foor'   zKFound non-constant value at position 1 in a list argument to literal_unrollr  rd  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   rA   !  s
    
z2TestMore.test_literally_constant_list.<locals>.foor   c                      s    dS Nr   r8   r8   rA   r8   r9   r   -  s    z2TestMore.test_literally_constant_list.<locals>.bar)numbar  r   r3   r   r8   )rA   r  r9   test_literally_constant_list  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   s&   d| g}d}t |D ]}||7 }q|S r  r   r  r8   r8   r9   rA   7  s
    
z.TestMore.test_inlined_unroll_list.<locals>.fooc                      s    dS r  r8   r8   r  r8   r9   r   ?  s    z.TestMore.test_inlined_unroll_list.<locals>.bar   )r   rC   r  r8   r  r9   test_inlined_unroll_list5  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   rA   F  s
    
z+TestMore.test_unroll_tuple_arg.<locals>.foor   333333?r   rE   r8   r8   r9   test_unroll_tuple_argE  s    
zTestMore.test_unroll_tuple_argc                 C   s<   t dd }| |d|d | |d|d d S )Nc                 S   s   d}t | D ]}||7 }q|S rq   r   r|  r8   r8   r9   rA   R  s    
z,TestMore.test_unroll_tuple_arg2.<locals>.foo)r   r  r   rE   r8   r8   r9   test_unroll_tuple_arg2Q  s    
zTestMore.test_unroll_tuple_arg2c                 C   s"   t dd }| | |  d S )Nc                  S   s2   d} d}t | D ]}|}|}||| | 7 }q|S )Nr'   r  r   r   )r@   outrt   r   r   r8   r8   r9   rA   ]  s    z-TestMore.test_unroll_tuple_alias.<locals>.foor   rE   r8   r8   r9   test_unroll_tuple_alias\  s    
	z TestMore.test_unroll_tuple_aliasc              	   C   sV   t dd }| tj}|  W 5 Q R X | dt|j d}| t|j| d S )Nc                  S   s,   d} d}t | D ]}|D ]}||7 }qq|S )N)r  )rI   g      @r   r   )r@   r  rt   r   r8   r8   r9   rA   k  s    z.TestMore.test_unroll_tuple_nested.<locals>.foor   z#.*Tuple\(int[0-9][0-9], float64\).*)r   rK   r   r   rM   rN   rO   ZassertRegexpMatches)r3   rA   r   rer8   r8   r9   test_unroll_tuple_nestedi  s    
z!TestMore.test_unroll_tuple_nestedc              	   C   sH   t dd }t }|  W 5 Q R X |  }| |ddddg d S )Nc                  S   sZ   i } d| d< d| d< i }d|d< d|d< t | |fD ] }| D ]\}}t|| q@q4d S )	Nr<   rG   r=   r   r   r>   r#  rJ   )r	   itemsrG  )r@   r   itr   vr8   r8   r9   rA   }  s    z/TestMore.test_unroll_tuple_of_dict.<locals>.fooza 1zb 2z3 cz4 d)r   r   getvalue
splitlinesrC   )r3   rA   stdoutlinesr8   r8   r9   test_unroll_tuple_of_dict{  s    

z"TestMore.test_unroll_tuple_of_dictc                    s6   t ddddg t fdd}| | |  d S )NABCrG   r   r   c                     s*    ddd} d}t | D ]}||7 }q|S )Nr<   rJ  333333@r   r   abcr  rt   r  r8   r9   rA     s
    
z-TestMore.test_unroll_named_tuple.<locals>.foor   r   rC   rD   rE   r8   r  r9   test_unroll_named_tuple  s    z TestMore.test_unroll_named_tuplec                 C   sB   t ddddg}tdd }|ddd	}| |||| d S )
Nr  rG   r   r   c                 S   s   d}t | D ]}||7 }q|S rq   r   r@   r  rt   r8   r8   r9   rA     s    
z1TestMore.test_unroll_named_tuple_arg.<locals>.foor<   rJ  r  r  r3   r  rA   r  r8   r8   r9   test_unroll_named_tuple_arg  s
    
z$TestMore.test_unroll_named_tuple_argc                    s6   t ddddg t fdd}| | |  d S )Nr  rG   r   r   c                     s*    ddd} d}t | D ]}||7 }q|S )Nr<   r=   r>   r   r   r  r  r8   r9   rA     s
    
z0TestMore.test_unroll_named_unituple.<locals>.foor  rE   r8   r  r9   test_unroll_named_unituple  s    z#TestMore.test_unroll_named_unituplec                 C   sB   t ddddg}tdd }|ddd	}| |||| d S )
Nr  rG   r   r   c                 S   s   d}t | D ]}||7 }q|S rq   r   r  r8   r8   r9   rA     s    
z4TestMore.test_unroll_named_unituple_arg.<locals>.foor<   r=   r>   r  r  r8   r8   r9   test_unroll_named_unituple_arg  s
    
z'TestMore.test_unroll_named_unituple_argc                 C   s"   t dd }| | |  d S )Nc                  S   s   d} t tD ]}| |7 } q| S rq   )r	   	_X_GLOBALr  rt   r8   r8   r9   rA     s    
z.TestMore.test_unroll_global_tuple.<locals>.foor   rE   r8   r8   r9   test_unroll_global_tuple  s    
z!TestMore.test_unroll_global_tuplec                    s*   d t  fdd}| | |  d S )Nr&   c                     s   d} t  D ]}| |7 } q| S rq   r   r  r?   r8   r9   rA     s    
z/TestMore.test_unroll_freevar_tuple.<locals>.foor   rE   r8   r?   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   s   dS r   r8   r8   r8   r8   r9   rG     s    z.TestMore.test_unroll_function_tuple.<locals>.ac                   S   s   dS r   r8   r8   r8   r8   r9   r     s    z.TestMore.test_unroll_function_tuple.<locals>.bc                     s    d} t  D ]}| | 7 } q| S rq   r   )r  r   r?   r8   r9   rA     s    z0TestMore.test_unroll_function_tuple.<locals>.foor   )r3   rG   r   rA   r8   r?   r9   test_unroll_function_tuple  s    

z#TestMore.test_unroll_function_tuplec              	   C   s   t dd }dd tdD }t  | |||| W 5 Q R X t }|| W 5 Q R X |  }| |dddd	g d S )
Nc                 S   sL   d}d}dd | D }d}t |D ] }||| 7 }|d7 }t| q"||fS )Nr   c                 S   s   g | ]}|qS r8   r8   )r   rG   r8   r8   r9   r     s     zCTestMore.test_unroll_indexing_list.<locals>.foo.<locals>.<listcomp>)rG      gq=
ףp?Nr<   rF  )Zcontrt   rs   Znormal_listZheter_tupleitemr8   r8   r9   rA     s    
z/TestMore.test_unroll_indexing_list.<locals>.fooc                 S   s   g | ]}|qS r8   r8   )r   r   r8   r8   r9   r     s     z6TestMore.test_unroll_indexing_list.<locals>.<listcomp>rJ   rG   Z25z0.23None)r   r   r   rC   rD   r  r  )r3   rA   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 rq   )ndimr  Zfreevar_unrollmixedr8   r9   rA     s    z.TestMore.test_unroller_as_freevar.<locals>.foo)r   r   r  r	   r   rC   rD   rE   r8   r  r9   test_unroller_as_freevar  s
    z!TestMore.test_unroller_as_freevarN)rR   rS   rT   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{    s(   

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 argumentFTrU   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   s   t |  d S rW   rX   rZ   r8   r8   r9   rY   &  s    z(capture.<locals>.ResultCapturer.__init__c                    s&      |}|jdi }|| < |S )Nmutation_results)r^   rw   
setdefault)r3   r]   resultr  	real_passr8   r9   r^   )  s    z(capture.<locals>.ResultCapturer.run_passN)rR   rS   rT   r_   Z
_real_passrY   r^   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 rW   )rf   r  )r@   r   rh   r8   r9   rf   8  s    z4CapturingCompiler.define_pipelines.<locals>.add_passra   zfix up argsrb   zhandles literal_unrollrc   z$ensure IR is legal prior to loweringrd   re   )
r   r   r   r   r   r   r   r"   r    rg   )r3   rf   r8   r  r9   rl   5  s    






z"CapturingCompiler.define_pipelinesN)rR   rS   rT   __doc__rl   r8   r8   r8   r9   r  2  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   s@   t tddd }|  |j|jd  }| |jd t  d S )Nrp   c                  S   s   d} dD ]}| |7 } q| S r   r8   r   r8   r8   r9   rA   Q  s    
zLTestLiteralUnrollPassTriggering.test_literal_unroll_not_invoked.<locals>.foor   r  r   r  r+   r,   assertFalserw   r   r3   rA   r6   r8   r8   r9   test_literal_unroll_not_invokedP  s
    
z?TestLiteralUnrollPassTriggering.test_literal_unroll_not_invokedc                 C   s@   t tddd }|  |j|jd  }| |jd t  d S )Nrp   c                  S   s   d} t dD ]}| |7 } q| S r   r   r   r8   r8   r9   rA   ]  s    
zKTestLiteralUnrollPassTriggering.test_literal_unroll_is_invoked.<locals>.foor   r  )r   r  r+   r,   r/   rw   r   r  r8   r8   r9   test_literal_unroll_is_invoked\  s
    
z>TestLiteralUnrollPassTriggering.test_literal_unroll_is_invokedc                    sH   t  ttd fdd}|  |j|jd  }| |jd t  d S )Nrp   c                     s   d}  dD ]}| |7 } q| S r   r8   r   aliasr8   r9   rA   k  s    
zUTestLiteralUnrollPassTriggering.test_literal_unroll_is_invoked_via_alias.<locals>.foor   r  )r	   r   r  r+   r,   r/   rw   r   r  r8   r  r9   (test_literal_unroll_is_invoked_via_aliash  s    zHTestLiteralUnrollPassTriggering.test_literal_unroll_is_invoked_via_aliasc                 C   s@   t tddd }|  |j|jd  }| |jd t  d S )Nrp   c                   S   s   d S rW   r8   r8   r8   r8   r9   rA   w  s    zVTestLiteralUnrollPassTriggering.test_literal_unroll_assess_empty_function.<locals>.foor   r  r  r  r8   r8   r9   )test_literal_unroll_assess_empty_functionv  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():
	passrp   rA   r   r  )execr   r  r+   r,   r  rw   r   )r3   r   r<  rA   r6   r8   r8   r9   "test_literal_unroll_not_in_globals  s    zBTestLiteralUnrollPassTriggering.test_literal_unroll_not_in_globalsc              	   C   sj  d}i }t |i | ttd|d }| tj}|  W 5 Q R X | 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,)):
		passrp   rA   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  rK   r   r   rM   rN   rO   r	   r+   r,   r/   rw   r   textwrapr  )r3   r   r<  rA   r   r6   r  r8   r8   r9   &test_literal_unroll_globals_and_locals  s>    		zFTestLiteralUnrollPassTriggering.test_literal_unroll_globals_and_localsN)	rR   rS   rT   r  r  r  r  r  r  r8   r8   r8   r9   r  N  s   		r  __main__)=collectionsr   Z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)   rV   r`   r   rr  r{  r  r  r  rR   mainr8   r8   r8   r9   <module>   sL   ((
            (  'q
