
    X-Ph                       d dl mZ d dlZd dlmZ d dlmZmZ d dlm	Z	m
Z
 d dlmZmZ d dlmZ d dlmZmZ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"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/m0Z0m1Z1m2Z2m3Z3 d d
l4m5Z5 d dl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF d dlGmHZH d dlImJZJ d dlKmLZLmMZMmNZNmOZO d dlPmQZQ d dlRmSZSmTZTmUZU d dlVmWZW d dlXmYZY d dlZm[Z[  G d dej\                  Z] G d dej\                  Z^dS )    )annotationsN)assert_string_arrays_equal)EmitterEmitterContext)FunctionEmitterVisitorgenerate_native_function)HAVE_IMMORTALPLATFORM_SIZE)ClassIR)FuncDeclFuncIRFuncSignature
RuntimeArg)	ERR_NEVERAssignAssignMulti
BasicBlockBoxBranchCallCallCCastComparisonOpDecRefExtendGetAttrGetElementPtrGotoIncRefIntegerIntOpLoadAddressLoadLiteralLoadMemOpRegisterReturnSetAttrSetMemTupleGetUnboxUnreachableValue)generate_names_for_ir)RArray	RInstanceRStructRTupleRTypebool_rprimitivec_int_rprimitivedict_rprimitiveint32_rprimitiveint64_rprimitiveint_rprimitivelist_rprimitivenone_rprimitiveobject_rprimitivepointer_rprimitiveshort_int_rprimitive)compute_vtable)NameGenerator)dict_get_item_opdict_new_opdict_set_item_opdict_update_op)
int_neg_op)list_append_oplist_get_item_oplist_set_item_op)none_object_op)
binary_ops)
is_subtypec                  8   e Zd ZdZdYdZdYdZdYdZdYdZdYdZdYd	Z	dYd
Z
dYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYdZdYd Z dYd!Z!dYd"Z"dYd#Z#dYd$Z$dYd%Z%dYd&Z&dYd'Z'dYd(Z(dYd)Z)dYd*Z*dYd+Z+dYd,Z,dYd-Z-dYd.Z.dYd/Z/dYd0Z0dYd1Z1dYd2Z2dYd3Z3dYd4Z4dYd5Z5dYd6Z6dYd7Z7dYd8Z8dYd9Z9dYd:Z:dYd;Z;dYd<Z<dYd=Z=dYd>Z>dYd?Z?dYd@Z@dYdAZAdYdBZBdYdCZCdYdDZD	 dZdFdEdFdGd[dSZEd\dXZFdES )]TestFunctionEmitterVisitorz9Test generation of fragments of C from individual IR ops.returnNonec           	          g  _         d! fd} |dt                     _         |d	t                     _         |d
t                     _         |dt
                     _         |dt
                     _         |dt                     _	         |dt                     _
         |dt                     _         |dt                     _         |dt                     _         |dt                     _         |dt$                     _         |dt$                     _         |dt*                     _         |dt*                     _         |dt0                     _         |dt5          t          t          g                     _         |dt5          t5          t          t          g          t          g                     _        t;          dd          }t          t          t*          t$          d|_        ddg|_        tA          |           |g|_!         |dtE          |                     _#         |d tH                     _%        tM          tO          dgg                     _(        d S )"Nnamestrrtyper3   rN   r&   c                \    t          ||           }j                            |           |S N)r&   	registersappend)rQ   rS   regselfs      X/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mypyc/test/test_emitfunc.py	add_localz3TestFunctionEmitterVisitor.setUp.<locals>.add_localS   s-    5$''CN!!#&&&J    nmkllloo2dbs1s2i32i32_1i64i64_1ptrtttAmod)xyi1i2rs   rt   rnone)rQ   rR   rS   r3   rN   r&   ))rV   r9   r]   r^   r_   r:   r`   ra   r<   rb   rc   r6   rd   r4   re   r>   rf   rg   r7   rh   ri   r8   rj   rk   r=   rl   r2   rm   rn   r   
