B
     \w                 @   s  d dl mZmZmZ d dlmZ d dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZ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 e ZG dd	 d	eZed
d d ZG dd deZ G dd deZ!G dd de!Z"G dd de"Z#G dd de!Z$G dd de"Z%G dd de"Z&G dd de"Z'G dd de"Z(G dd de"Z)G dd  d e"Z*G d!d" d"e"Z+G d#d$ d$e#Z,G d%d& d&e#Z-G d'd( d(e#Z.G d)d* d*e#Z/G d+d, d,e#Z0G d-d. d.e"Z1G d/d0 d0e"Z2G d1d2 d2e!Z3G d3d4 d4e"Z4G d5d6 d6eZ5G d7d8 d8eZ6G d9d: d:eZ7G d;d< d<eZ8G d=d> d>eZ9G d?d@ d@eZ:G dAdB dBeZ;G dCdD dDeZ<G dEdF dFeZ=G dGdH dHeZ>G dIdJ dJeZ?G dKdL dLeZ@e@ ZAdS )M    )print_functiondivisionabsolute_import)defaultdictN)configerrors   )BINOPS_TO_OPERATORSINPLACE_BINOPS_TO_OPERATORSUNARY_BUITINS_TO_OPERATORSOPERATORS_TO_BUILTINS)NotDefinedErrorRedefinedErrorVerificationErrorConstantInferenceErrorc               @   st   e Zd ZdZedZdddZedd Z	dd	 Z
d
d Zdd Zdd Zdd Zdd ZdddZdddZdS )LoczSource location

    zdef\s+(\w+)\(.*Nc             C   s   || _ || _|| _d | _d S )N)filenamelinecollines)selfr   r   r    r   'lib/python3.7/site-packages/numba/ir.py__init__   s    zLoc.__init__c             C   s   | |j |jS )N)r   Zfirstlineno)clsfunc_idr   r   r   from_function_id#   s    zLoc.from_function_idc             C   s   d| j | j| jf S )Nz!Loc(filename=%s, line=%s, col=%s))r   r   r   )r   r   r   r   __repr__'   s    zLoc.__repr__c             C   s2   | j d k	rd| j| j| j f S d| j| jf S d S )Nz
%s (%s:%s)z%s (%s))r   r   r   )r   r   r   r   __str__+   s    
zLoc.__str__c             C   s>   d }|   }x,t|d | jd  D ]}d|kr$|}P q$W |S )Nr   zdef )
_get_linesreversedr   )r   fn_namer   xr   r   r   _find_definition1   s    zLoc._find_definitionc             C   s,   |   }|r$| j|  d S d S d S )Nr   )r#   _defmatchermatchstripgroups)r   Zdefnr   r   r   _raw_function_name<   s    zLoc._raw_function_namec             C   s    | j d krt|  | _ | j S )N)r   	linecachegetlines	_get_path)r   r   r   r   r   D   s    
zLoc._get_linesc             C   s>   d }yt j| j}W n" tk
r8   t j| j}Y nX |S )N)ospathrelpathr   
ValueErrorabspath)r   r-   r   r   r   r+   K   s    zLoc._get_path   c             C   sH  |   }g }|r| jrdd }|td| j| | j }d}x|D ]}d|krFd}qFW |sd }x,t|d | jd  D ]}d|krz|}P qzW |r|| ||}	|dd	|	  d
  |r||d d  |t|d  ||d }	|d|	 td  |sd}t	dd }
