B
     \                 @   sT   d dl mZmZ ddlmZmZ edG dd deZedG dd deZd	S )
    )irerrors   )register_rewriteRewritezbefore-inferencec               @   s    e Zd ZdZdd Zdd ZdS )RewriteConstGetitemsz
    Rewrite IR expressions of the kind `getitem(value=arr, index=$constXX)`
    where `$constXX` is a known constant as
    `static_getitem(value=arr, index=<constant value>)`.
    c          	   C   sn   i  | _ }|| _xP|jddD ]@}|jdkry||j}W n tjk
rT   wY nX |||< qW t|dkS )Ngetitem)opr   )	getitemsblockZ
find_exprsr	   infer_constantindexr   ConstantInferenceErrorlen)selffunc_irr   typemap	calltypesr
   exprconst r   <lib/python3.7/site-packages/numba/rewrites/static_getitem.pymatch   s    

zRewriteConstGetitems.matchc             C   s   | j  }|  xn| j jD ]b}t|tjrt|j}|| jkrt| j| }tj	j
|j||j|jd}tj||j|jd}|| qW |S )zC
        Rewrite all matching getitems as static_getitems.
        )valuer   Z	index_varloc)r   targetr   )r   copyclearbody
isinstancer   ZAssignr   r
   ZExprZstatic_getitemr   r   r   append)r   	new_blockinstr   r   Znew_exprr   r   r   apply   s    






zRewriteConstGetitems.applyN)__name__
__module____qualname____doc__r   r#   r   r   r   r   r      s   r   c               @   s    e Zd ZdZdd Zdd ZdS )RewriteConstSetitemsz
    Rewrite IR statements of the kind `setitem(target=arr, index=$constXX, ...)`
    where `$constXX` is a known constant as
    `static_setitem(target=arr, index=<constant value>, ...)`.
    c          	   C   sd   i  | _ }|| _xF|tjD ]6}y||j}W n tjk
rJ   wY nX |||< qW t	|dkS )Nr   )
setitemsr   Z
find_instsr   ZSetItemr   r   r   r   r   )r   r   r   r   r   r)   r"   r   r   r   r   r   9   s    
zRewriteConstSetitems.matchc             C   sl   | j  }|  xT| j jD ]H}|| jkrZ| j| }t|j||j|j	|j
}|| q|| qW |S )zC
        Rewrite all matching setitems as static_setitems.
        )r   r   r   r   r)   r   ZStaticSetItemr   r   r   r   r    )r   r!   r"   r   Znew_instr   r   r   r#   G   s    



zRewriteConstSetitems.applyN)r$   r%   r&   r'   r   r#   r   r   r   r   r(   1   s   r(   N)Znumbar   r    r   r   r   r(   r   r   r   r   <module>   s
   +