o
    tBhv                     @  s  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 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.m/Z/m0Z0 d d
l1m2Z2 d dl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZB d dlCmDZD d dlEmFZF d dlGmHZHmIZImJZJmKZK d dlLmMZM d dlNmOZOmPZPmQZQ d dlRmSZS d dlTmUZU d dlVmWZW G dd dejXZYG dd dejXZZdS )    )annotationsN)assert_string_arrays_equal)EmitterEmitterContext)FunctionEmitterVisitorgenerate_native_function)PLATFORM_SIZE)ClassIR)FuncDeclFuncIRFuncSignature
RuntimeArg)AssignAssignMulti
BasicBlockBoxBranchCallCallCCastComparisonOpDecRefExtendGetAttrGetElementPtrGotoIncRefIntegerIntOpLoadAddress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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                   @  sl  e Zd ZdZdddZdddZddd	Zdd
dZdddZdddZ	dddZ
dddZdddZdddZdddZdddZdddZdddZdd d!Zdd"d#Zdd$d%Zdd&d'Zdd(d)Zdd*d+Zdd,d-Zdd.d/Zdd0d1Zdd2d3Zdd4d5Zdd6d7Zdd8d9Zdd:d;Zdd<d=Z dd>d?Z!dd@dAZ"ddBdCZ#ddDdEZ$ddFdGZ%ddHdIZ&ddJdKZ'ddLdMZ(ddNdOZ)ddPdQZ*ddRdSZ+ddTdUZ,ddVdWZ-ddXdYZ.ddZd[Z/dd\d]Z0dd^d_Z1dd`daZ2ddbdcZ3ddddeZ4ddfdgZ5ddhdiZ6ddjdkZ7ddldmZ8ddndoZ9ddpdqZ:ddrdsZ;ddtduZ<	vddwdvdwdxdddZ=dddZ>dvS )TestFunctionEmitterVisitorz9Test generation of fragments of C from individual IR ops.returnNonec                   sP  g  _ d fd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t _|dtttg _|dttttgtg _tdd}ttd|_t| |g|_ |dt!| _"t#t$dgg _%d S ) Nnamestrrtyper/   rH   r"   c                   s   t || } j| |S N)r"   	registersappend)rJ   rL   regself o/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/mypyc/test/test_emitfunc.py	add_localP   s   
z3TestFunctionEmitterVisitor.setUp.<locals>.add_localnmkllloo2dbs1s2i32i32_1i64i64_1ptrtttAmod)xyr)rJ   rK   rL   r/   rH   r"   )&rN   r5   rV   rW   rX   r6   rY   rZ   r7   r[   r\   r2   r]   r0   r^   r9   r_   r`   r3   ra   rb   r4   rc   rd   r8   re   r.   rf   rg   r	   
attributesr:   mror,   rl   r   r;   context)rR   rU   irrS   rQ   rT   setUpM   s8   
z TestFunctionEmitterVisitor.setUpc                 C  s   |  ttdd d S )N   zgoto CPyL2;)assert_emitr   r   rQ   rS   rS   rT   	test_gotoq      z$TestFunctionEmitterVisitor.test_gotoc                 C  s    t d}| jt|d|d d S )Nrr    
next_block)r   rs   r   )rR   rx   rS   rS   rT   test_goto_next_blockt   s   z/TestFunctionEmitterVisitor.test_goto_next_blockc                 C     |  t| jd d S )Nzreturn cpy_r_m;)rs   r#   rW   rQ   rS   rS   rT   test_returnx      z&TestFunctionEmitterVisitor.test_returnc                 C  s6   |  t| jtdd |  t| jtdtd d S )N   zcpy_r_n = 10;zcpy_r_i32 = 5;)rs   r   rV   r   ra   r1   rQ   rS   rS   rT   test_integer{   s   z'TestFunctionEmitterVisitor.test_integerc                 C     |  t| jddd d S )N   r   zcpy_r_r0 = cpy_r_t.f1;)rs   r&   rf   rQ   rS   rS   rT   test_tuple_get      z)TestFunctionEmitterVisitor.test_tuple_getc                 C  s   |  ttjtjdd d S )Nr   z'cpy_r_r0 = (PyObject *)&_Py_NoneStruct;)rs   r   rD   typesrcrQ   rS   rS   rT   test_load_None   s   z)TestFunctionEmitterVisitor.test_load_Nonec                 C  s   |  t| j| jd d S )Nzcpy_r_m = cpy_r_n;)rs   r   rW   rV   rQ   rS   rS   rT   test_assign_int   r   z*TestFunctionEmitterVisitor.test_assign_intc                 C     |  d| j| j| jd d S )N+z+cpy_r_r0 = CPyTagged_Add(cpy_r_m, cpy_r_k);assert_emit_binary_oprV   rW   rX   rQ   rS   rS   rT   test_int_add      z'TestFunctionEmitterVisitor.test_int_addc                 C  r   )N-z0cpy_r_r0 = CPyTagged_Subtract(cpy_r_m, cpy_r_k);r   rQ   rS   rS   rT   test_int_sub   r   z'TestFunctionEmitterVisitor.test_int_subc                 C  s2   |  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);)	rs   r   r@   c_function_namerW   return_typestealsis_borrowed
error_kindrQ   rS   rS   rT   test_int_neg   s   
z'TestFunctionEmitterVisitor.test_int_negc                 C  sR   |  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;
                         rs   r   r^   r   BOOLnegatedrR   r^   rS   rS   rT   test_branch   s   z&TestFunctionEmitterVisitor.test_branchc                 C  sf   t d}t| jt d|tj}| j|d|d t d}t| jt d|tj}d|_| j|d|d d S )Nr   r   zif (cpy_r_b) goto CPyL8;rw   Tzif (!cpy_r_b) goto CPyL8;r   r   r^   r   rs   r   rR   rx   r^   rS   rS   rT   test_branch_no_else      z.TestFunctionEmitterVisitor.test_branch_no_elsec                 C  sf   t d}t| j|t dtj}| j|d|d t d}t| j|t dtj}d|_| j|d|d d S )Nr   rr   zif (!cpy_r_b) goto CPyL2;rw   Tzif (cpy_r_b) goto CPyL2;r   r   rS   rS   rT   test_branch_no_else_negated   r   z6TestFunctionEmitterVisitor.test_branch_no_else_negatedc                 C  sV   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   r^   r   IS_ERRORrs   r   r   rS   rS   rT   test_branch_is_error   s   z/TestFunctionEmitterVisitor.test_branch_is_errorc                 C  s^   t d}t| j|t dtj}| j|d|d t| j|t dtj}d|_| j|d|d d S )Nr   r   zif (cpy_r_b != 2) goto CPyL9;rw   Tzif (cpy_r_b == 2) goto CPyL9;)r   r   r^   r   rs   r   r   rS   rS   rT   test_branch_is_error_next_block   s   z:TestFunctionEmitterVisitor.test_branch_is_error_next_blockc              	   C  s   |  t| jtdtdtjddd td}| j t| jtd|tjddd|d td}t| j|tdtjdd}| j |d|d td}t| j|tdtjdd}d|_| j |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;rw   z!if (likely(!cpy_r_b)) goto CPyL9;z if (likely(cpy_r_b)) goto CPyL9;r   r   rS   rS   rT   test_branch_rare   s"   z+TestFunctionEmitterVisitor.test_branch_rarec                 C  s8   t dd dttdtgt}| t|| jgdd d S )Nmyfnri   rW   r   z cpy_r_r0 = CPyDef_myfn(cpy_r_m);)r
   r   r   r5   rs   r   rW   rR   declrS   rS   rT   	test_call   s   z$TestFunctionEmitterVisitor.test_callc              	   C  sD   t dd dttdttdtgt}| t|| j| jgdd d S )Nr   ri   rW   rV   r   z)cpy_r_r0 = CPyDef_myfn(cpy_r_m, cpy_r_k);)r
   r   r   r5   rs   r   rW   rX   r   rS   rS   rT   test_call_two_args  s   z-TestFunctionEmitterVisitor.test_call_two_argsc                 C  s,   |  t| jd | j t| jddd d S )NzCPy_INCREF(cpy_r_o);Tr   )rs   r   r[   rQ   rS   rS   rT   test_inc_ref     z'TestFunctionEmitterVisitor.test_inc_refc                 C  ,   |  t| jd | j t| jddd d S )NzCPy_DECREF(cpy_r_o);zCPy_DecRef(cpy_r_o);Tr   )rs   r   r[   rQ   rS   rS   rT   test_dec_ref  r   z'TestFunctionEmitterVisitor.test_dec_refc                 C  r   )NzCPyTagged_INCREF(cpy_r_m);zCPyTagged_IncRef(cpy_r_m);Tr   )rs   r   rW   rQ   rS   rS   rT   test_inc_ref_int  r   z+TestFunctionEmitterVisitor.test_inc_ref_intc                 C  r   )NzCPyTagged_DECREF(cpy_r_m);zCPyTagged_DecRef(cpy_r_m);Tr   )rs   r   rW   rQ   rS   rS   rT   test_dec_ref_int  r   z+TestFunctionEmitterVisitor.test_dec_ref_intc                 C  rz   )NzCPyTagged_DECREF(cpy_r_t.f0);)rs   r   rf   rQ   rS   rS   rT   test_dec_ref_tuple!  r|   z-TestFunctionEmitterVisitor.test_dec_ref_tuplec                 C  rz   )Nz!CPyTagged_DECREF(cpy_r_tt.f0.f0);)rs   r   rg   rQ   rS   rS   rT   test_dec_ref_tuple_nested$  r|   z4TestFunctionEmitterVisitor.test_dec_ref_tuple_nestedc              
   C  2   |  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);)