|
| 
 | jtd|f }|S )Nc             S   s,   d}x"t tjt| D ]}|d7 }qW |S )Nr   r   )	itertools	takewhilestrisspace)stringspacesr"   r   r   r   count_spaces`   s    z#Loc.strformat.<locals>.count_spacesr   Fzdef Tr       z<source elided>
^z#<source missing, REPL/exec in use?>z
File "%s", line %d:z
%s )r   r   maxr    appendextend
_termcolorZ	highlightZindicater   r+   codejoin)r   Z	nlines_upr   Zretr8   ZselectedZ	def_foundr"   r!   r7   errZtmpr   r   r   	strformatY   s:    


 zLoc.strformatc             C   s   t | | j||S )z9
        Return a new Loc with this line number.
        )typer   )r   r   r   r   r   r   with_lineno   s    zLoc.with_lineno)N)r1   )N)__name__
__module____qualname____doc__recompiler$   r   classmethodr   r   r   r#   r(   r   r+   rE   rG   r   r   r   r   r      s   


6r   zunknown locationc               @   sL   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S )VarMapc             C   s
   i | _ d S )N)_con)r   r   r   r   r      s    zVarMap.__init__c             C   s"   || j krt|n
|| j |< d S )N)rP   r   )r   namevarr   r   r   define   s    

zVarMap.definec             C   s,   y
| j | S  tk
r&   t|Y nX d S )N)rP   KeyErrorr   )r   rQ   r   r   r   get   s    
z
VarMap.getc             C   s
   || j kS )N)rP   )r   rQ   r   r   r   __contains__   s    zVarMap.__contains__c             C   s
   t | jS )N)lenrP   )r   r   r   r   __len__   s    zVarMap.__len__c             C   s   t | jS )N)pprintZpformatrP   )r   r   r   r   r      s    zVarMap.__repr__c             C   s
   t | jS )N)hashrQ   )r   r   r   r   __hash__   s    zVarMap.__hash__c             C   s
   | j  S )N)rP   Ziterkeys)r   r   r   r   __iter__   s    zVarMap.__iter__N)rH   rI   rJ   r   rS   rU   rV   rX   r   r[   r\   r   r   r   r   rO      s   rO   c               @   s    e Zd ZdZdd Zdd ZdS )Instz-
    Base class for all IR instructions.
    c             C   s   t dS )zO
        List the variables used (read or written) by the instruction.
        N)NotImplementedError)r   r   r   r   	list_vars   s    zInst.list_varsc             C   s   t |tr|gS t |tr"| S t |ttfrVg }x|D ]}|| | q:W |S t |trg }x |	 D ]}|| | qnW |S g S dS )zQ
        A recursive helper used to implement list_vars() in subclasses.
        N)

isinstanceVarr]   r_   listtupler@   _rec_list_varsdictvalues)r   valZlstvr   r   r   rd      s    



zInst._rec_list_varsN)rH   rI   rJ   rK   r_   rd   r   r   r   r   r]      s   r]   c               @   s    e Zd ZdZdZdZdd ZdS )Stmtzc
    Base class for IR statements (instructions which can appear on their
    own in a Block).
    Fc             C   s   |  | jS )N)rd   __dict__)r   r   r   r   r_      s    zStmt.list_varsN)rH   rI   rJ   rK   is_terminatoris_exitr_   r   r   r   r   ri      s   ri   c               @   s   e Zd ZdZdZdd ZdS )
Terminatorz
    IR statements that are terminators: the last statement in a block.
    A terminator must either:
    - exit the function
    - jump to a block

    All subclass of Terminator must override `.get_targets()` to return a list
    of jump targets.
    Tc             C   s   t t| d S )N)r^   rF   )r   r   r   r   get_targets   s    zTerminator.get_targetsN)rH   rI   rJ   rK   rk   rn   r   r   r   r   rm      s   	rm   c               @   s  e Zd ZdZdd Zdd Zdd Zedd	 Zed
d Z	edd Z
ed3ddZedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Zed%d& Zed'd( Zed)d* Zed+d, Zd-d. Zd/d0 Zd1d2 ZdS )4Exprz]
    An IR expression (an instruction which can only be part of a larger
    statement).
    c             K   s   || _ || _|| _d S )N)oploc_kws)r   rp   rq   kwsr   r   r   r      s    zExpr.__init__c             C   s    | drt| |S | j| S )N_)
startswithr]   __getattr__rr   )r   rQ   r   r   r   rv     s    
zExpr.__getattr__c             C   s"   |dkr|| j |< n
|| j|< d S )N)rp   rq   rr   )rj   rr   )r   rQ   valuer   r   r   __setattr__
  s    zExpr.__setattr__c          	   C   s(   t |trtd}| |||||ttdS )Nbinop)rp   rq   fnlhsrhs
static_lhs
static_rhs)r`   r4   AssertionError	UNDEFINED)r   rz   r{   r|   rq   rp   r   r   r   ry     s    z
Expr.binopc          
   C   s8   t |trtt |trtd}| ||||||ttdS )Ninplace_binop)rp   rq   rz   immutable_fnr{   r|   r}   r~   )r`   r4   r   r   )r   rz   r   r{   r|   rq   rp   r   r   r   r     s    
zExpr.inplace_binopc             C   s    d}t ||}| ||||dS )Nunary)rp   rq   rz   rw   )r   rU   )r   rz   rw   rq   rp   r   r   r   r      s    z
Expr.unaryNc             C   s   d}| ||||||dS )Ncall)rp   rq   funcargsrs   varargr   )r   r   r   rs   rq   r   rp   r   r   r   r   &  s    z	Expr.callc             C   s   d}| |||dS )Nbuild_tuple)rp   rq   itemsr   )r   r   rq   rp   r   r   r   r   ,  s    zExpr.build_tuplec             C   s   d}| |||dS )N
build_list)rp   rq   r   r   )r   r   rq   rp   r   r   r   r   1  s    zExpr.build_listc             C   s   d}| |||dS )N	build_set)rp   rq   r   r   )r   r   rq   rp   r   r   r   r   6  s    zExpr.build_setc             C   s   d}| ||||dS )N	build_map)rp   rq   r   sizer   )r   r   r   rq   rp   r   r   r   r   ;  s    zExpr.build_mapc             C   s   d}| |||dS )N
pair_first)rp   rq   rw   r   )r   rw   rq   rp   r   r   r   r   @  s    zExpr.pair_firstc             C   s   d}| |||dS )Npair_second)rp   rq   rw   r   )r   rw   rq   rp   r   r   r   r   E  s    zExpr.pair_secondc             C   s   d}| |||dS )Ngetiter)rp   rq   rw   r   )r   rw   rq   rp   r   r   r   r   J  s    zExpr.getiterc             C   s   d}| |||dS )Niternext)rp   rq   rw   r   )r   rw   rq   rp   r   r   r   r   O  s    zExpr.iternextc             C   s   d}| ||||dS )Nexhaust_iter)rp   rq   rw   countr   )r   rw   r   rq   rp   r   r   r   r   T  s    zExpr.exhaust_iterc             C   s   d}| ||||dS )Ngetattr)rp   rq   rw   attrr   )r   rw   r   rq   rp   r   r   r   r   Y  s    zExpr.getattrc             C   s   d}| ||||dS )Ngetitem)rp   rq   rw   indexr   )r   rw   r   rq   rp   r   r   r   r   ^  s    zExpr.getitemc             C   s   d}| |||||dS )Nstatic_getitem)rp   rq   rw   r   	index_varr   )r   rw   r   r   rq   rp   r   r   r   r   c  s    
zExpr.static_getitemc             C   s   d}| |||dS )zE
        A node for implicit casting at the return statement
        cast)rp   rw   rq   r   )r   rw   rq   rp   r   r   r   r   i  s    z	Expr.castc             C   s   d}| ||||||dS )z6
        A node for making a function object.
        make_function)rp   rQ   rB   closuredefaultsrq   r   )r   rQ   rB   r   r   rq   rp   r   r   r   r   q  s    zExpr.make_functionc       	      C   s(  | j dkrddd | jD }tjdkr4| j nt| j }ddd |D }| jd k	rld| jf nd}dt	d |||g}d	| j
|f S | j d
kr| j| j }}| jtjkr|| }}t| j| j}d|||f S tjdkr| j nt| j }dd |D }d| j d|f S d S )Nr   z, c             s   s   | ]}t |V  qd S )N)r4   ).0ar   r   r   	<genexpr>{  s    z Expr.__repr__.<locals>.<genexpr>r   c             s   s   | ]\}}d ||f V  qdS )z%s=%sNr   )r   krh   r   r   r   r   }  s    z*%sr=   zcall %s(%s)ry   z%s %s %sc             s   s   | ]\}}d ||f V  qdS )z%s=%sNr   )r   r   rh   r   r   r   r     s    z%s(%s))rp   rC   r   r   ZDIFF_IRrr   r   sortedr   filterr   r{   r|   rz   operatorcontainsr   rU   )	r   r   Z
pres_orderrs   r   Zarglistr{   r|   rz   r   r   r   r   y  s     
"

"zExpr.__repr__c             C   s   |  | jS )N)rd   rr   )r   r   r   r   r_     s    zExpr.list_varsc             C   s   t d|  | jdd S )Nz%s)rq   )r   rq   )r   r   r   r   infer_constant  s    zExpr.infer_constant)N)rH   rI   rJ   rK   r   rv   rx   rN   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r_   r   r   r   r   r   ro      s4   	ro   c               @   s    e Zd ZdZdd Zdd ZdS )SetItemz
    target[index] = value
    c             C   s   || _ || _|| _|| _d S )N)targetr   rw   rq   )r   r   r   rw   rq   r   r   r   r     s    zSetItem.__init__c             C   s   d| j | j| jf S )Nz%s[%s] = %s)r   r   rw   )r   r   r   r   r     s    zSetItem.__repr__N)rH   rI   rJ   rK   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 )StaticSetItemz(
    target[constant index] = value
    c             C   s"   || _ || _|| _|| _|| _d S )N)r   r   r   rw   rq   )r   r   r   r   rw   rq   r   r   r   r     s
    zStaticSetItem.__init__c             C   s   d| j | j| jf S )Nz%s[%r] = %s)r   r   rw   )r   r   r   r   r     s    zStaticSetItem.__repr__N)rH   rI   rJ   rK   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 )DelItemz
    del target[index]
    c             C   s   || _ || _|| _d S )N)r   r   rq   )r   r   r   rq   r   r   r   r     s    zDelItem.__init__c             C   s   d| j | jf S )Nz
del %s[%s])r   r   )r   r   r   r   r     s    zDelItem.__repr__N)rH   rI   rJ   rK   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )SetAttrc             C   s   || _ || _|| _|| _d S )N)r   r   rw   rq   )r   r   r   rw   rq   r   r   r   r     s    zSetAttr.__init__c             C   s   d| j | j| jf S )Nz(%s).%s = %s)r   r   rw   )r   r   r   r   r     s    zSetAttr.__repr__N)rH   rI   rJ   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )DelAttrc             C   s   || _ || _|| _d S )N)r   r   rq   )r   r   r   rq   r   r   r   r     s    zDelAttr.__init__c             C   s   d| j | jf S )Nzdel (%s).%s)r   r   )r   r   r   r   r     s    zDelAttr.__repr__N)rH   rI   rJ   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )StoreMapc             C   s   || _ || _|| _|| _d S )N)dctkeyrw   rq   )r   r   r   rw   rq   r   r   r   r     s    zStoreMap.__init__c             C   s   d| j | j| jf S )Nz%s[%s] = %s)r   r   rw   )r   r   r   r   r     s    zStoreMap.__repr__N)rH   rI   rJ   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )Delc             C   s   || _ || _d S )N)rw   rq   )r   rw   rq   r   r   r   r     s    zDel.__init__c             C   s
   d| j  S )Nzdel %s)rw   )r   r   r   r   r     s    zDel.__str__N)rH   rI   rJ   r   r   r   r   r   r   r     s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	RaiseTc             C   s   || _ || _d S )N)	exceptionrq   )r   r   rq   r   r   r   r     s    zRaise.__init__c             C   s
   d| j  S )Nzraise %s)r   )r   r   r   r   r     s    zRaise.__str__c             C   s   g S )Nr   )r   r   r   r   rn     s    zRaise.get_targetsN)rH   rI   rJ   rl   r   r   rn   r   r   r   r   r     s   r   c               @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
StaticRaisez
    Raise an exception class and arguments known at compile-time.
    Note that if *exc_class* is None, a bare "raise" statement is implied
    (i.e. re-raise the current exception).
    Tc             C   s   || _ || _|| _d S )N)	exc_classexc_argsrq   )r   r   r   rq   r   r   r   r     s    zStaticRaise.__init__c             C   sD   | j d krdS | jd kr$d| j f S d| j dtt| jf S d S )Nraisezraise %szraise %s(%s)z, )r   r   rC   maprepr)r   r   r   r   r     s    

zStaticRaise.__str__c             C   s   g S )Nr   )r   r   r   r   rn     s    zStaticRaise.get_targetsN)rH   rI   rJ   rK   rl   r   r   rn   r   r   r   r   r     s
   	r   c               @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
Returnz
    Return to caller.
    Tc             C   s   || _ || _d S )N)rw   rq   )r   rw   rq   r   r   r   r     s    zReturn.__init__c             C   s
   d| j  S )Nz	return %s)rw   )r   r   r   r   r     s    zReturn.__str__c             C   s   g S )Nr   )r   r   r   r   rn     s    zReturn.get_targetsN)rH   rI   rJ   rK   rl   r   r   rn   r   r   r   r   r     s
   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Jumpz
    Unconditional branch.
    c             C   s   || _ || _d S )N)r   rq   )r   r   rq   r   r   r   r   '  s    zJump.__init__c             C   s
   d| j  S )Nzjump %s)r   )r   r   r   r   r   +  s    zJump.__str__c             C   s   | j gS )N)r   )r   r   r   r   rn   .  s    zJump.get_targetsN)rH   rI   rJ   rK   r   r   rn   r   r   r   r   r   "  s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Branchz
    Conditional branch.
    c             C   s   || _ || _|| _|| _d S )N)condtruebrfalsebrrq   )r   r   r   r   rq   r   r   r   r   7  s    zBranch.__init__c             C   s   d| j | j| jf S )Nzbranch %s, %s, %s)r   r   r   )r   r   r   r   r   =  s    zBranch.__str__c             C   s   | j | jgS )N)r   r   )r   r   r   r   rn   @  s    zBranch.get_targetsN)rH   rI   rJ   rK   r   r   rn   r   r   r   r   r   2  s   r   c               @   s    e Zd ZdZdd Zdd ZdS )Assignz
    Assign to a variable.
    c             C   s   || _ || _|| _d S )N)rw   r   rq   )r   rw   r   rq   r   r   r   r   H  s    zAssign.__init__c             C   s   d| j | jf S )Nz%s = %s)r   rw   )r   r   r   r   r   M  s    zAssign.__str__N)rH   rI   rJ   rK   r   r   r   r   r   r   r   D  s   r   c               @   s    e Zd ZdZdd Zdd ZdS )Printz
    Print some values.
    c             C   s   || _ || _i | _|| _d S )N)r   r   constsrq   )r   r   r   rq   r   r   r   r   U  s    zPrint.__init__c             C   s   dd dd | jD  S )Nz	print(%s)z, c             s   s   | ]}t |V  qd S )N)r4   )r   rh   r   r   r   r   ]  s    z Print.__str__.<locals>.<genexpr>)rC   r   )r   r   r   r   r   \  s    zPrint.__str__N)rH   rI   rJ   rK   r   r   r   r   r   r   r   Q  s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )Yieldc             C   s   || _ || _|| _d S )N)rw   rq   r   )r   rw   rq   r   r   r   r   r   a  s    zYield.__init__c             C   s   d| j f S )Nzyield %s)rw   )r   r   r   r   r   f  s    zYield.__str__c             C   s   | j gS )N)rw   )r   r   r   r   r_   i  s    zYield.list_varsN)rH   rI   rJ   r   r   r_   r   r   r   r   r   `  s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )		EnterWithzEnter a "with" context
    c             C   s   || _ || _|| _|| _dS )z
        Parameters
        ----------
        contextmanager : IR value
        begin, end : int
            The beginning and the ending offset of the with-body.
        loc : int
            Source location
        N)contextmanagerbeginendrq   )r   r   r   r   rq   r   r   r   r   p  s    
