B
     \                 @   s`   d dl mZ 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 )    )print_function)irerrors   )register_rewriteRewritezbefore-inferencec               @   s    e Zd ZdZdd Zdd ZdS )RewritePrintCallszU
    Rewrite calls to the print() global function to dedicated IR print() nodes.
    c       
   	   C   s   i  | _ }|| _x|tjD ]v}t|jtjr|jjdkr|j}y|	|j
}W n tjk
rj   wY nX |tkr|jrd}	t|	|j|||< qW t|dkS )NZcallzKNumba's print() function implementation does not support keyword arguments.r   )printsblock
find_instsr   Assign
isinstancevalueZExpropinfer_constantfuncr   ConstantInferenceErrorprintZkwsZUnsupportedErrorloclen)
selffunc_irr
   typemap	calltypesr	   instexprZcalleemsg r   6lib/python3.7/site-packages/numba/rewrites/ir_print.pymatch   s    
zRewritePrintCalls.matchc             C   s   | j  }|  xz| j jD ]n}|| jkr| j| }tj|j|j|j	d}|
| tjtjd|j	d|j|j	d}|
| q|
| qW |S )z{
        Rewrite `var = call <print function>(...)` as a sequence of
        `print(...)` and `var = const(None)`.
        )argsvarargr   N)r   )r   targetr   )r
   copyclearbodyr	   r   Printr    r!   r   appendr   ZConstr"   )r   Z	new_blockr   r   Z
print_nodeZassign_noder   r   r   apply!   s    





zRewritePrintCalls.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 )DetectConstPrintArgumentsz?
    Detect and store constant arguments to print() nodes.
    c       
   
   C   s   i  | _ }|| _xl|tjD ]\}|j r*qxNt|jD ]@\}}y||}	W n tj	k
rd   w6Y nX |	|
|i |< q6W qW t|dkS )Nr   )constsr
   r   r   r&   	enumerater    r   r   r   
setdefaultr   )
r   r   r
   r   r   r.   r   idxvarZconstr   r   r   r   =   s    
zDetectConstPrintArguments.matchc             C   s.   x&| j jD ]}|| jkr
| j| |_q
W | j S )zC
        Store detected constant arguments on their nodes.
        )r
   r%   r.   )r   r   r   r   r   r(   M   s    
zDetectConstPrintArguments.applyN)r)   r*   r+   r,   r   r(   r   r   r   r   r-   7   s   r-   N)
Z
__future__r   Znumbar   r    r   r   r   r-   r   r   r   r   <module>   s   /