
    X-Ph                        d Z ddlmZ ddl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mZmZmZmZmZmZmZ ddlmZmZmZ ddlmZ ddl m!Z! d&dZ"d'dZ#d(dZ$d)dZ%d*dZ&d+d$Z'd%S ),a  Transform that inserts error checks after opcodes.

When initially building the IR, the code doesn't perform error checks
for exceptions. This module is used to insert all required error checks
afterwards. Each Op describes how it indicates an error condition (if
at all).

We need to split basic blocks on each error check since branches can
only be placed at the end of a basic block.
    )annotations)FuncIR)
ERR_ALWAYS	ERR_FALSE	ERR_MAGICERR_MAGIC_OVERLAPPING	ERR_NEVERNO_TRACEBACK_LINE_NO
BasicBlockBranchCallCComparisonOpFloatGetAttrIntegerLoadErrorValueOp
RegisterOpReturnSetAttrTupleGetValue)RTuplebool_rprimitiveis_float_rprimitive)err_occurred_op)CFunctionDescriptionirr   returnNonec                    d }| j         D ]@}t          |           |-t          d |j        D                       rt	          |           }A|r"t          | j         || j                  | _         d S d S )Nc              3  >   K   | ]}|                                 V  d S N)	can_raise).0ops     Z/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mypyc/transform/exceptions.py	<genexpr>z,insert_exception_handling.<locals>.<genexpr>1   s*      &J&J"r||~~&J&J&J&J&J&J    )blocksadjust_error_kindsanyopsadd_default_handler_blocksplit_blocks_at_errorstraceback_name)r   error_labelblocks      r'   insert_exception_handlingr3   *   s     &*K 8 85!!!3&J&J	&J&J&J#J#J3B77K V*29k2CTUU			V Vr)   r   c                    t                      }| j                            |           t          | j                  }|j                            |           |j                            t          |                     |S r#   )r   r*   appendr   ret_typer-   r   )r   r2   r&   s      r'   r.   r.   7   sg    LLEIU		$	$B	IR	IVBZZ   Lr)   r*   list[BasicBlock]default_error_handler	func_name
str | Nonec           	        g }| D ]n}|j         }g |_         |}|                    |           |j        p|}d |_        |D ]2}|}	|j                             |           t          |t                    r|j        t          k    rt                      }
|                    |
           |j        t          k    rt          j
        }d}n,|j        t          k    rt          j        }d}n|j        t          k    r$t          j        }d}t          dt                    }	n|j        t           k    rt#          |j         |	          }t                      }|                    |           t          |||
t          j        d          }|j                             |           |}t%          t&          g |	j                  }	|j                             |	           t          j
        }d}nJ d|j        z              |j        t          k    r|j        r
J d            t          |	||
||j                  }||_        |j        t.          k    r|||j        f|_        |j                             |           |
}4p|S )NFTr   )
true_labelfalse_labelr&   rarezunknown error kind %dzvoid op generating errors?)r<   r=   r&   line)r-   r5   error_handler
isinstancer   
error_kindr	   r   r   r   IS_ERRORr   BOOLr   r   r   r   $insert_overlapping_error_value_checkprimitive_callr   r?   is_voidnegatedr
   traceback_entry)r*   r8   r9   
new_blocksr2   r-   	cur_blockr1   r&   target	new_blockvariantrH   comp
new_block2branchs                   r'   r/   r/   @   s    $&J  A& A&i		)$$$ )B-B" 6	& 6	&BFM  $$$"j)) 3&bmy.H.H&LL	!!),,,=I--$oG#GG]i//$kG"GG]j00$kG"G %Q88FF]&;;;?	vVVD!+J%%j111##-$-!;!  F M((000 *I+ORMMFM((000$oG"GGI"9BM"IIII =J..!zGG+GGGG{	g\^\c   ")7222y7L.7-AF*$$V,,,%	m6	&p r)   descr   argslist[Value]r?   intr   c           	     ^    t          | j        g | j        | j        | j        | j        |          S r#   )r   c_function_namereturn_typestealsis_borrowedrB   )rR   rS   r?   s      r'   rF   rF      s6    
  r)   r2   c                .   | j         D ]}t          |t                    r0|j        j                            |j                  rt          |_        t          |t                    r0|j        j                            |j                  rt          |_        dS )zInfer more precise error_kind attributes for ops.

    We have access here to more information than what was available
    when the IR was initially built.
    N)
r-   rA   r   
class_typeclass_iris_always_definedattrr	   rB   r   )r2   r&   s     r'   r+   r+      s     i * *b'"" 	*}%77@@ * )b'"" 	*}%77@@ * )* *r)   r-   list[Op]rL   r   r   c                   |j         }t          |t                    r5t          |d          }|                     |           t          | |          S t          |j                   r"t          t          |j	                            }n#t          t          |j	                  |          }t          ||t          j                  }|                     |           |S )z6Append to ops to check for an overlapping error value.r   )rtype)typerA   r   r   r5   rE   r   r   floatc_undefinedr   rU   r   EQ)r-   rL   typitemerrvaluer&   s         r'   rE   rE      s    
+C#v ""

43C>>> v{++ 	@U3?3344HHs3?333???H&(LO<<

2	r)   N)r   r   r   r    )r   r   r   r   )r*   r7   r8   r   r9   r:   r   r7   )rR   r   rS   rT   r?   rU   r   r   )r2   r   r   r    )r-   r`   rL   r   r   r   )(__doc__
__future__r   mypyc.ir.func_irr   mypyc.ir.opsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   mypyc.ir.rtypesr   r   r   mypyc.primitives.exc_opsr   mypyc.primitives.registryr   r3   r.   r/   rF   r+   rE    r)   r'   <module>rr      s  	 	 # " " " " " # # # # # #                                           , I H H H H H H H H H 4 4 4 4 4 4 : : : : : :
V 
V 
V 
V   I I I IX	 	 	 	* * * *     r)   