zEnterWith.__init__c             C   s   d | jS )Nzenter_with {})formatr   )r   r   r   r   r     s    zEnterWith.__str__c             C   s   | j gS )N)r   )r   r   r   r   r_     s    zEnterWith.list_varsN)rH   rI   rJ   rK   r   r   r_   r   r   r   r   r   m  s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )Argc             C   s   || _ || _|| _d S )N)rQ   r   rq   )r   rQ   r   rq   r   r   r   r     s    zArg.__init__c             C   s   d| j | jf S )Nzarg(%d, name=%s))r   rQ   )r   r   r   r   r     s    zArg.__repr__c             C   s   t d|  | jdd S )Nz%s)rq   )r   rq   )r   r   r   r   r     s    zArg.infer_constantN)rH   rI   rJ   r   r   r   r   r   r   r   r     s   r   c               @   s&   e Zd Zd	ddZdd Zdd ZdS )
ConstTc             C   s   || _ || _|| _d S )N)rw   rq   use_literal_type)r   rw   rq   r   r   r   r   r     s    zConst.__init__c             C   s   dt | jj| jf S )Nzconst(%s, %s))rF   rw   rH   )r   r   r   r   r     s    zConst.__repr__c             C   s   | j S )N)rw   )r   r   r   r   r     s    zConst.infer_constantN)T)rH   rI   rJ   r   r   r   r   r   r   r   r     s   
r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Globalc             C   s   || _ || _|| _d S )N)rQ   rw   rq   )r   rQ   rw   rq   r   r   r   r     s    zGlobal.__init__c             C   s   d| j | jf S )Nzglobal(%s: %s))rQ   rw   )r   r   r   r   r     s    zGlobal.__str__c             C   s   | j S )N)rw   )r   r   r   r   r     s    zGlobal.infer_constantc             C   s   t | j| jt| jS )N)r   rQ   rw   copydeepcopyrq   )r   memor   r   r   __deepcopy__  s    zGlobal.__deepcopy__N)rH   rI   rJ   r   r   r   r   r   r   r   r   r     s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	FreeVarzm
    A freevar, as loaded by LOAD_DECREF.
    (i.e. a variable defined in an enclosing non-global scope)
    c             C   s   || _ || _|| _|| _d S )N)r   rQ   rw   rq   )r   r   rQ   rw   rq   r   r   r   r     s    zFreeVar.__init__c             C   s   d| j | jf S )Nzfreevar(%s: %s))rQ   rw   )r   r   r   r   r     s    zFreeVar.__str__c             C   s   | j S )N)rw   )r   r   r   r   r     s    zFreeVar.infer_constantN)rH   rI   rJ   rK   r   r   r   r   r   r   r   r     s   	r   c               @   s4   e Zd ZdZdd Zdd Zdd Zedd	 Zd