rs   r   rB   r   rW   rX   r   r   r   r   rQ   rS   rS   rT   test_list_get_item'     
	z-TestFunctionEmitterVisitor.test_list_get_itemc              
   C  6   |  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);)rs   r   rC   r   rY   rV   r[   r   r   r   r   rQ   rS   rS   rT   test_list_set_item5     	z-TestFunctionEmitterVisitor.test_list_set_itemc                 C  rz   )Nz,cpy_r_r0 = CPyTagged_StealAsObject(cpy_r_n);)rs   r   rV   rQ   rS   rS   rT   test_box_intC  r|   z'TestFunctionEmitterVisitor.test_box_intc                 C     |  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;
                            }
                         )rs   r'   rW   r5   rQ   rS   rS   rT   test_unbox_intF     z)TestFunctionEmitterVisitor.test_unbox_intc                 C  rz   )Nz*cpy_r_r0 = PyLong_FromLongLong(cpy_r_i64);)rs   r   rc   rQ   rS   rS   rT   test_box_i64Q  r|   z'TestFunctionEmitterVisitor.test_box_i64c                 C  r   )Nr   z$cpy_r_r0 = CPyLong_AsInt64(cpy_r_o);)rs   r'   r[   r4   rQ   rS   rS   rT   test_unbox_i64T  s   z)TestFunctionEmitterVisitor.test_unbox_i64c              
   C  r   )Nr   z+cpy_r_r0 = PyList_Append(cpy_r_l, cpy_r_o);)
