o
    2gـ                     @  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/m0Z0m1Z1 d d
l2m3Z3 d dl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC d dlDmEZE d dlFmGZG d dlHmIZImJZJmKZKmLZL d dlMmNZN d dlOmPZPmQZQmRZR d dlSmTZT d dlUmVZV d dlWmXZX G dd dejYZZG dd dejYZ[dS )    )annotationsN)assert_string_arrays_equal)EmitterEmitterContext)FunctionEmitterVisitorgenerate_native_function)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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                   @  s  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<ddvdwZ=ddxdyZ>ddzd{Z?dd|d}Z@dd~dZA	ddddddddZBdddZCdS )TestFunctionEmitterVisitorz9Test generation of fragments of C from individual IR ops.returnNonec                   s^  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ttd|_ddg|_t | |g|_!|d t"| _#t$t%dgg _&d S )"Nnamestrrtyper0   rI   r#   c                   s   t || } j| |S N)r#   	registersappend)rK   rM   regself P/home/garg/my-data/venv/lib/python3.10/site-packages/mypyc/test/test_emitfunc.py	add_localQ   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i1i2rm   rn   r)rK   rL   rM   r0   rI   r#   )'rO   r6   rW   rX   rY   r7   rZ   r[   r8   r\   r]   r3   r^   r1   r_   r:   r`   ra   r4   rb   rc   r5   rd   re   r9   rf   r/   rg   rh   r	   
attributesbitmap_attrsr;   mror-   ro   r   r<   context)rS   rV   irrT   rR   rU   setUpN   sB   

z TestFunctionEmitterVisitor.setUpc                 C  s   |  ttdd d S )N   zgoto CPyL2;)assert_emitr   r   rR   rT   rT   rU   	test_gotox      z$TestFunctionEmitterVisitor.test_gotoc                 C  s    t d}| jt|d|d d S )Nrv    
next_block)r   rw   r   )rS   r|   rT   rT   rU   test_goto_next_block{   s   z/TestFunctionEmitterVisitor.test_goto_next_blockc                 C     |  t| jd d S )Nzreturn cpy_r_m;)rw   r$   rX   rR   rT   rT   rU   test_return      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;)rw   r   rW   r   rb   r2   rR   rT   rT   rU   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;)rw   r'   rg   rR   rT   rT   rU   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;)rw   r    rE   typesrcrR   rT   rT   rU   test_load_None   s   z)TestFunctionEmitterVisitor.test_load_Nonec                 C  s   |  t| j| jd d S )Nzcpy_r_m = cpy_r_n;)rw   r   rX   rW   rR   rT   rT   rU   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_oprW   rX   rY   rR   rT   rT   rU   test_int_add      z'TestFunctionEmitterVisitor.test_int_addc                 C  r   )N-z0cpy_r_r0 = CPyTagged_Subtract(cpy_r_m, cpy_r_k);r   rR   rT   rT   rU   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);)	rw   r   rA   c_function_namerX   return_typestealsis_borrowed
error_kindrR   rT   rT   rU   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;
                         rw   r   r_   r   BOOLnegatedrS   r_   rT   rT   rU   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;r{   Tzif (!cpy_r_b) goto CPyL8;r   r   r_   r   rw   r   rS   r|   r_   rT   rT   rU   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   rv   zif (!cpy_r_b) goto CPyL2;r{   Tzif (cpy_r_b) goto CPyL2;r   r   rT   rT   rU   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_ERRORrw   r   r   rT   rT   rU   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;r{   Tzif (cpy_r_b == 2) goto CPyL9;)r   r   r_   r   rw   r   r   rT   rT   rU   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;r{   z!if (likely(!cpy_r_b)) goto CPyL9;z if (likely(cpy_r_b)) goto CPyL9;r   r   rT   rT   rU   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myfnrj   rX   r   z cpy_r_r0 = CPyDef_myfn(cpy_r_m);)r
   r   r   r6   rw   r   rX   rS   declrT   rT   rU   	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   rj   rX   rW   r   z)cpy_r_r0 = CPyDef_myfn(cpy_r_m, cpy_r_k);)r
   r   r   r6   rw   r   rX   rY   r   rT   rT   rU   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   )rw   r   r\   rR   rT   rT   rU   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   )rw   r   r\   rR   rT   rT   rU   test_dec_ref  r   z'TestFunctionEmitterVisitor.test_dec_refc                 C  r   )NzCPyTagged_INCREF(cpy_r_m);zCPyTagged_IncRef(cpy_r_m);Tr   )rw   r   rX   rR   rT   rT   rU   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   )rw   r   rX   rR   rT   rT   rU   test_dec_ref_int$  r   z+TestFunctionEmitterVisitor.test_dec_ref_intc                 C  r~   )NzCPyTagged_DECREF(cpy_r_t.f0);)rw   r   rg   rR   rT   rT   rU   test_dec_ref_tuple(  r   z-TestFunctionEmitterVisitor.test_dec_ref_tuplec                 C  r~   )Nz!CPyTagged_DECREF(cpy_r_tt.f0.f0);)rw   r   rh   rR   rT   rT   rU   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);)