S )ra   zt
    Attributes
    -----------
    - scope: Scope

    - name: str

    - loc: Loc
        Definition location
    c             C   s   || _ || _|| _d S )N)scoperQ   rq   )r   r   rQ   rq   r   r   r   r     s    zVar.__init__c             C   s   d| j | jf S )NzVar(%s, %s))rQ   rq   )r   r   r   r   r     s    zVar.__repr__c             C   s   | j S )N)rQ   )r   r   r   r   r     s    zVar.__str__c             C   s   | j dS )N$)rQ   ru   )r   r   r   r   is_temp  s    zVar.is_tempN)	rH   rI   rJ   rK   r   r   r   propertyr   r   r   r   r   ra     s
   
ra   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )		Intrinsica  
    A low-level "intrinsic" function.  Suitable as the callable of a "call"
    expression.

    The given *name* is backend-defined and will be inserted as-is
    in the generated low-level IR.
    The *type* is the equivalent Numba signature of calling the intrinsic.
    c             C   s   || _ || _d | _|| _d S )N)rQ   rF   rq   r   )r   rQ   rF   r   r   r   r   r     s    zIntrinsic.__init__c             C   s   d| j | j| jf S )NzIntrinsic(%s, %s, %s))rQ   rF   rq   )r   r   r   r   r     s    zIntrinsic.__repr__c             C   s   | j S )N)rQ   )r   r   r   r   r     s    zIntrinsic.__str__N)rH   rI   rJ   rK   r   r   r   r   r   r   r   r     s   r   c               @   s^   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdddZ	dd Z