attributesbitmap_attrsr?   mror0   ru   r;   rv   r   r@   context)rY   r[   irs   `  rZ   setUpz TestFunctionEmitterVisitor.setUpP   sO   )+	 	 	 	 	 	
 3//3//3//300)D/223 122)D"344300300)D"677)D"6779U$455Yw(899
9U$455Yw(899
9U$6773'H I IJJ)&&./!BCC_UVV
 
 S%   ""	
 
  ,r3	"..Ifo66	%meWI&>&>??r\   c                f    |                      t          t          d                    d           d S )N   zgoto CPyL2;)assert_emitr   r   rY   s    rZ   	test_gotoz$TestFunctionEmitterVisitor.test_goto{   s,    jmm,,m<<<<<r\   c                n    t          d          }|                     t          |          d|           d S )Nr~    
next_block)r   r   r   )rY   r   s     rZ   test_goto_next_blockz/TestFunctionEmitterVisitor.test_goto_next_block~   s6    ]]
j))2*EEEEEr\   c                V    |                      t          | j                  d           d S )Nzreturn cpy_r_m;)r   r'   r^   r   s    rZ   test_returnz&TestFunctionEmitterVisitor.test_return   s'    ):;;;;;r\   c           	         |                      t          | j        t          d                    d           |                      t          | j        t          dt
                              d           d S )N   zcpy_r_n = 10;zcpy_r_i32 = 5;)r   r   r]   r    rh   r5   r   s    rZ   test_integerz'TestFunctionEmitterVisitor.test_integer   s^    

33_EEE'!5E*F*FGGIYZZZZZr\   c                Z    |                      t          | j        dd          d           d S )N   r   zcpy_r_r0 = cpy_r_t.f1;)r   r*   rm   r   s    rZ   test_tuple_getz)TestFunctionEmitterVisitor.test_tuple_get   s-    $&!Q//1IJJJJJr\   c                x    |                      t          t          j        t          j        d          d           d S )Nr   z'cpy_r_r0 = (PyObject *)&_Py_NoneStruct;)r   r"   rI   typesrcr   s    rZ   test_load_Nonez)TestFunctionEmitterVisitor.test_load_None   s<    +^-?CC5	
 	
 	
 	
 	
r\   c                b    |                      t          | j        | j                  d           d S )Nzcpy_r_m = cpy_r_n;)r   r   r^   r]   r   s    rZ   test_assign_intz*TestFunctionEmitterVisitor.test_assign_int   s-    //1EFFFFFr\   c                V    |                      d| j        | j        | j        d           d S )N+z+cpy_r_r0 = CPyTagged_Add(cpy_r_m, cpy_r_k);assert_emit_binary_opr]   r^   r_   r   s    rZ   test_int_addz'TestFunctionEmitterVisitor.test_int_add   s6    "")V	
 	
 	
 	
 	
r\   c                V    |                      d| j        | j        | j        d           d S )N-z0cpy_r_r0 = CPyTagged_Subtract(cpy_r_m, cpy_r_k);r   r   s    rZ   test_int_subz'TestFunctionEmitterVisitor.test_int_sub   s6    "")[	
 	
 	
 	
 	
r\   c                    t           j        J |                     t          t           j        | j        gt           j        t           j        t           j        t           j        t           j        d          d           d S )N7   z%cpy_r_r0 = CPyTagged_Negate(cpy_r_m);)	rE   c_function_namer   r   r^   return_typestealsis_borrowed
error_kindr   s    rZ   test_int_negz'TestFunctionEmitterVisitor.test_int_neg   ss    )555*&!&&%	 	 4	
 	
 	
 	
 	
r\   c           	     T   |                      t          | j        t          d          t          d          t          j                  d           t          | j        t          d          t          d          t          j                  }d|_        |                      |d           d S )N   	   zif (cpy_r_b) {
                                goto CPyL8;
                            } else
                                goto CPyL9;
                         Tzif (!cpy_r_b) {
                                goto CPyL8;
                            } else
                                goto CPyL9;
                         r   r   re   r   BOOLnegatedrY   re   s     rZ   test_branchz&TestFunctionEmitterVisitor.test_branch   s    46:a==*Q--EE	
 	
 	
 46:a==*Q--EE		
 	
 	
 	
 	
r\   c                h   t          d          }t          | j        t          d          |t          j                  }|                     |d|           t          d          }t          | j        t          d          |t          j                  }d|_        |                     |d|           d S )Nr   r   zif (cpy_r_b) goto CPyL8;r   Tzif (!cpy_r_b) goto CPyL8;r   r   re   r   r   r   rY   r   re   s      rZ   test_branch_no_elsez.TestFunctionEmitterVisitor.test_branch_no_else   s    ]]
46:a==*fkBB:zRRR]]
46:a==*fkBB	;
SSSSSr\   c                h   t          d          }t          | j        |t          d          t          j                  }|                     |d|           t          d          }t          | j        |t          d          t          j                  }d|_        |                     |d|           d S )Nr   r~   zif (!cpy_r_b) goto CPyL2;r   Tzif (cpy_r_b) goto CPyL2;r   r   s      rZ   test_branch_no_else_negatedz6TestFunctionEmitterVisitor.test_branch_no_else_negated   s    ]]
46:z!}}fkBB;
SSS]]
46:z!}}fkBB	:zRRRRRr\   c                X   t          | j        t          d          t          d          t           j                  }|                     |d           t          | j        t          d          t          d          t           j                  }d|_        |                     |d           d S )Nr   r   zif (cpy_r_b == 2) {
                                goto CPyL8;
                            } else
                                goto CPyL9;
                         Tzif (cpy_r_b != 2) {
                                goto CPyL8;
                            } else
                                goto CPyL9;
                         )r   re   r   IS_ERRORr   r   r   s     rZ   test_branch_is_errorz/TestFunctionEmitterVisitor.test_branch_is_error   s    46:a==*Q--II	
 	
 	
 46:a==*Q--II		
 	
 	
 	
 	
r\   c                J   t          d          }t          | j        |t          d          t          j                  }|                     |d|           t          | j        |t          d          t          j                  }d|_        |                     |d|           d S )Nr   r   zif (cpy_r_b != 2) goto CPyL9;r   Tzif (cpy_r_b == 2) goto CPyL9;)r   r   re   r   r   r   r   s      rZ   test_branch_is_error_next_blockz:TestFunctionEmitterVisitor.test_branch_is_error_next_block   s    ]]
46:z!}}foFF?JWWW46:z!}}foFF	?JWWWWWr\   c           	        |                      t          | j        t          d          t          d          t          j        d          d           t          d          }|                      t          | j        t          d          |t          j        d          d|           t          d          }t          | j        |t          d          t          j        d          }|                      |d|           t          d          }t          | j        |t          d          t          j        d          }d|_        |                      |d	|           d S )
Nr   r   Trarezif (unlikely(cpy_r_b)) {
                                goto CPyL8;
                            } else
                                goto CPyL9;
                         z"if (unlikely(cpy_r_b)) goto CPyL8;r   z!if (likely(!cpy_r_b)) goto CPyL9;z if (likely(cpy_r_b)) goto CPyL9;r   r   s      rZ   test_branch_rarez+TestFunctionEmitterVisitor.test_branch_rare   s7   46:a==*Q--4PPP	
 	
 	
  ]]
46:a==*fkMMM4! 	 	
 	
 	

  ]]
46:z!}}fkMMMCPZ[[[]]
46:z!}}fkMMM	BzZZZZZr\   c                    t          dd dt          t          dt                    gt                              }|                     t          || j        gd          d           d S )Nmyfnrp   r^   r   z cpy_r_r0 = CPyDef_myfn(cpy_r_m);)r   r   r   r9   r   r   r^   rY   decls     rZ   	test_callz$TestFunctionEmitterVisitor.test_call	  sa    D%
30O0O/PR`!a!a
 
 	dTVHb113UVVVVVr\   c                   t          dd dt          t          dt                    t          dt                    gt                              }|                     t          || j        | j        gd          d           d S )Nr   rp   r^   r]   r   z)cpy_r_r0 = CPyDef_myfn(cpy_r_m, cpy_r_k);)r   r   r   r9   r   r   r^   r_   r   s     rZ   test_call_two_argsz-TestFunctionEmitterVisitor.test_call_two_args  s    C00*S.2Q2QRTb 	
 
 	',,.Y	
 	
 	
 	
 	