rs   r   rA   r   rY   r[   r   r   r   r   rQ   rS   rS   rT   test_list_appendY  r   z+TestFunctionEmitterVisitor.test_list_appendc                 C  r   )Nrk   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);
               }
            rs   r   rl   rQ   rS   rS   rT   test_get_attrg  r   z(TestFunctionEmitterVisitor.test_get_attrc                 C  r   )Nrj   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   rQ   rS   rS   rT   test_get_attr_non_refcounteds  r   z7TestFunctionEmitterVisitor.test_get_attr_non_refcountedc                 C  sB   t | jdd}t|tdtdtj}d|_| j|d|dd d S )	Nrk   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   rl   r   r   r   traceback_entryrs   rR   opbranchrS   rS   rT   test_get_attr_merged}  s   	
z/TestFunctionEmitterVisitor.test_get_attr_mergedc                 C     |  t| jd| jdd d S )Nrk   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;
            )rs   r$   rl   rW   rQ   rS   rS   rT   test_set_attr     z(TestFunctionEmitterVisitor.test_set_attrc                 C  r   )Nrj   r   zS((mod___AObject *)cpy_r_r)->_x = cpy_r_b;
               cpy_r_r0 = 1;
            )rs   r$   rl   r^   rQ   rS   rS   rT   test_set_attr_non_refcounted  r   z7TestFunctionEmitterVisitor.test_set_attr_non_refcountedc              
   C  r   )Nr   z.cpy_r_r0 = CPyDict_GetItem(cpy_r_d, cpy_r_o2);)