edd Zdd ZdS )Scopez
    Attributes
    -----------
    - parent: Scope
        Parent scope

    - localvars: VarMap
        Scope-local variable map

    - loc: Loc
        Start of scope location

    c             C   s"   || _ t | _|| _tt| _d S )N)parentrO   	localvarsrq   r   int	redefined)r   r   rq   r   r   r   r   
  s    zScope.__init__c             C   s"   t | ||d}| j|j| |S )z#
        Define a variable
        )r   rQ   rq   )ra   r   rS   rQ   )r   rQ   rq   rh   r   r   r   rS     s    zScope.definec             C   s&   || j krd|| j | f }| |S )zC
        Refer to a variable.  Returns the latest version.
        z%s.%d)r   	get_exact)r   rQ   r   r   r   rU     s    
z	Scope.getc             C   s:   y| j |S  tk
r4   | jr.| j|S  Y nX dS )zr
        Refer to a variable.  The returned variable has the exact
        name (exact variable version).
        N)r   rU   r   
has_parentr   )r   rQ   r   r   r   r      s    zScope.get_exactc             C   sP   || j krd|| j | f }t| ||d}|| jkr@| ||S | j|S d S )Nz%s.%d)r   rQ   rq   )r   ra   r   rS   rU   )r   rQ   rq   rh   r   r   r   get_or_define-  s    