r\   c                    |                      t          | j                  d           |                      t          | j                  dd           d S )NzCPy_INCREF(cpy_r_o);Tr   )r   r   rb   r   s    rZ   test_inc_refz'TestFunctionEmitterVisitor.test_inc_ref  K    )?@@@)?dKKKKKr\   c                    |                      t          | j                  d           |                      t          | j                  dd           d S )NzCPy_DECREF(cpy_r_o);zCPy_DecRef(cpy_r_o);Tr   )r   r   rb   r   s    rZ   test_dec_refz'TestFunctionEmitterVisitor.test_dec_ref   r   r\   c                    |                      t          | j                  d           |                      t          | j                  dd           d S )NzCPyTagged_INCREF(cpy_r_m);zCPyTagged_IncRef(cpy_r_m);Tr   )r   r   r^   r   s    rZ   test_inc_ref_intz+TestFunctionEmitterVisitor.test_inc_ref_int$  K    )EFFF)EDQQQQQr\   c                    |                      t          | j                  d           |                      t          | j                  dd           d S )NzCPyTagged_DECREF(cpy_r_m);zCPyTagged_DecRef(cpy_r_m);Tr   )r   r   r^   r   s    rZ   test_dec_ref_intz+TestFunctionEmitterVisitor.test_dec_ref_int(  r   r\   c                V    |                      t          | j                  d           d S )NzCPyTagged_DECREF(cpy_r_t.f0);)r   r   rm   r   s    rZ   test_dec_ref_tuplez-TestFunctionEmitterVisitor.test_dec_ref_tuple,  s'    )HIIIIIr\   c                V    |                      t          | j                  d           d S )Nz!CPyTagged_DECREF(cpy_r_tt.f0.f0);)r   r   rn   r   s    rZ   test_dec_ref_tuple_nestedz4TestFunctionEmitterVisitor.test_dec_ref_tuple_nested/  s'    *MNNNNNr\   c                    |                      t          t          t          j                  | j        | j        gt          j        t          j        t          j	        t          j
        d          d           d S )Nr   z-cpy_r_r0 = CPyList_GetItem(cpy_r_m, cpy_r_k);)r   r   rR   rG   r   r^   r_   r   r   r   r   r   s    rZ   test_list_get_itemz-TestFunctionEmitterVisitor.test_list_get_item2  sm    $455  , ' , +  @	
 	
 	
 	
 	
r\   c                    |                      t          t          t          j                  | j        | j        | j        gt          j        t          j	        t          j
        t          j        d          d           d S )Nr   z6cpy_r_r0 = CPyList_SetItem(cpy_r_l, cpy_r_n, cpy_r_o);)r   r   rR   rH   r   r`   r]   rb   r   r   r   r   r   s    rZ   test_list_set_itemz-TestFunctionEmitterVisitor.test_list_set_item@  sq    $455( , ' , +  I	
 	
 	
 	
 	
r\   c                V    |                      t          | j                  d           d S )Nz,cpy_r_r0 = CPyTagged_StealAsObject(cpy_r_n);)r   r   r]   r   s    rZ   test_box_intz'TestFunctionEmitterVisitor.test_box_intN  s'    TV&XYYYYYr\   c                d    |                      t          | j        t          d          d           d S )Nr   a  if (likely(PyLong_Check(cpy_r_m)))
                                cpy_r_r0 = CPyTagged_FromObject(cpy_r_m);
                            else {
                                CPy_TypeError("int", cpy_r_m); cpy_r_r0 = CPY_INT_TAG;
                            }
                         )r   r+   r^   r9   r   s    rZ   test_unbox_intz)TestFunctionEmitterVisitor.test_unbox_intQ  s:    $&."--	
 	
 	
 	
 	
r\   c                V    |                      t          | j                  d           d S )Nz*cpy_r_r0 = PyLong_FromLongLong(cpy_r_i64);)r   r   rj   r   s    rZ   test_box_i64z'TestFunctionEmitterVisitor.test_box_i64\  s'    TX(XYYYYYr\   c                d    |                      t          | j        t          d          d           d S )Nr   z$cpy_r_r0 = CPyLong_AsInt64(cpy_r_o);)r   r+   rb   r8   r   s    rZ   test_unbox_i64z)TestFunctionEmitterVisitor.test_unbox_i64_  s9    $&*B//1[	
 	
 	
 	
 	
r\   c                    |                      t          t          t          j                  | j        | j        gt          j        t          j        t          j	        t          j
        d          d           d S )Nr   z+cpy_r_r0 = PyList_Append(cpy_r_l, cpy_r_o);)r   r   rR   rF   r   r`   rb   r   r   r   r   r   s    rZ   test_list_appendz+TestFunctionEmitterVisitor.test_list_appendd  sk    N233 *%*)  >	
 	
 	
 	
 	
