o
    @a                     @   s8   d Z ddlmZ ddlmZ ddlZG dd deZdS )zN
RangeLoopUnfolding turns unfolded range of non unrolled loops back to range.
    )Transformation)isnumNc                   @   s    e Zd ZdZdd Zdd ZdS )RangeLoopUnfoldinga  
    Turns iteration over an incrementing list of literals into a range

    >>> import gast as ast
    >>> from pythran import passmanager, backend
    >>> node = ast.parse("for i in [1,2,3]: print(i)")
    >>> pm = passmanager.PassManager("test")
    >>> _, node = pm.apply(RangeLoopUnfolding, node)
    >>> print(pm.dump(backend.Python, node))
    for i in builtins.range(1, 4, 1):
        print(i)
    c                 C   s   |sd S t dd |D sd S dd |D }|d }t|dkr'||d dfS |d | }|d | }|tt|||krB|||fS d S )Nc                 s   s$    | ]}t |ot|jtV  qd S N)r   
isinstancevalueint.0x r   L/usr/lib/python3/dist-packages/pythran/optimizations/range_loop_unfolding.py	<genexpr>   s    z-RangeLoopUnfolding.isrange.<locals>.<genexpr>c                 S   s   g | ]}|j qS r   )r   r	   r   r   r   
<listcomp>   s    z.RangeLoopUnfolding.isrange.<locals>.<listcomp>r      )alllenlistrange)selfeltsZunboxed_intsstartstepstopr   r   r   isrange   s   
zRangeLoopUnfolding.israngec              
   C   sn   t |jtjtjfr2| |jj}|r2ttt	dt
 d d d|jjdd |D g |_d| _| |S )Nbuiltinsr   c                 S   s   g | ]}t |d qS r   )astZConstant)r
   Zparamr   r   r   r   3   s    z0RangeLoopUnfolding.visit_For.<locals>.<listcomp>T)r   iterr   ZListZTupler   r   ZCallZ	AttributeNameZLoadctxupdateZgeneric_visit)r   ZnodeZrange_paramsr   r   r   	visit_For+   s   
zRangeLoopUnfolding.visit_ForN)__name__
__module____qualname____doc__r   r"   r   r   r   r   r      s    r   )r&   Zpythran.passmanagerr   Zpythran.utilsr   Zgastr   r   r   r   r   r   <module>   s
    