zScope.get_or_defineTc             C   s^   || j kr| ||S |s&| j |S | j| }|d | j|< d||d f }| ||S dS )z9
        Redefine if the name is already defined
        r   z%s.%dN)r   rS   rU   r   )r   rQ   rq   renameZctZnewnamer   r   r   redefine7  s    

zScope.redefinec             C   s0   t | j}t| d| |d}| j|j| |S )Nz$%d)r   rQ   rq   )rW   r   ra   rS   rQ   )r   rq   nrh   r   r   r   	make_tempG  s    
zScope.make_tempc             C   s
   | j d k	S )N)r   )r   r   r   r   r   M  s    zScope.has_parentc             C   s   d| j t| j| jf S )Nz%Scope(has_parent=%r, num_vars=%d, %s))r   rW   r   rq   )r   r   r   r   r   Q  s    zScope.__repr__N)T)rH   rI   rJ   rK   r   rS   rU   r   r   r   r   r   r   r   r   r   r   r   r     s   

r   c               @   s   e Zd ZdZdd Zdd Zd#ddZd$d	d
Zdd Zdd Z	dd Z
dd Zdd Zd%ddZedd Zedd Zdd Zdd Zdd  Zd!d" ZdS )&BlockzA code block

    c             C   s   || _ g | _|| _d S )N)r   bodyrq   )r   r   rq   r   r   r   r   \  s    zBlock.__init__c             C   s"   t | j| j}| jd d  |_|S )N)r   r   rq   r   )r   blockr   r   r   r   a  s    z