r\   c                Z    |                      t          | j        dd          d           d S )Nrr   r   a#  cpy_r_r0 = ((mod___AObject *)cpy_r_r)->_y;
               if (unlikely(cpy_r_r0 == CPY_INT_TAG)) {
                   PyErr_SetString(PyExc_AttributeError, "attribute 'y' of 'A' undefined");
               } else {
                   CPyTagged_INCREF(cpy_r_r0);
               }
            r   r   ru   r   s    rZ   test_get_attrz(TestFunctionEmitterVisitor.test_get_attrr  s:    DFC##		
 		
 		
 		
 		
r\   c                Z    |                      t          | j        dd          d           d S )Nrq   r   zcpy_r_r0 = ((mod___AObject *)cpy_r_r)->_x;
               if (unlikely(cpy_r_r0 == 2)) {
                   PyErr_SetString(PyExc_AttributeError, "attribute 'x' of 'A' undefined");
               }
            r   r   s    rZ   test_get_attr_non_refcountedz7TestFunctionEmitterVisitor.test_get_attr_non_refcounted~  s:    DFC##	
 	
 	
 	
 	
r\   c                    t          | j        dd          }t          |t          d          t          d          t          j                  }d|_        |                     |d|d           d S )	Nrr   r   r   r   foobar{   aD              cpy_r_r0 = ((mod___AObject *)cpy_r_r)->_y;
            if (unlikely(cpy_r_r0 == CPY_INT_TAG)) {
                CPy_AttributeError("prog.py", "foobar", "A", "y", 123, CPyStatic_prog___globals);
                goto CPyL8;
            }
            CPyTagged_INCREF(cpy_r_r0);
            goto CPyL9;
            T)next_branch	skip_next)r   ru   r   r   r   traceback_entryr   rY   opbranchs      rZ   test_get_attr_mergedz/TestFunctionEmitterVisitor.test_get_attr_merged  su    TVS!$$JqMM:a==&/JJ!0  	 	
 	
 	
 	
 	
r\   c                Z    |                      t          | j        dd          d           d S )Nrs   r   a  cpy_r_r0 = ((mod___AObject *)cpy_r_r)->_i1;
               if (unlikely(cpy_r_r0 == -113) && !(((mod___AObject *)cpy_r_r)->bitmap & 1)) {
                   PyErr_SetString(PyExc_AttributeError, "attribute 'i1' of 'A' undefined");
               }
            r   r   s    rZ   test_get_attr_with_bitmapz4TestFunctionEmitterVisitor.test_get_attr_with_bitmap  s:    DFD!$$	
 	
 	
 	
 	
r\   c                f    |                      t          | j        d| j        d          d           d S )Nrr   r   zif (((mod___AObject *)cpy_r_r)->_y != CPY_INT_TAG) {
                   CPyTagged_DECREF(((mod___AObject *)cpy_r_r)->_y);
               }
               ((mod___AObject *)cpy_r_r)->_y = cpy_r_m;
               cpy_r_r0 = 1;
            )r   r(   ru   r^   r   s    rZ   test_set_attrz(TestFunctionEmitterVisitor.test_set_attr  s>    DFC++	
 	
 	
 	
 	
r\   c                f    |                      t          | j        d| j        d          d           d S )Nrq   r   zS((mod___AObject *)cpy_r_r)->_x = cpy_r_b;
               cpy_r_r0 = 1;
            )r   r(   ru   re   r   s    rZ   test_set_attr_non_refcountedz7TestFunctionEmitterVisitor.test_set_attr_non_refcounted  s>    DFC++	
 	
 	
 	
 	
r\   c                    t          | j        d| j        d          }t          |_        |                     |d           d S )Nrr   r   zif (((mod___AObject *)cpy_r_r)->_y != CPY_INT_TAG) {
                   CPyTagged_DECREF(((mod___AObject *)cpy_r_r)->_y);
               }
               ((mod___AObject *)cpy_r_r)->_y = cpy_r_m;
            )r(   ru   r^   r   r   r   rY   r   s     rZ   test_set_attr_no_errorz1TestFunctionEmitterVisitor.test_set_attr_no_error  sJ    TVS$&!,,!	
 	
 	
 	
 	
r\   c                    t          | j        d| j        d          }t          |_        |                     |d           d S )Nrq   r   z6((mod___AObject *)cpy_r_r)->_x = cpy_r_b;
            )r(   ru   re   r   r   r   r   s     rZ   %test_set_attr_non_refcounted_no_errorz@TestFunctionEmitterVisitor.test_set_attr_non_refcounted_no_error  sJ    TVS$&!,,!	
 	
 	
 	
 	
r\   c                    |                      t          | j        d| j        d          d           |                      t          | j        d| j        d          d           d S )Nrs   r   if (unlikely(cpy_r_i64 == -113)) {
                   ((mod___AObject *)cpy_r_r)->bitmap |= 1;
               }
               ((mod___AObject *)cpy_r_r)->_i1 = cpy_r_i64;
               cpy_r_r0 = 1;
            rt   zif (unlikely(cpy_r_i32 == -113)) {
                   ((mod___AObject *)cpy_r_r)->bitmap |= 2;
               }
               ((mod___AObject *)cpy_r_r)->_i2 = cpy_r_i32;
               cpy_r_r0 = 1;
            )r   r(   ru   rj   rh   r   s    rZ   test_set_attr_with_bitmapz4TestFunctionEmitterVisitor.test_set_attr_with_bitmap  st     	DFD$(A..	
 	
 	
 	DFD$(A..	
 	
 	
 	
 	
r\   c                x    t          | j        d| j        d          }d|_        |                     |d           d S )Nrs   r   Tr   )r(   ru   rj   is_initr   r   s     rZ   test_set_attr_init_with_bitmapz9TestFunctionEmitterVisitor.test_set_attr_init_with_bitmap  sJ    TVT48Q//
	
 	
 	
 	
 	
r\   c                    |                      t          t          t          j                  | j        | j        gt          j        t          j        t          j	        t          j
        d          d           d S )Nr   z.cpy_r_r0 = CPyDict_GetItem(cpy_r_d, cpy_r_o2);)r   r   rR   rA   r   rd   rc   r   r   r   r   r   s    rZ   test_dict_get_itemz-TestFunctionEmitterVisitor.test_dict_get_item  sm    $455! , ' , +  A	
 	
 	
 	
 	