rs   r   r<   r   r]   r\   r   r   r   r   rQ   rS   rS   rT   test_dict_get_item  r   z-TestFunctionEmitterVisitor.test_dict_get_itemc              
   C  r   )Nr   z7cpy_r_r0 = CPyDict_SetItem(cpy_r_d, cpy_r_o, cpy_r_o2);)rs   r   r>   r   r]   r[   r\   r   r   r   r   rQ   rS   rS   rT   test_dict_set_item  r   z-TestFunctionEmitterVisitor.test_dict_set_itemc              
   C  r   )Nr   z,cpy_r_r0 = CPyDict_Update(cpy_r_d, cpy_r_o);)
rs   r   r?   r   r]   r[   r   r   r   r   rQ   rS   rS   rT   test_dict_update  r   z+TestFunctionEmitterVisitor.test_dict_updatec              
   C  s*   |  ttjg tjtjtjtjdd d S )Nr   zcpy_r_r0 = PyDict_New();)rs   r   r=   r   r   r   r   r   rQ   rS   rS   rT   test_new_dict  s   	z(TestFunctionEmitterVisitor.test_new_dictc                 C  r   )Ninz-cpy_r_r0 = PyDict_Contains(cpy_r_d, cpy_r_o);)r   r^   r[   r]   rQ   rS   rS   rT   test_dict_contains  r   z-TestFunctionEmitterVisitor.test_dict_containsc                 C  sN  |  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;)rs   r   r9   r_   r`   ADDSUBMULDIVMODANDORXOR
LEFT_SHIFTRIGHT_SHIFTrc   rd   rQ   rS   rS   rT   test_int_op  sX   z&TestFunctionEmitterVisitor.test_int_opc                 C  s   |  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;)rs   r   r_   r`   SLTra   rb   rc   rd   ULTr[   r\   EQNEQrQ   rS   rS   rT   test_comparison_op  s@   z-TestFunctionEmitterVisitor.test_comparison_opc                 C  s   |  tt| jd d S )Nzcpy_r_r0 = *(char *)cpy_r_ptr;)rs   r    r0   re   rQ   rS   rS   rT   test_load_mem4  ru   z(TestFunctionEmitterVisitor.test_load_memc                 C  s   |  tt| j| jd d S )Nz*(char *)cpy_r_ptr = cpy_r_b;)rs   r%   r0   re   r^   rQ   rS   rS   rT   test_set_mem7  r   z'TestFunctionEmitterVisitor.test_set_memc                 C  s\   t dg dtttg}| t| j|dd | t| j|dd | t| j|dd d S )	NFoo)r^   ra   rc   r^   z(cpy_r_r0 = (CPyPtr)&((Foo *)cpy_r_o)->b;ra   z*cpy_r_r0 = (CPyPtr)&((Foo *)cpy_r_o)->i32;rc   z*cpy_r_r0 = (CPyPtr)&((Foo *)cpy_r_o)->i64;)r-   r0   r3   r4   rs   r   r[   )rR   rl   rS   rS   rT   test_get_element_ptr<  s   z/TestFunctionEmitterVisitor.test_get_element_ptrc                 C  s   |  ttdd d S )NPyDict_Typez$cpy_r_r0 = (PyObject *)&PyDict_Type;)rs   r   r7   rQ   rS   rS   rT   test_load_addressJ  s   z,TestFunctionEmitterVisitor.test_load_addressc                 C  s>   t td}t|d}| j| | t|| j| jgd d S )Nrr   az+PyObject *cpy_r_a[2] = {cpy_r_o, cpy_r_o2};)	r+   r7   r"   rN   rO   rs   r   r[   r\   )rR   rf   r   rS   rS   rT   test_assign_multiP  s   