Block.copyNc             c   sF   x@| j D ]6}t|tr|j}t|tr|dks8|j|kr|V  qW dS )zE
        Iterate over exprs of the given *op* in this block.
        N)r   r`   r   rw   ro   rp   )r   rp   instexprr   r   r   
find_exprsf  s    

zBlock.find_exprsc             c   s$   x| j D ]}t||r|V  qW dS )zF
        Iterate over insts of the given class in this block.
        N)r   r`   )r   r   r   r   r   r   
find_instsq  s    
zBlock.find_instsc             C   s*   x$| j tdD ]}|jj|kr|S qW dS )zr
        Returns the assignment inst associated with variable "name", None if
        it cannot be found.
        )r   N)r   r   r   rQ   )r   rQ   r"   r   r   r   find_variable_assignmenty  s    zBlock.find_variable_assignmentc             C   s    t |tst| jd| d S )Nr   )r`   ri   r   r   insert)r   r   r   r   r   prepend  s    zBlock.prependc             C   s   t |tst| j| d S )N)r`   ri   r   r   r?   )r   r   r   r   r   r?     s    zBlock.appendc             C   s"   t |tst| j| j|= d S )N)r`   ri   r   r   r   )r   r   r   r   r   remove  s    zBlock.removec             C   s   | j d d = d S )N)r   )r   r   r   r   clear  s    zBlock.clearc             C   s^   |pt j}xN| jD ]D}t|dr,|| qtdd | D }td||f |d qW d S )Ndumpc             s   s   | ]}t |V  qd S )N)r4   )r   rh   r   r   r   r     s    zBlock.dump.<locals>.<genexpr>z    %-40s %s)file)sysstdoutr   hasattrr   r   r_   print)r   r   r   Z	inst_varsr   r   r   r     s    

z
Block.dumpc             C   s
   | j d S )Nr;   )r   )r   r   r   r   
terminator  s    zBlock.terminatorc             C   s   | j o| j d jS )Nr;   )r   rk   )r   r   r   r   is_terminated  s    zBlock.is_terminatedc             C   s8   | j stdx$| jd d D ]}|jrtdqW d S )NzMissing block terminatorr;   z&Terminator before the last instruction)r   r   r   rk   )r   r   r   r   r   verify  s
    zBlock.verifyc             C   s"   | j |}| j |d | dS )z.
        Insert *stmt* after *other*.
        r   N)r   r   r   )r   stmtotherr   r   r   r   insert_after  s    zBlock.insert_afterc             C   s*   t |tst| jst| jd| d S )Nr;   )r`   ri   r   r   r   r   )r   r   r   r   r   insert_before_terminator  s    
zBlock.insert_before_terminatorc             C   s   d| j f S )Nz<ir.Block at %s>)rq   )r   r   r   r   r     s    zBlock.__repr__)N)N)N)rH   rI   rJ   rK   r   r   r   r   r   r   r?   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   W  s"   




	r   c               @   s$   e Zd ZdZdZdd Zdd ZdS )LoopzDescribes a loop-block
    )entryexitc             C   s   || _ || _d S )N)r   r   )r   r   r   r   r   r   r     s    zLoop.__init__c             C   s   | j | jf}d| S )NzLoop(entry=%s, exit=%s))r   r   )r   r   r   r   r   r     s    zLoop.__repr__N)rH   rI   rJ   rK   	__slots__r   r   r   r   r   r   r     s   r   c               @   s$   e Zd ZdZdZdd Zdd ZdS )WithzDescribes a with-block
    )r   r   c             C   s   || _ || _d S )N)r   r   )r   r   r   r   r   r   r     s    zWith.__init__c             C   s   | j | jf}d| S )NzWith(entry=%s, exit=%s))r   r   )r   r   r   r   r   r     s    zWith.__repr__N)rH   rI   rJ   rK   r   r   r   r   r   r   r   r     s   r   c               @   s\   e Zd Zdd Zdd ZdddZd	d
 Zdd Zdd ZdddZ	dddZ