r\   c                    |                      t          t          t          j                  | j        | j        | j        gt          j        t          j	        t          j
        t          j        d          d           d S )Nr   z7cpy_r_r0 = CPyDict_SetItem(cpy_r_d, cpy_r_o, cpy_r_o2);)r   r   rR   rC   r   rd   rb   rc   r   r   r   r   r   s    rZ   test_dict_set_itemz-TestFunctionEmitterVisitor.test_dict_set_item  sq    $455) , ' , +  J	
 	
 	
 	
 	
r\   c                    |                      t          t          t          j                  | j        | j        gt          j        t          j        t          j	        t          j
        d          d           d S )Nr   z,cpy_r_r0 = CPyDict_Update(cpy_r_d, cpy_r_o);)r   r   rR   rD   r   rd   rb   r   r   r   r   r   s    rZ   test_dict_updatez+TestFunctionEmitterVisitor.test_dict_update  sk    N233 *%*)  ?	
 	
 	
 	
 	
r\   c                    |                      t          t          j        g t          j        t          j        t          j        t          j        d          d           d S )Nr   zcpy_r_r0 = PyDict_New();)r   r   rB   r   r   r   r   r   r   s    rZ   test_new_dictz(TestFunctionEmitterVisitor.test_new_dict  sZ    +'"'&  +	
 	
 	
 	
 	
r\   c                V    |                      d| j        | j        | j        d           d S )Ninz-cpy_r_r0 = PyDict_Contains(cpy_r_d, cpy_r_o);)r   re   rb   rd   r   s    rZ   test_dict_containsz-TestFunctionEmitterVisitor.test_dict_contains(  s6    ""$&$&$&*]	
 	
 	
 	
 	
r\   c           	        |                      t          t          | j        | j        t          j        d          d           |                      t          t          | j        | j        t          j        d          d           |                      t          t          | j        | j        t          j        d          d           |                      t          t          | j        | j        t          j        d          d           |                      t          t          | j        | j        t          j	        d          d           |                      t          t          | j        | j        t          j
        d          d           |                      t          t          | j        | j        t          j        d          d           |                      t          t          | j        | j        t          j        d          d	           |                      t          t          | j        | j        t          j        d          d
           |                      t          t          | j        | j        t          j        d          d           |                      t          t          | j        | j        t          j        d          d           d S )Nr   zcpy_r_r0 = cpy_r_s1 + cpy_r_s2;zcpy_r_r0 = cpy_r_s1 - cpy_r_s2;zcpy_r_r0 = cpy_r_s1 * cpy_r_s2;zcpy_r_r0 = cpy_r_s1 / cpy_r_s2;zcpy_r_r0 = cpy_r_s1 % cpy_r_s2;zcpy_r_r0 = cpy_r_s1 & cpy_r_s2;zcpy_r_r0 = cpy_r_s1 | cpy_r_s2;zcpy_r_r0 = cpy_r_s1 ^ cpy_r_s2;z cpy_r_r0 = cpy_r_s1 << cpy_r_s2;z8cpy_r_r0 = (Py_ssize_t)cpy_r_s1 >> (Py_ssize_t)cpy_r_s2;z$cpy_r_r0 = cpy_r_i64 >> cpy_r_i64_1;)r   r!   r>   rf   rg   ADDSUBMULDIVMODANDORXOR
LEFT_SHIFTRIGHT_SHIFTrj   rk   r   s    rZ   test_int_opz&TestFunctionEmitterVisitor.test_int_op-  sk   &%)QGG1	
 	
 	
 	&%)QGG1	
 	
 	
 	&%)QGG1	
 	
 	
 	&%)QGG1	
 	
 	
 	&%)QGG1	
 	
 	
 	&%)QGG1	
 	
 	
 	&%(AFF1	
 	
 	
 	&%)QGG1	
 	
 	
 	&%:JANN2	
 	
 	
 	&%:KQOOJ	
 	
 	
 	&$*e>OQRSS6	
 	
 	
 	
 	
r\   c                   |                      t          | j        | j        t          j        d          d           |                      t          | j        | j        t          j        d          d           |                      t          | j        | j        t          j        d          d           |                      t          | j        | j        t          j	        d          d           |                      t          | j        | j        t          j	        d          d           |                      t          | j        | j        t          j	        d          d           |                      t          | j
        | j        t          j        d          d           |                      t          | j
        | j        t          j        d          d	           d S )
