
    i                        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Zd$dZd%d Z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	   strict_traceback_checksboolreturnNonec           	        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   r   cfgmust_defineds       U/root/projects/qq-shell/venv/lib64/python3.11/site-packages/mypyc/transform/uninit.pyinsert_uninit_checksr(      st     	
")

C,
	3BK((*R[")*L*L L (	<3FH_``BIII    r    list[BasicBlock]pre_must_definedAnalysisDict[Value]c                   g }g }t                      }g }g }| D ]0}|j        }	g |_        |}
|                    |
           t          |	          D ]\  }}|||f         }|                                D ]}t          |t                    r||vrt          |t                    r|j        t          j	        k    snt          |t                    sX||vr*|                    |           |                    |           |j        st                      t                      }}|
j        x|_        |_        |||gz  }|j        j        s<|
j                            t          |||t          j	        |j                             nt%          |
j        ||||||j                   |r|j        dk    sJ d|             t'          t&          j        d|j         d|j                  }|j                            |           |j                            t+                                 |}
|
j                            |           2|rt-          |||           |rg }|D ]P}t/          |j        d          }|                    |           |                    t1          ||                     Q|D ]8}|                    t1          |t3          dt4                                         9||d         j        dd<   |S )N)
true_labelfalse_labelopliner   z9Cannot raise an error with a negative line number for op zlocal variable "z" referenced before assignmentT)	undefines)r!   opsappend	enumerateunique_sources
isinstancer   r   r0   IS_ERRORr   addnamer   error_handlertypeerror_overlapr1   check_for_uninit_using_bitmapr   UNBOUND_LOCAL_ERRORr   )update_register_assignments_to_set_bitmapr   r   r   r   )r    r+   r   
new_blocksinit_registersinit_registers_setbitmap_registersbitmap_backedblockr3   	cur_blockir0   definedsrc	new_blockerror_block	raise_stdnew_opsregerrs                        r'   r#   r#   '   sm    $&JN')$&M  E% E%i		)$$$s^^ ?	% ?	%EAr&uax0G((** <* <* sH--4*7**'F33 +8:8P8P&r;77 9Q "444&--c222*..s333 8 ! -7\\:<<{IJSJaaI+k.G;	"::J81 !,," #+6,5#)?%'W      6%M,)'%G   / \GqLLL[WY[[ )LL 2*>S38SSS! !I
  O**9555O**;==999 )IM  $$$$?	%B  _1*>NP]^^^ )! 	- 	-C T:::CNN3NN6#s++,,,,# 	G 	GCNN6#wq2C'D'DEEFFFF!(
1!A#r)   r3   list[Op]rJ   r   rD   list[Register]rE   rL   r   ok_blockr1   intc           
        ||vrm|                     |           t          |          dz
  t          z  }t          |          |k    r+|                     t          t          d|                      |                    |          }t          t          ||t          z           t          d|t          dz
  z  z  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)r4   lenr   r   r   indexr   r   ANDr   EQr   BOOL)r3   rJ   rD   rE   rL   rS   r1   nrY   maskedchks              r'   r>   r>      s6    -S!!!!#3  A%%##H->@URS@U@U$V$VWWW$$E+-.e{Q/02CDD	 F JJv
vwq*;<<lo
N
NCJJsOOOJJvc;&+>>?????r)   c                d   | D ]*}t          fd|j        D                       rg }|j        D ]}t          |t                    r|j        v r                    |j                  }|                    |           ||t          z           }t          t          |t          d|t          dz
  z  z  t                    t          j        |j                  }|                    |           |                    t          ||                     |                    |           ||_        ,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  T   K   | ]"}t          |t                    o|j        v V  #d S r   )r7   r   dest).0r0   rE   s     r'   	<genexpr>z<update_register_assignments_to_set_bitmap.<locals>.<genexpr>   s9      WWrz"f%%B"']*BWWWWWWr)   rV   N)anyr3   r7   r   rb   rY   r4   r   r   r   r   ORr1   )	r    rD   rE   rF   rN   r0   rY   rO   news	     `      r'   r@   r@      s:        WWWWUYWWWWW 	  "Gi ' 'b&)) 'bg.F.F)//88ENN2&&&*5K+?@C)e{Q&? @BSTT C NN3'''NN6#s#3#34444NN2&&&&EI'   r)   N)r   r	   r   r   r   r   )r    r*   r+   r,   r   r   r   r*   )r3   rQ   rJ   r   rD   rR   rE   rR   rL   r   rS   r   r1   rT   r   r   )r    r*   rD   rR   rE   rR   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#   r>   r@    r)   r'   <module>rp      s}   - - " " " " " " a a a a a a a a a a a a $ $ $ $ $ $ / / / / / / / /                              . - - - - -
a 
a 
a 
a_ _ _ _D@ @ @ @D           r)   