rw   r   rC   r   rX   rY   r   r   r   r   rR   rT   rT   rU   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);)rw   r   rD   r   rZ   rW   r\   r   r   r   r   rR   rT   rT   rU   test_list_set_item<     	z-TestFunctionEmitterVisitor.test_list_set_itemc                 C  r~   )Nz,cpy_r_r0 = CPyTagged_StealAsObject(cpy_r_n);)rw   r   rW   rR   rT   rT   rU   test_box_intJ  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;
                            }
                         )rw   r(   rX   r6   rR   rT   rT   rU   test_unbox_intM     z)TestFunctionEmitterVisitor.test_unbox_intc                 C  r~   )Nz*cpy_r_r0 = PyLong_FromLongLong(cpy_r_i64);)rw   r   rd   rR   rT   rT   rU   test_box_i64X  r   z'TestFunctionEmitterVisitor.test_box_i64c                 C  r   )Nr   z$cpy_r_r0 = CPyLong_AsInt64(cpy_r_o);)rw   r(   r\   r5   rR   rT   rT   rU   test_unbox_i64[  s   z)TestFunctionEmitterVisitor.test_unbox_i64c              
   C  r   )Nr   z+cpy_r_r0 = PyList_Append(cpy_r_l, cpy_r_o);)
rw   r   rB   r   rZ   r\   r   r   r   r   rR   rT   rT   rU   test_list_append`  r   z+TestFunctionEmitterVisitor.test_list_appendc                 C  r   )Nrl   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);
               }
            rw   r   ro   rR   rT   rT   rU   test_get_attrn  r   z(TestFunctionEmitterVisitor.test_get_attrc                 C  r   )Nrk   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   rR   rT   rT   rU   test_get_attr_non_refcountedz  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 )	Nrl   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   ro   r   r   r   traceback_entryrw   rS   opbranchrT   rT   rU   test_get_attr_merged  s   	
z/TestFunctionEmitterVisitor.test_get_attr_mergedc                 C  r   )Nrm   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   rR   rT   rT   rU   test_get_attr_with_bitmap  r   z4TestFunctionEmitterVisitor.test_get_attr_with_bitmapc                 C     |  t| jd| jdd d S )Nrl   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;
            )rw   r%   ro   rX   rR   rT   rT   rU   test_set_attr     z(TestFunctionEmitterVisitor.test_set_attrc                 C  r   )Nrk   r   zS((mod___AObject *)cpy_r_r)->_x = cpy_r_b;
               cpy_r_r0 = 1;
            )rw   r%   ro   r_   rR   rT   rT   rU   test_set_attr_non_refcounted  r   z7TestFunctionEmitterVisitor.test_set_attr_non_refcountedc                 C  (   t | jd| jd}t|_| |d d S )Nrl   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%   ro   rX   r   r   rw   rS   r   rT   rT   rU   test_set_attr_no_error     z1TestFunctionEmitterVisitor.test_set_attr_no_errorc                 C  r   )Nrk   r   z6((mod___AObject *)cpy_r_r)->_x = cpy_r_b;
            )r%   ro   r_   r   r   rw   r   rT   rT   rU   %test_set_attr_non_refcounted_no_error  r   z@TestFunctionEmitterVisitor.test_set_attr_non_refcounted_no_errorc                 C  s8   |  t| jd| jdd |  t| jd| jdd d S )Nrm   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;
            rn   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;
            )rw   r%   ro   rd   rb   rR   rT   rT   rU   test_set_attr_with_bitmap  s   	z4TestFunctionEmitterVisitor.test_set_attr_with_bitmapc                 C  s(   t | jd| jd}d|_| |d d S )Nrm   r   Tr   )r%   ro   rd   is_initrw   r   rT   rT   rU   test_set_attr_init_with_bitmap  r   z9TestFunctionEmitterVisitor.test_set_attr_init_with_bitmapc              
   C  r   )Nr   z.cpy_r_r0 = CPyDict_GetItem(cpy_r_d, cpy_r_o2);)
rw   r   r=   r   r^   r]   r   r   r   r   rR   rT   rT   rU   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);)rw   r   r?   r   r^   r\   r]   r   r   r   r   rR   rT   rT   rU   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);)
rw   r   r@   r   r^   r\   r   r   r   r   rR   rT   rT   rU   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();)rw   r   r>   r   r   r   r   r   rR   rT   rT   rU   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^   rR   rT   rT   rU   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;)rw   r   r:   r`   ra   ADDSUBMULDIVMODANDORXOR
LEFT_SHIFTRIGHT_SHIFTrd   re   rR   rT   rT   rU   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;)rw   r   r`   ra   SLTrb   rc   rd   re   ULTr\   r]   EQNEQrR   rT   rT   rU   test_comparison_opW  s@   z-TestFunctionEmitterVisitor.test_comparison_opc                 C  s   |  tt| jd d S )Nzcpy_r_r0 = *(char *)cpy_r_ptr;)rw   r!   r1   rf   rR   rT   rT   rU   test_load_mem}  ry   z(TestFunctionEmitterVisitor.test_load_memc                 C  s   |  tt| j| jd d S )Nz*(char *)cpy_r_ptr = cpy_r_b;)rw   r&   r1   rf   r_   rR   rT   rT   rU   test_set_mem  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_   rb   rd   r_   z(cpy_r_r0 = (CPyPtr)&((Foo *)cpy_r_o)->b;rb   z*cpy_r_r0 = (CPyPtr)&((Foo *)cpy_r_o)->i32;rd   z*cpy_r_r0 = (CPyPtr)&((Foo *)cpy_r_o)->i64;)r.   r1   r4   r5   rw   r   r\   )rS   ro   rT   rT   rU   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;)rw   r    r8   rR   rT   rT   rU   test_load_address  s   z,TestFunctionEmitterVisitor.test_load_addressc                 C  s>   t td}t|d}| j| | t|| j| jgd d S )Nrv   az+PyObject *cpy_r_a[2] = {cpy_r_o, cpy_r_o2};)	r,   r8   r#   rO   rP   rw   r   r\   r]   )rS   rg   r   rT   rT   rU   test_assign_multi  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#   r5   rw   r   r   rS   r   rT   rT   rU   test_long_unsigned     
z-TestFunctionEmitterVisitor.test_long_unsignedc                 C  r   )Nr   i  zcpy_r_a = -2147483647;i   zcpy_r_a = -2147483648LL;r   r  rT   rT   rU   test_long_signed  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r|   r   r   )r   ro   r3   r   r   r   r   rw   rS   r   r|   r   rT   rT   rU   test_cast_and_branch_merge  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   ro   r3   r   r   r   r   rw   r   rT   rT   rU   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  r|   r   )	r   ro   r3   r   r   r   r   r   rw   r  rT   rT   rU   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   ro   r3   r   r   r   r   rw   r  rT   rT   rU   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   ro   r3   r   r   r   rw   r  rT   rT   rU   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#   r4   rw   r   r5   r   rW   r6   r  rT   rT   rU   test_extend  s&   
z&TestFunctionEmitterVisitor.test_extendNF)r   r   r   r   r"   expectedrL   r|   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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linerT   rT   rU   
<listcomp>D      z:TestFunctionEmitterVisitor.assert_emit.<locals>.<listcomp>c                 s  s    | ]}| d V  qdS )
N)endswithr  rT   rT   rU   	<genexpr>E  s    z9TestFunctionEmitterVisitor.assert_emit.<locals>.<genexpr>c                 S  r  )r"  )rstripr  rT   rT   rU   r   F  r!  r"  c                 S  r  r  r  r  rT   rT   rU   r   K  r!  zGenerated code unexpectedT)msg	tracebackr   )r   opsrP   r+   rO   r   rs   	fragmentsr   r|   r   op_indexacceptallr  r%  splitr   )rS   r   r  r|   r   r   r   blockvalue_namesemitterdeclarationsvisitorfragsactual_linesexpected_linesrT   rT   rU   rw   '  s:   

z&TestFunctionEmitterVisitor.assert_emitdestr*   leftrightc                   s   |t v rQt | }|D ]D}t|j|jd rNt|j|jd rN||g |jd ur1 fdd|jD  |jd us8J | t|j |j|j	|j
|jd|  d S q
d S J d)Nr   r   c                   s   g | ]} | qS rT   rT   )r  iargsrT   rU   r   _  s    zDTestFunctionEmitterVisitor.assert_emit_binary_op.<locals>.<listcomp>r   FzCould not find matching op)rF   rG   r   	arg_typesorderingr   rw   r   r   r   r   r   )rS   r   r6  r7  r8  r  r(  descrT   r:  rU   r   T  s4   
	z0TestFunctionEmitterVisitor.assert_emit_binary_oprI   rJ   rN   )r   r"   r  rL   r|   r  r   r  r   r  r   r  rI   rJ   )r   rL   r6  r*   r7  r*   r8  r*   r  rL   rI   rJ   )D__name__
__module____qualname____doc__ru   rx   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
  r  r  r  r  rw   r   rT   rT   rT   rU   rH   K   s    

*











	
	



























	







.
&





	
	




-rH   c                   @  s*   e Zd Zd
ddZd
ddZd
ddZd	S )TestGenerateFunctionrI   rJ   c                 C  s&   t dt| _ttd| _td| _d S )Nargr   )r   r6   rE  r#   rQ   r   r.  rR   rT   rT   rU   ru   t  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myfuncrj   r  r  )z/CPyTagged CPyDef_myfunc(CPyTagged cpy_r_arg) {
z    return cpy_r_arg;
}
Generated code invalidr&  )r.  r(  rP   r$   rQ   r   r
   r   rE  r6   r+   arg_regsblocksr   r   r<   r   r)  r   )rS   fnr/  r0  resultrT   rT   rU   test_simpley  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   rF  rj   r  r  )z/PyObject *CPyDef_myfunc(CPyTagged cpy_r_arg) {
z    CPyTagged cpy_r_r0;
z    cpy_r_r0 = 10;
z    CPy_Unreachable();
rG  rH  rI  )r#   r6   r   r   r.  r(  rP   r)   r   r
   r   rE  r7   rQ   r+   rJ  rK  r   r   r<   r   r)  r   )rS   rQ   r   rL  r/  r0  rM  rT   rT   rU   test_register  s$   
z"TestGenerateFunction.test_registerNr?  )r@  rA  rB  ru   rN  rO  rT   rT   rT   rU   rD  s  s    

rD  )\
__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)   r*   mypyc.ir.pprintr+   mypyc.ir.rtypesr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   mypyc.irbuild.vtabler;   mypyc.namegenr<   mypyc.primitives.dict_opsr=   r>   r?   r@   mypyc.primitives.int_opsrA   mypyc.primitives.list_opsrB   rC   rD   mypyc.primitives.misc_opsrE   mypyc.primitives.registryrF   mypyc.subtyperG   TestCaserH   rD  rT   rT   rT   rU   <module>   s6    |D      .