Nr   z7cpy_r_r0 = (Py_ssize_t)cpy_r_s1 < (Py_ssize_t)cpy_r_s2;z#cpy_r_r0 = cpy_r_i32 < cpy_r_i32_1;z#cpy_r_r0 = cpy_r_i64 < cpy_r_i64_1;zcpy_r_r0 = cpy_r_s1 < cpy_r_s2;z7cpy_r_r0 = (uint32_t)cpy_r_i32 < (uint32_t)cpy_r_i32_1;z7cpy_r_r0 = (uint64_t)cpy_r_i64 < (uint64_t)cpy_r_i64_1;zcpy_r_r0 = cpy_r_o == cpy_r_o2;zcpy_r_r0 = cpy_r_o != cpy_r_o2;)r   r   rf   rg   SLTrh   ri   rj   rk   ULTrb   rc   EQNEQr   s    rZ   test_comparison_opz-TestFunctionEmitterVisitor.test_comparison_op[  s   $'<+;Q??I	
 	
 	
 	4:|/?CC5	
 	
 	
 	4:|/?CC5	
 	
 	

 	$'<+;Q??1	
 	
 	
 	4:|/?CCI	
 	
 	
 	4:|/?CCI	
 	
 	
 	,/1==1	
 	
 	
 	,*:A>>1	
 	
 	
 	
 	
r\   c                b    |                      t          t          | j                  d           d S )Nzcpy_r_r0 = *(char *)cpy_r_ptr;)r   r$   r4   rl   r   s    rZ   test_load_memz(TestFunctionEmitterVisitor.test_load_mem  s+    $(;;=abbbbbr\   c                n    |                      t          t          | j        | j                  d           d S )Nz*(char *)cpy_r_ptr = cpy_r_b;)r   r)   r4   rl   re   r   s    rZ   test_set_memz'TestFunctionEmitterVisitor.test_set_mem  s:    ?DHdf557Z	
 	
 	
 	
 	
r\   c                L   t          dg dt          t          t          g          }|                     t          | j        |d          d           |                     t          | j        |d          d           |                     t          | j        |d          d           d S )	NFoo)re   rh   rj   re   z(cpy_r_r0 = (CPyPtr)&((Foo *)cpy_r_o)->b;rh   z*cpy_r_r0 = (CPyPtr)&((Foo *)cpy_r_o)->i32;rj   z*cpy_r_r0 = (CPyPtr)&((Foo *)cpy_r_o)->i64;)r1   r4   r7   r8   r   r   rb   )rY   ru   s     rZ   test_get_element_ptrz/TestFunctionEmitterVisitor.test_get_element_ptr  s    &&&:JL\(]
 
 	$&!S))+Y	
 	
 	
 	$&!U++-]	
 	
 	
 	$&!U++-]	
 	
 	
 	
 	
r\   c                X    |                      t          t          d          d           d S )NPyDict_Typez$cpy_r_r0 = (PyObject *)&PyDict_Type;)r   r"   r<   r   s    rZ   test_load_addressz,TestFunctionEmitterVisitor.test_load_address  s5    )=996	
 	
 	
 	
 	
r\   c                    t          t          d          }t          |d          }| j                            |           |                     t          || j        | j        g          d           d S )Nr~   az+PyObject *cpy_r_a[2] = {cpy_r_o, cpy_r_o2};)	r/   r<   r&   rV   rW   r   r   rb   rc   )rY   rm   r(  s      rZ   test_assign_multiz,TestFunctionEmitterVisitor.test_assign_multi  sr    $a((Qa   DFDG,--/`	
 	
 	
 	
 	
r\   c           	        t          t          d          }|                     t          |t	          dt                              d           |                     t          |t	          dt                              d           d S )Nr(  l        zcpy_r_a = 2147483648LL;izcpy_r_a = 2147483647;r&   r8   r   r   r    rY   r(  s     rZ   test_long_unsignedz-TestFunctionEmitterVisitor.test_long_unsigned  s    %s++1gg'78899;X	
 	
 	
 	1gm-=>>??A\	
 	
 	
 	
 	
r\   c           	        t          t          d          }|                     t          |t	          dt                              d           |                     t          |t	          dt                              d           d S )Nr(  i  zcpy_r_a = -2147483647;i   zcpy_r_a = -2147483648LL;r+  r,  s     rZ   test_long_signedz+TestFunctionEmitterVisitor.test_long_signed  s    %s++1gn.>??@@B^	
 	
 	
 	1gj*:;;<<>\	
 	
 	
 	
 	
r\   c                    t          | j        t          d          }t          d          }t	          |t          d          |t          j                  }d|_        |                     |d||d           d S )Nr   r   r   r   zif (likely(PyDict_Check(cpy_r_r)))
    cpy_r_r0 = cpy_r_r;
else {
    CPy_TypeErrorTraceback("prog.py", "foobar", 123, CPyStatic_prog___globals, "dict", cpy_r_r);
    goto CPyL8;
}
Tr   r   r   )r   ru   r6   r   r   r   r   r   rY   r   r   r   s       rZ   test_cast_and_branch_mergez5TestFunctionEmitterVisitor.test_cast_and_branch_merge  s}    $&/1--]]
JqMM:vGG!0 " 	 	
 	
 	
 	
 	
r\   c                   t          | j        t          d          }t          |t	          d          t	          d          t          j                  }d|_        |                     |dt	          d          |d           d S )	Nr   r   r   r               if (likely(PyDict_Check(cpy_r_r)))
                cpy_r_r0 = cpy_r_r;
            else {
                CPy_TypeError("dict", cpy_r_r);
                cpy_r_r0 = NULL;
            }
            
   Fr1  )r   ru   r6   r   r   r   r   r   r   s      rZ   test_cast_and_branch_no_merge_1z:TestFunctionEmitterVisitor.test_cast_and_branch_no_merge_1  s~    $&/1--JqMM:a==&/JJ!0 ""~~ 	 	
 	
 	
 	
 	
r\   c                    t          | j        t          d          }t          d          }t	          |t          d          |t          j                  }d|_        d|_        |                     |d||           d S )Nr   r   r   Tr   r5  r   r   )	r   ru   r6   r   r   r   r   r   r   r2  s       rZ   test_cast_and_branch_no_merge_2z:TestFunctionEmitterVisitor.test_cast_and_branch_no_merge_2  s    $&/1--]]
JqMM:vGG!0 " 	 	
 	
 	
 	
 	
r\   c                    t          | j        t          d          }t          d          }t	          |t          d          |t          j                  }d|_        |                     |d||           d S )Nr   r   r   r   r5  r9  )r   ru   r6   r   r   r   r   r   r2  s       rZ   test_cast_and_branch_no_merge_3z:TestFunctionEmitterVisitor.test_cast_and_branch_no_merge_3  sz    $&/1--]]
JqMM:v{CC!0 " 	 	
 	
 	
 	
 	
r\   c                    t          | j        t          d          }t          d          }t	          |t          d          |t          j                  }|                     |d||           d S )Nr   r   r   r5  r9  )r   ru   r6   r   r   r   r   r2  s       rZ   test_cast_and_branch_no_merge_4z:TestFunctionEmitterVisitor.test_cast_and_branch_no_merge_4  sr    $&/1--]]
JqMM:vGG " 	 	
 	
 	
 	
 	
r\   c                x   t          t          d          }|                     t          |t          d          d           |                     t          |t          d          d           t
          dk    r`|                     t          | j        t          d          d           |                     t          | j        t          d          d	           t
          d
k    rX|                     t          |t          d          d           |                     t          |t          d          d           d S d S )Nr(  T)signedzcpy_r_r0 = cpy_r_a;Fzcpy_r_r0 = (uint32_t)cpy_r_a;   zcpy_r_r0 = (Py_ssize_t)cpy_r_n;zcpy_r_r0 = cpy_r_n;r   )r&   r7   r   r   r8   r
   r]   r9   r,  s     rZ   test_extendz&TestFunctionEmitterVisitor.test_extend  sH   %s++#3DAAAC\]]]1&u5557Z	
 	
 	
 Atv/===5   tv/>>>@Y   AVA~dCCCE^___q.7779\     r\   c                    t          | j                  }|                     |t          |          gt          rdnd           d S Nr   CPy_INCREF(cpy_r_r0);)r   rv   r   r   r	   r   s     rZ   test_inc_ref_nonez,TestFunctionEmitterVisitor.test_inc_ref_none+  s?    	NN!VAYY})YBYZZZZZr\   c                    t          | j                  }|                     |t          |          gt          rdnd           d S rD  )r   re   r   r   r	   r   s     rZ   test_inc_ref_boolz,TestFunctionEmitterVisitor.test_inc_ref_bool/  s?    KK!VAYY})YBYZZZZZr\   c                   dD ]E}t          |t                    }|                     |t          |          gt          rdnd           FdD ]<}t          |t                    }|                     |t          |          gd           =d S )N)r   r   r         r   rE  )iii  ilX)r#   r<   r   r   r	   )rY   rq   re   s      rZ   test_inc_ref_int_literalz3TestFunctionEmitterVisitor.test_inc_ref_int_literal3  s    & 	_ 	_AA011Aa^=-]RRF]^^^^- 	F 	FAA011Aa^-DEEEE	F 	Fr\   NF)r   r   r   r   Op | list[Op]expectedrR   r   BasicBlock | Noner   boolr   Branch | Noner   c               ~   t          d          }t          |t                    r|j                            |           n"|j                            |           |d         }t          | j        |g          }t          | j	        |          }	t          | j	        |          }