dddZdS )
FunctionIRc             C   s6   || _ || _|| _|| _|| _|| _|| _|   d S )N)blocksis_generatorr   rq   	arg_count	arg_names_definitions_reset_analysis_variables)r   r  r  r   rq   Zdefinitionsr  r  r   r   r   r     s    zFunctionIR.__init__c             C   s.   ddl m} || | _d | _d | _i | _d S )Nr   )r   )r=   r   ZConstantInference_constsgenerator_infoZvariable_lifetimeblock_entry_vars)r   r   r   r   r   r    s
    z$FunctionIR._reset_analysis_variablesNFc             C   sb   |t | }t| }||_|j|_|r.d|_|dk	r<||_|dk	rJ||_|  |j	 |_|S )z
        Derive a new function IR from this one, using the given blocks,
        and possibly modifying the argument count and generator flag.

        Post-processing will have to be run again on the new IR.
        FN)
minr   r  rq   r  r  r  r  r   derive)r   r  r  r  Zforce_non_generatorZ
firstblocknew_irr   r   r   r    s    
zFunctionIR.derivec             C   sb   t  | }i }i }x>| j D ]0\}}|  }|||< || jkr| j| ||< qW ||_||_|S )N)r   r  r   r	  )r   r  r  r	  Zlabelr   Z	new_blockr   r   r   r     s    

zFunctionIR.copyc             C   s
   | j | S )zf
        Return a set of variable names possibly alive at the beginning of
        the block.
        )r	  )r   r   r   r   r   get_block_entry_vars  s    zFunctionIR.get_block_entry_varsc             C   s   t |tr|j}| j|S )zF
        Try to infer the constant value of a given variable.
        )r`   ra   rQ   r  r   )r   rQ   r   r   r   r     s    
zFunctionIR.infer_constantc             C   s   |}xt |tr|}|j}n t |tr0|}|}n|r8|S |S | j| }t|dkr`td|f t|dkrztd|f |d }qW dS )z
        Get the definition site for the given variable name or instance.
        A Expr instance is returned by default, but if lhs_only is set
        to True, the left-hand-side variable is returned instead.
        r   zno definition for %rr   zmore than one definition for %rN)r`   ra   rQ   r4   r  rW   rT   )r   rw   Zlhs_onlyr{   rQ   Zdefsr   r   r   get_definition'  s"    




zFunctionIR.get_definitionc             C   sH   |pt j}x8t| j D ]&\}}td|f |d |j|d qW d S )Nz	label %s:)r   )r   r   r   r  r   r   r   )r   r   offsetr   r   r   r   r   @  s    
zFunctionIR.dumpc             C   sf   |pt j}| j}tdt|j|d x<t|j D ]*\}}td|t|jt|j	f |d q4W d S )Nzgenerator state variables:)r   z>yield point #%d: live variables = %s, weak live variables = %s)
r   r   r  r   r   Z
state_varsZyield_pointsr   Z	live_varsZweak_live_vars)r   r   Zgir   Zypr   r   r   dump_generator_infoG  s    
zFunctionIR.dump_generator_info)NNF)F)N)N)rH   rI   rJ   r   r  r  r   r  r   r  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 )UndefinedTypeNc             C   s&   | j }|d k	r|S t| }|| _ |S )N)
_singletonobject__new__)r   objr   r   r   r  V  s    
zUndefinedType.__new__c             C   s   dS )NZ	Undefinedr   )r   r   r   r   r   _  s    zUndefinedType.__repr__)rH   rI   rJ   r  r  r   r   r   r   r   r  R  s   	r  )BZ
__future__r   r   r   collectionsr   r   r2   r,   r)   rY   rL   r   warningsZnumbar   r   r   Zutilsr	   r
   r   r   r   r   r   r   Z	termcolorrA   r  r   Zunknown_locrO   r]   ri   rm   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ra   r   r   r   r   r   r   r  r   r   r   r   r   <module>   sh     ! 
	\fy