z,TestFunctionEmitterVisitor.test_assign_multic                 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"   r4   rs   r   r   rR   r   rS   rS   rT   test_long_unsignedX     
z-TestFunctionEmitterVisitor.test_long_unsignedc                 C  r   )Nr   i  zcpy_r_a = -2147483647;i   zcpy_r_a = -2147483648LL;r   r   rS   rS   rT   test_long_signeda  r   z+TestFunctionEmitterVisitor.test_long_signedc                 C  sH   t | jtd}td}t|td|tj}d|_| 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rx   r   r   )r   rl   r2   r   r   r   r   rs   rR   r   rx   r   rS   rS   rT   test_cast_and_branch_mergej  s   
z5TestFunctionEmitterVisitor.test_cast_and_branch_mergec                 C  sH   t | jtd}t|tdtdtj}d|_| j|dtd|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;
            }
            
   Fr   )r   rl   r2   r   r   r   r   rs   r   rS   rS   rT   test_cast_and_branch_no_merge_1~  s   
z:TestFunctionEmitterVisitor.test_cast_and_branch_no_merge_1c                 C  sL   t | jtd}td}t|td|tj}d|_d|_| j|d||d d S )Nr   r   r   Tr   r   rx   r   )	r   rl   r2   r   r   r   r   r   rs   r   rS   rS   rT   test_cast_and_branch_no_merge_2  s   
z:TestFunctionEmitterVisitor.test_cast_and_branch_no_merge_2c                 C  sF   t | jtd}td}t|td|tj}d|_| j|d||d d S )Nr   r   r   r   r   r   )r   rl   r2   r   r   r   r   rs   r   rS   rS   rT   test_cast_and_branch_no_merge_3  s   
z:TestFunctionEmitterVisitor.test_cast_and_branch_no_merge_3c                 C  s@   t | jtd}td}t|td|tj}| j|d||d d S )Nr   r   r   r   r   )r   rl   r2   r   r   r   rs   r   rS   rS   rT   test_cast_and_branch_no_merge_4  s   
z:TestFunctionEmitterVisitor.test_cast_and_branch_no_merge_4c                 C  s   t td}| t|tddd | t|tddd tdkr7| t| jtddd | t| jtddd	 td
krS| t|tddd | t|td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"   r3   rs   r   r4   r   rV   r5   r   rS   rS   rT   test_extend  s&   
z&TestFunctionEmitterVisitor.test_extendNF)r   r   r   r   r!   expectedrK   rx   BasicBlock | Noner   boolr   Branch | Noner   c                C  s&  t d}|j| t| j|g}t| j|}	t| j|}
g |	_g |
_t|	|
dd}||_	||_
|r8||g|_n|g|_d|_|| |
j|	j }dd |D }tdd |D s\J dd |D }| sjg }n| d	}d
d |D }t||dd |r|jdksJ d S |jdksJ d S )Nr   prog.pyprogc                 S     g | ]}| d qS  strip.0linerS   rS   rT   
<listcomp>      z:TestFunctionEmitterVisitor.assert_emit.<locals>.<listcomp>c                 s  s    | ]}| d V  qdS )
N)endswithr  rS   rS   rT   	<genexpr>  s    z9TestFunctionEmitterVisitor.assert_emit.<locals>.<genexpr>c                 S  r
  )r  )rstripr  rS   rS   rT   r    r  r  c                 S  r
  r  r  r  rS   rS   rT   r    r  zGenerated code unexpectedmsgr   )r   opsrO   r*   rN   r   ro   	fragmentsr   rx   r   op_indexacceptallr  r  splitr   )rR   r   r  rx   r   r   r   blockvalue_namesemitterdeclarationsvisitorfragsactual_linesexpected_linesrS   rS   rT   rs     s6   