g |	_
        g |
_
        t          |	|
dd          }||_        ||_        |r
||g|_        n|g|_        d|_        |                    |           |
j
        |	j
        z   }d |D             }t!          d |D                       sJ d |D             }|                                sg }n'|                                                    d          }d	 |D             }t)          ||d
d           |r|j        dk    sJ d S |j        dk    sJ d S )Nr   prog.pyprogc                8    g | ]}|                     d           S  strip.0lines     rZ   
<listcomp>z:TestFunctionEmitterVisitor.assert_emit.<locals>.<listcomp>\  s"    :::D

3:::r\   c              3  @   K   | ]}|                     d           V  dS )
N)endswithr\  s     rZ   	<genexpr>z9TestFunctionEmitterVisitor.assert_emit.<locals>.<genexpr>]  s.      @@44==&&@@@@@@r\   c                8    g | ]}|                     d           S )ra  )rstripr\  s     rZ   r_  z:TestFunctionEmitterVisitor.assert_emit.<locals>.<listcomp>^  s$    CCCdD))CCCr\   ra  c                8    g | ]}|                     d           S rX  rZ  r\  s     rZ   r_  z:TestFunctionEmitterVisitor.assert_emit.<locals>.<listcomp>c  s"    EEEd$**S//EEEr\   zGenerated code unexpectedT)msg	tracebackr   )r   
isinstancer%   opsrW   extendr.   rV   r   rz   	fragmentsr   r   r   op_indexacceptallr[  re  splitr   )rY   r   rO  r   r   r   r   blockvalue_namesemitterdeclarationsvisitorfragsactual_linesexpected_liness                  rZ   r   z&TestFunctionEmitterVisitor.assert_emit;  s    1b" 	IR    IR   BB+DNUGDD$,44t|[99!#(,	6RR' 	{+GKK$GK
		'&)::::E:::@@<@@@@@@@@CClCCC~~ 	;NN%__..44T::NEEnEEE"L.IUY	
 	
 	
 	
  	)#q((((((#q((((((r\   destr-   leftrightc                   |t           v rt           |         }|D ]}t          |j        |j        d                   rt          |j        |j        d                   rl||g|j        fd|j        D             |j        J |                     t          |j        |j        |j	        |j
        |j        d          |            d S d S J d            )Nr   r   c                     g | ]
}|         S  r~  )r]  iargss     rZ   r_  zDTestFunctionEmitterVisitor.assert_emit_binary_op.<locals>.<listcomp>w  s    ???AQ???r\   r   FzCould not find matching op)rJ   rK   r   	arg_typesorderingr   r   r   r   r   r   r   )	rY   r   ry  rz  r{  rO  rj  descr  s	           @rZ   r   z0TestFunctionEmitterVisitor.assert_emit_binary_opl  s    R.C  di):;; 
Jq 1A A  !%=D}0???????/;;;$$ 0  , K , O  !   FF+ . 76666r\   rN   rO   rU   )r   rN  rO  rR   r   rP  r   rQ  r   rR  r   rQ  rN   rO   )r   rR   ry  r-   rz  r-   r{  r-   rO  rR   rN   rO   )G__name__
__module____qualname____doc__r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r
  r  r  r  r   r#  r&  r)  r-  r/  r3  r7  r:  r<  r>  rB  rF  rH  rM  r   r   r~  r\   rZ   rM   rM   M   s       CC)@ )@ )@ )@V= = = =F F F F< < < <[ [ [ [K K K K
 
 
 
