o
    2g                     @  s   d 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 ddlmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ d%ddZd&ddZd'd d!Zd(d"d#Z d$S ))z'Insert checks for uninitialized values.    )annotations)AnalysisDictanalyze_must_defined_regscleanup_cfgget_cfg)BITMAP_BITS)FuncIR
all_values)Assign
BasicBlockBranchComparisonOpIntegerIntOpLoadAddressLoadErrorValueOpRaiseStandardErrorRegisterUnreachableValue)bitmap_rprimitiveirr   returnNonec                 C  sH   t | j t| j}t| j|t| jt| j| j}t| j|j| _d S N)	r   blocksr   r   setarg_regsr	   split_blocks_at_uninitsbefore)r   cfgmust_defined r#   N/home/garg/my-data/venv/lib/python3.10/site-packages/mypyc/transform/uninit.pyinsert_uninit_checks   s   

r%   r   list[BasicBlock]pre_must_definedAnalysisDict[Value]c                 C  s  g }g }t  }g }g }| D ]}|j}g |_|}	||	 t|D ]\}
}|||
f }| D ]y}t|tr||vrt|trD|jtj	kst|t
st t }}|	j |_|_|||g7 }||vrk|| || |jjs|	jt|||tj	|jd nt|	j||||||j ttjd|j d|j}|j| |jt  |}	q.|	j| q q|rt||| |rg }|D ]}t|jdd}|| |t|| q|D ]}|t|tdt q||d jdd< |S )N)
true_labelfalse_labeloplinezlocal variable "z" referenced before assignmentT)	undefinesr   )r   opsappend	enumerateunique_sources
isinstancer   r   r+   IS_ERRORr   r   error_handleraddtypeerror_overlapr,   check_for_uninit_using_bitmapr   UNBOUND_LOCAL_ERRORnamer   )update_register_assignments_to_set_bitmapr   r
   r   r   )r   r'   
new_blocksinit_registersinit_registers_setbitmap_registersbitmap_backedblockr.   	cur_blockir+   definedsrc	new_blockerror_block	raise_stdnew_opsregerrr#   r#   r$   r   '   s   
	


8
r   r.   list[Op]rE   r   r?   list[Register]r@   rG   r   ok_blockr,   intc                 C  s   ||vr"| | t|d t }t||kr"| ttd|  ||}tt||t  td|td @ > ttj|}	|  |	 t	|	tdtt	j
}
|  |
 |  t|
||tj dS )zcCheck if src is defined using a bitmap.

    Modifies ops, bitmap_registers and bitmap_backed.
       __locals_bitmapr   N)r/   lenr   r   r   indexr   r   ANDr   EQr   BOOL)r.   rE   r?   r@   rG   rN   r,   nrS   maskedchkr#   r#   r$   r8      s"   




r8   c           	   
     s   | D ]Z}t  fdd|jD r\g }|jD ]C}t|trS|j v rS |j}|| ||t  }tt	|t
d|td @ > t	tj|j}|| |t|| q|| q||_qdS )zUpdate some assignments to registers to also set a bit in a bitmap.

    The bitmaps are used to track if a local variable has been assigned to.

    Modifies blocks.
    c                 3  s$    | ]}t |to|j v V  qd S r   )r2   r
   dest).0r+   r@   r#   r$   	<genexpr>   s   " z<update_register_assignments_to_set_bitmap.<locals>.<genexpr>rP   N)anyr.   r2   r
   rZ   rS   r/   r   r   r   r   ORr,   )	r   r?   r@   rA   rI   r+   rS   rJ   newr#   r\   r$   r;      s*   	


r;   N)r   r   r   r   )r   r&   r'   r(   r   r&   )r.   rL   rE   r   r?   rM   r@   rM   rG   r   rN   r   r,   rO   r   r   )r   r&   r?   rM   r@   rM   r   r   )!__doc__
__future__r   mypyc.analysis.dataflowr   r   r   r   mypyc.commonr   mypyc.ir.func_irr   r	   mypyc.ir.opsr
   r   r   r   r   r   r   r   r   r   r   r   r   mypyc.ir.rtypesr   r%   r   r8   r;   r#   r#   r#   r$   <module>   s    <


Y"