z&TestFunctionEmitterVisitor.assert_emitdestr)   leftrightc                   s   |t v rJt | }|D ]=}t|j|jd rGt|j|jd rG||g |jd ur1 fdd|jD  | t|j |j|j	|j
|jd|  d S q
d S J d)Nr   r   c                   s   g | ]} | qS rS   rS   )r  iargsrS   rT   r    s    zDTestFunctionEmitterVisitor.assert_emit_binary_op.<locals>.<listcomp>r   FzCould not find matching op)rE   rF   r   	arg_typesorderingrs   r   r   r   r   r   r   )rR   r   r(  r)  r*  r  r  descrS   r,  rT   r   	  s2   
	z0TestFunctionEmitterVisitor.assert_emit_binary_oprH   rI   rM   )r   r!   r  rK   rx   r  r   r  r   r  r   r  rH   rI   )r   rK   r(  r)   r)  r)   r*  r)   r  rK   rH   rI   )?__name__
__module____qualname____doc__rq   rt   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   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  rs   r   rS   rS   rS   rT   rG   J   s    

$











	
	





























.
&





	
	




+rG   c                   @  s*   e Zd Zd
ddZd
ddZd
ddZd	S )TestGenerateFunctionrH   rI   c                 C  s&   t dt| _ttd| _td| _d S )Nargr   )r   r5   r7  r"   rP   r   r   rQ   rS   rS   rT   rq   '  s   zTestGenerateFunction.setUpc                 C  s   | 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 d S )Nmyfuncri   r  r	  )z/CPyTagged CPyDef_myfunc(CPyTagged cpy_r_arg) {
	CPyL0: ;
z    return cpy_r_arg;
}
Generated code invalidr  )r   r  rO   r#   rP   r   r
   r   r7  r5   r*   arg_regsblocksr   r   r;   r   r  r   )rR   fnr!  r"  resultrS   rS   rT   test_simple,  s   
z TestGenerateFunction.test_simplec                 C  s   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 d S )	Nr}   r8  ri   r  r	  )z/PyObject *CPyDef_myfunc(CPyTagged cpy_r_arg) {
z    CPyTagged cpy_r_r0;
r9  z    cpy_r_r0 = 10;
z    CPy_Unreachable();
r:  r;  r  )r"   r5   r   r   r   r  rO   r(   r   r
   r   r7  r6   rP   r*   r<  r=  r   r   r;   r   r  r   )rR   rP   r   r>  r!  r"  r?  rS   rS   rT   test_registerB  s$   
z"TestGenerateFunction.test_registerNr1  )r2  r3  r4  rq   r@  rA  rS   rS   rS   rT   r6  &  s    

r6  )[
__future__r   unittestmypy.test.helpersr   mypyc.codegen.emitr   r   mypyc.codegen.emitfuncr   r   mypyc.commonr   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)   mypyc.ir.pprintr*   mypyc.ir.rtypesr+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   mypyc.irbuild.vtabler:   mypyc.namegenr;   mypyc.primitives.dict_opsr<   r=   r>   r?   mypyc.primitives.int_opsr@   mypyc.primitives.list_opsrA   rB   rC   mypyc.primitives.misc_opsrD   mypyc.primitives.registryrE   mypyc.subtyperF   TestCaserG   r6  rS   rS   rS   rT   <module>   s4    xD     a