G G G G
 
 
 


 
 
 


 
 
 
 
 
 
 
(T T T TS S S S
 
 
 
*X X X X[ [ [ [.W W W W
 
 
 
L L L LL L L LR R R RR R R RJ J J JO O O O
 
 
 

 
 
 
Z Z Z Z	
 	
 	
 	
Z Z Z Z
 
 
 


 
 
 


 

 

 


 
 
 

 
 
 
&
 
 
 
	
 	
 	
 	

 
 
 


 

 

 


 
 
 

 
 
 
,
 
 
 

 
 
 

 
 
 

 
 
 

 
 
 

 
 
 

,
 ,
 ,
 ,
\$
 $
 $
 $
Lc c c c
 
 
 


 
 
 

 
 
 

 
 
 

 
 
 

 
 
 

 
 
 
(
 
 
 
&
 
 
 
(
 
 
 
&
 
 
 
$   ([ [ [ [[ [ [ [F F F F )-	/) %)/) /) /) /) /) /)b7 7 7 7 7 7r\   rM   c                  &    e Zd ZddZddZddZdS )TestGenerateFunctionrN   rO   c                    t          dt                    | _        t          t          d          | _        t          d          | _        d S )Nargr   )r   r9   r  r&   rX   r   rq  r   s    rZ   r|   zTestGenerateFunction.setUp  s5    e^44NE22]]


r\   c                   | j         j                            t          | j                             t          t          dd dt          | j        gt                              | j        g| j         g          }t          |j        |j                  }t          t          t          dgg                    |          }t!          ||dd           |j        }t%          g d|d           d S )Nmyfuncrp   rU  rV  )z/CPyTagged CPyDef_myfunc(CPyTagged cpy_r_arg) {
z    return cpy_r_arg;
}
Generated code invalidrg  )rq  rj  rW   r'   rX   r   r   r   r  r9   r.   arg_regsblocksr   r   r@   r   rl  r   )rY   fnrr  rs  results        rZ   test_simplez TestGenerateFunction.test_simple  s    
fTX..///XtUM48*n,U,UVVXJZL
 

 ,BKCC.y)A)ABBKPP Wi@@@""bbb(	
 	
 	
 	
 	
 	
r\   c                n   t          t                    }t          |t          d                    }| j        j                            |           | j        j                            t                                 t          t          dd dt          | j        gt                              | j        g| j        g          }t          |j        |j                  }t#          t%          t'          dgg                    |          }t)          ||dd           |j        }t-          g d|d           d S )	Nr   r  rp   rU  rV  )z/PyObject *CPyDef_myfunc(CPyTagged cpy_r_arg) {
z    CPyTagged cpy_r_r0;
z    cpy_r_r0 = 10;
z    CPy_Unreachable();
r  r  r  )r&   r9   r   r    rq  rj  rW   r,   r   r   r   r  r:   rX   r.   r  r  r   r   r@   r   rl  r   )rY   rX   r   r  rr  rs  r  s          rZ   test_registerz"TestGenerateFunction.test_register  s    ~&&C$$
b!!!
kmm,,,XtUM48*o,V,VWWXJZL
 

 ,BKCC.y)A)ABBKPP Wi@@@""   (
	
 
	
 
	
 
	
 
	
 
	
r\   Nr  )r  r  r  r|   r  r  r~  r\   rZ   r  r    sP        # # # #

 
 
 
"
 
 
 
 
 
r\   r  )_
__future__r   unittestmypy.test.helpersr   mypyc.codegen.emitr   r   mypyc.codegen.emitfuncr   r   mypyc.commonr	   r
   mypyc.ir.class_irr   mypyc.ir.func_irr   r   r   r   mypyc.ir.opsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   mypyc.ir.pprintr.   mypyc.ir.rtypesr/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   mypyc.irbuild.vtabler?   mypyc.namegenr@   mypyc.primitives.dict_opsrA   rB   rC   rD   mypyc.primitives.int_opsrE   mypyc.primitives.list_opsrF   rG   rH   mypyc.primitives.misc_opsrI   mypyc.primitives.registryrJ   mypyc.subtyperK   TestCaserM   r  r~  r\   rZ   <module>r     s   " " " " " "  8 8 8 8 8 8 6 6 6 6 6 6 6 6 S S S S S S S S 5 5 5 5 5 5 5 5 % % % % % % H H H H H H H H H H H H                                                               @ 2 1 1 1 1 1                                   $ 0 / / / / / ' ' ' ' ' '            0 / / / / / X X X X X X X X X X 4 4 4 4 4 4 0 0 0 0 0 0 $ $ $ $ $ ${7 {7 {7 {7 {7!2 {7 {7 {7|/
 /
 /
 /
 /
8, /
 /
 /
 /
 /
r\   