diff --git a/mypyc/test-data/irbuild-frozenset.test b/mypyc/test-data/irbuild-frozenset.test index 2fa84a2ed055..473a6d79ac5a 100644 --- a/mypyc/test-data/irbuild-frozenset.test +++ b/mypyc/test-data/irbuild-frozenset.test @@ -113,3 +113,237 @@ L0: r5 = r4 >= 0 :: signed r6 = truncate r4: i32 to builtins.bool return r6 + +[case testFrozenSetFromRange1] +from typing import FrozenSet +def fn() -> FrozenSet[int]: + return frozenset(range(3)) +[out] +def fn(): + r0, r1 :: object + r2 :: object[1] + r3 :: object_ptr + r4 :: object + r5 :: range + r6 :: frozenset +L0: + r0 = load_address PyRange_Type + r1 = object 3 + r2 = [r1] + r3 = load_address r2 + r4 = PyObject_Vectorcall(r0, r3, 1, 0) + keep_alive r1 + r5 = cast(range, r4) + r6 = PyFrozenSet_New(r5) + return r6 + +[case testFrozenSetFromRange2] +from typing import FrozenSet +def fn() -> FrozenSet[int]: + return frozenset(range(1, 3)) +[out] +def fn(): + r0, r1, r2 :: object + r3 :: object[2] + r4 :: object_ptr + r5 :: object + r6 :: range + r7 :: frozenset +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = [r1, r2] + r4 = load_address r3 + r5 = PyObject_Vectorcall(r0, r4, 2, 0) + keep_alive r1, r2 + r6 = cast(range, r5) + r7 = PyFrozenSet_New(r6) + return r7 + +[case testFrozenSetFromRange3] +from typing import FrozenSet +def fn() -> FrozenSet[int]: + return frozenset(range(1, 3, 2)) +[out] +def fn(): + r0, r1, r2, r3 :: object + r4 :: object[3] + r5 :: object_ptr + r6 :: object + r7 :: range + r8 :: frozenset +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = object 2 + r4 = [r1, r2, r3] + r5 = load_address r4 + r6 = PyObject_Vectorcall(r0, r5, 3, 0) + keep_alive r1, r2, r3 + r7 = cast(range, r6) + r8 = PyFrozenSet_New(r7) + return r8 + +[case testFrozenSetFromRange4] +from typing import FrozenSet +def fn() -> FrozenSet[str]: + abc = tuple(range(3)) + return frozenset(str(i) for i in abc) +[out] +def fn(): + r0, r1 :: object + r2 :: object[1] + r3 :: object_ptr + r4 :: object + r5 :: range + r6, abc :: tuple + r7 :: native_int + r8 :: list + r9, r10 :: native_int + r11 :: bit + r12 :: object + r13, i :: int + r14 :: str + r15 :: native_int + r16 :: frozenset +L0: + r0 = load_address PyRange_Type + r1 = object 3 + r2 = [r1] + r3 = load_address r2 + r4 = PyObject_Vectorcall(r0, r3, 1, 0) + keep_alive r1 + r5 = cast(range, r4) + r6 = PySequence_Tuple(r5) + abc = r6 + r7 = var_object_size abc + r8 = PyList_New(r7) + r9 = 0 +L1: + r10 = var_object_size abc + r11 = r9 < r10 :: signed + if r11 goto L2 else goto L4 :: bool +L2: + r12 = CPySequenceTuple_GetItemUnsafe(abc, r9) + r13 = unbox(int, r12) + i = r13 + r14 = CPyTagged_Str(i) + CPyList_SetItemUnsafe(r8, r9, r14) +L3: + r15 = r9 + 1 + r9 = r15 + goto L1 +L4: + r16 = PyFrozenSet_New(r8) + return r16 + +[case testFrozenSetFromRange5] +from typing import FrozenSet +def fn() -> FrozenSet[str]: + abc = tuple(range(1, 3)) + return frozenset(str(i) for i in abc) +[out] +def fn(): + r0, r1, r2 :: object + r3 :: object[2] + r4 :: object_ptr + r5 :: object + r6 :: range + r7, abc :: tuple + r8 :: native_int + r9 :: list + r10, r11 :: native_int + r12 :: bit + r13 :: object + r14, i :: int + r15 :: str + r16 :: native_int + r17 :: frozenset +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = [r1, r2] + r4 = load_address r3 + r5 = PyObject_Vectorcall(r0, r4, 2, 0) + keep_alive r1, r2 + r6 = cast(range, r5) + r7 = PySequence_Tuple(r6) + abc = r7 + r8 = var_object_size abc + r9 = PyList_New(r8) + r10 = 0 +L1: + r11 = var_object_size abc + r12 = r10 < r11 :: signed + if r12 goto L2 else goto L4 :: bool +L2: + r13 = CPySequenceTuple_GetItemUnsafe(abc, r10) + r14 = unbox(int, r13) + i = r14 + r15 = CPyTagged_Str(i) + CPyList_SetItemUnsafe(r9, r10, r15) +L3: + r16 = r10 + 1 + r10 = r16 + goto L1 +L4: + r17 = PyFrozenSet_New(r9) + return r17 + +[case testFrozenSetFromRange6] +from typing import FrozenSet +def fn() -> FrozenSet[str]: + abc = tuple(range(1, 3, 2)) + return frozenset(str(i) for i in abc) +[out] +def fn(): + r0, r1, r2, r3 :: object + r4 :: object[3] + r5 :: object_ptr + r6 :: object + r7 :: range + r8, abc :: tuple + r9 :: native_int + r10 :: list + r11, r12 :: native_int + r13 :: bit + r14 :: object + r15, i :: int + r16 :: str + r17 :: native_int + r18 :: frozenset +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = object 2 + r4 = [r1, r2, r3] + r5 = load_address r4 + r6 = PyObject_Vectorcall(r0, r5, 3, 0) + keep_alive r1, r2, r3 + r7 = cast(range, r6) + r8 = PySequence_Tuple(r7) + abc = r8 + r9 = var_object_size abc + r10 = PyList_New(r9) + r11 = 0 +L1: + r12 = var_object_size abc + r13 = r11 < r12 :: signed + if r13 goto L2 else goto L4 :: bool +L2: + r14 = CPySequenceTuple_GetItemUnsafe(abc, r11) + r15 = unbox(int, r14) + i = r15 + r16 = CPyTagged_Str(i) + CPyList_SetItemUnsafe(r10, r11, r16) +L3: + r17 = r11 + 1 + r11 = r17 + goto L1 +L4: + r18 = PyFrozenSet_New(r10) + return r18 diff --git a/mypyc/test-data/irbuild-lists.test b/mypyc/test-data/irbuild-lists.test index 06120e077af9..4a55f2f8827c 100644 --- a/mypyc/test-data/irbuild-lists.test +++ b/mypyc/test-data/irbuild-lists.test @@ -572,3 +572,225 @@ def sort_iterable(a): L0: r0 = CPySequence_Sort(a) return 1 + +[case testListFromRange1] +def fn() -> list[int]: + return list(range(3)) +[out] +def fn(): + r0, r1 :: object + r2 :: object[1] + r3 :: object_ptr + r4 :: object + r5 :: range + r6 :: list +L0: + r0 = load_address PyRange_Type + r1 = object 3 + r2 = [r1] + r3 = load_address r2 + r4 = PyObject_Vectorcall(r0, r3, 1, 0) + keep_alive r1 + r5 = cast(range, r4) + r6 = PySequence_List(r5) + return r6 + +[case testListFromRange2] +def fn() -> list[int]: + return list(range(1, 3)) +[out] +def fn(): + r0, r1, r2 :: object + r3 :: object[2] + r4 :: object_ptr + r5 :: object + r6 :: range + r7 :: list +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = [r1, r2] + r4 = load_address r3 + r5 = PyObject_Vectorcall(r0, r4, 2, 0) + keep_alive r1, r2 + r6 = cast(range, r5) + r7 = PySequence_List(r6) + return r7 + +[case testListFromRange3] +def fn() -> list[int]: + return list(range(1, 3, 2)) +[out] +def fn(): + r0, r1, r2, r3 :: object + r4 :: object[3] + r5 :: object_ptr + r6 :: object + r7 :: range + r8 :: list +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = object 2 + r4 = [r1, r2, r3] + r5 = load_address r4 + r6 = PyObject_Vectorcall(r0, r5, 3, 0) + keep_alive r1, r2, r3 + r7 = cast(range, r6) + r8 = PySequence_List(r7) + return r8 + +[case testListFromRange4] +def fn() -> list[str]: + abc = tuple(range(3)) + return list(str(i) for i in abc) +[out] +def fn(): + r0, r1 :: object + r2 :: object[1] + r3 :: object_ptr + r4 :: object + r5 :: range + r6, abc :: tuple + r7 :: native_int + r8 :: list + r9, r10 :: native_int + r11 :: bit + r12 :: object + r13, i :: int + r14 :: str + r15 :: native_int +L0: + r0 = load_address PyRange_Type + r1 = object 3 + r2 = [r1] + r3 = load_address r2 + r4 = PyObject_Vectorcall(r0, r3, 1, 0) + keep_alive r1 + r5 = cast(range, r4) + r6 = PySequence_Tuple(r5) + abc = r6 + r7 = var_object_size abc + r8 = PyList_New(r7) + r9 = 0 +L1: + r10 = var_object_size abc + r11 = r9 < r10 :: signed + if r11 goto L2 else goto L4 :: bool +L2: + r12 = CPySequenceTuple_GetItemUnsafe(abc, r9) + r13 = unbox(int, r12) + i = r13 + r14 = CPyTagged_Str(i) + CPyList_SetItemUnsafe(r8, r9, r14) +L3: + r15 = r9 + 1 + r9 = r15 + goto L1 +L4: + return r8 + +[case testListFromRange5] +def fn() -> list[str]: + abc = tuple(range(1, 3)) + return list(str(i) for i in abc) +[out] +def fn(): + r0, r1, r2 :: object + r3 :: object[2] + r4 :: object_ptr + r5 :: object + r6 :: range + r7, abc :: tuple + r8 :: native_int + r9 :: list + r10, r11 :: native_int + r12 :: bit + r13 :: object + r14, i :: int + r15 :: str + r16 :: native_int +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = [r1, r2] + r4 = load_address r3 + r5 = PyObject_Vectorcall(r0, r4, 2, 0) + keep_alive r1, r2 + r6 = cast(range, r5) + r7 = PySequence_Tuple(r6) + abc = r7 + r8 = var_object_size abc + r9 = PyList_New(r8) + r10 = 0 +L1: + r11 = var_object_size abc + r12 = r10 < r11 :: signed + if r12 goto L2 else goto L4 :: bool +L2: + r13 = CPySequenceTuple_GetItemUnsafe(abc, r10) + r14 = unbox(int, r13) + i = r14 + r15 = CPyTagged_Str(i) + CPyList_SetItemUnsafe(r9, r10, r15) +L3: + r16 = r10 + 1 + r10 = r16 + goto L1 +L4: + return r9 + +[case testListFromRange6] +def fn() -> list[str]: + abc = tuple(range(1, 3, 2)) + return list(str(i) for i in abc) +[out] +def fn(): + r0, r1, r2, r3 :: object + r4 :: object[3] + r5 :: object_ptr + r6 :: object + r7 :: range + r8, abc :: tuple + r9 :: native_int + r10 :: list + r11, r12 :: native_int + r13 :: bit + r14 :: object + r15, i :: int + r16 :: str + r17 :: native_int +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = object 2 + r4 = [r1, r2, r3] + r5 = load_address r4 + r6 = PyObject_Vectorcall(r0, r5, 3, 0) + keep_alive r1, r2, r3 + r7 = cast(range, r6) + r8 = PySequence_Tuple(r7) + abc = r8 + r9 = var_object_size abc + r10 = PyList_New(r9) + r11 = 0 +L1: + r12 = var_object_size abc + r13 = r11 < r12 :: signed + if r13 goto L2 else goto L4 :: bool +L2: + r14 = CPySequenceTuple_GetItemUnsafe(abc, r11) + r15 = unbox(int, r14) + i = r15 + r16 = CPyTagged_Str(i) + CPyList_SetItemUnsafe(r10, r11, r16) +L3: + r17 = r11 + 1 + r11 = r17 + goto L1 +L4: + return r10 diff --git a/mypyc/test-data/irbuild-set.test b/mypyc/test-data/irbuild-set.test index 5586a2bf4cfb..1c2ae23feba0 100644 --- a/mypyc/test-data/irbuild-set.test +++ b/mypyc/test-data/irbuild-set.test @@ -799,3 +799,228 @@ L4: r11 = CPy_NoErrOccurred() L5: return 1 + +[case testSetFromRange1] +def fn() -> set[int]: + return set(range(3)) +[out] +def fn(): + r0, r1 :: object + r2 :: object[1] + r3 :: object_ptr + r4 :: object + r5 :: range + r6 :: set +L0: + r0 = load_address PyRange_Type + r1 = object 3 + r2 = [r1] + r3 = load_address r2 + r4 = PyObject_Vectorcall(r0, r3, 1, 0) + keep_alive r1 + r5 = cast(range, r4) + r6 = PySet_New(r5) + return r6 + +[case testSetFromRange2] +def fn() -> set[int]: + return set(range(1, 3)) +[out] +def fn(): + r0, r1, r2 :: object + r3 :: object[2] + r4 :: object_ptr + r5 :: object + r6 :: range + r7 :: set +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = [r1, r2] + r4 = load_address r3 + r5 = PyObject_Vectorcall(r0, r4, 2, 0) + keep_alive r1, r2 + r6 = cast(range, r5) + r7 = PySet_New(r6) + return r7 + +[case testSetFromRange3] +def fn() -> set[int]: + return set(range(1, 3, 2)) +[out] +def fn(): + r0, r1, r2, r3 :: object + r4 :: object[3] + r5 :: object_ptr + r6 :: object + r7 :: range + r8 :: set +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = object 2 + r4 = [r1, r2, r3] + r5 = load_address r4 + r6 = PyObject_Vectorcall(r0, r5, 3, 0) + keep_alive r1, r2, r3 + r7 = cast(range, r6) + r8 = PySet_New(r7) + return r8 + +[case testSetFromRange4] +def fn() -> set[str]: + abc = tuple(range(3)) + return set(str(i) for i in abc) +[out] +def fn(): + r0, r1 :: object + r2 :: object[1] + r3 :: object_ptr + r4 :: object + r5 :: range + r6, abc :: tuple + r7 :: set + r8, r9 :: native_int + r10 :: bit + r11 :: object + r12, i :: int + r13 :: str + r14 :: i32 + r15 :: bit + r16 :: native_int +L0: + r0 = load_address PyRange_Type + r1 = object 3 + r2 = [r1] + r3 = load_address r2 + r4 = PyObject_Vectorcall(r0, r3, 1, 0) + keep_alive r1 + r5 = cast(range, r4) + r6 = PySequence_Tuple(r5) + abc = r6 + r7 = PySet_New(0) + r8 = 0 +L1: + r9 = var_object_size abc + r10 = r8 < r9 :: signed + if r10 goto L2 else goto L4 :: bool +L2: + r11 = CPySequenceTuple_GetItemUnsafe(abc, r8) + r12 = unbox(int, r11) + i = r12 + r13 = CPyTagged_Str(i) + r14 = PySet_Add(r7, r13) + r15 = r14 >= 0 :: signed +L3: + r16 = r8 + 1 + r8 = r16 + goto L1 +L4: + return r7 + +[case testSetFromRange5] +def fn() -> set[str]: + abc = tuple(range(1, 3)) + return set(str(i) for i in abc) +[out] +def fn(): + r0, r1, r2 :: object + r3 :: object[2] + r4 :: object_ptr + r5 :: object + r6 :: range + r7, abc :: tuple + r8 :: set + r9, r10 :: native_int + r11 :: bit + r12 :: object + r13, i :: int + r14 :: str + r15 :: i32 + r16 :: bit + r17 :: native_int +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = [r1, r2] + r4 = load_address r3 + r5 = PyObject_Vectorcall(r0, r4, 2, 0) + keep_alive r1, r2 + r6 = cast(range, r5) + r7 = PySequence_Tuple(r6) + abc = r7 + r8 = PySet_New(0) + r9 = 0 +L1: + r10 = var_object_size abc + r11 = r9 < r10 :: signed + if r11 goto L2 else goto L4 :: bool +L2: + r12 = CPySequenceTuple_GetItemUnsafe(abc, r9) + r13 = unbox(int, r12) + i = r13 + r14 = CPyTagged_Str(i) + r15 = PySet_Add(r8, r14) + r16 = r15 >= 0 :: signed +L3: + r17 = r9 + 1 + r9 = r17 + goto L1 +L4: + return r8 + +[case testSetFromRange6] +def fn() -> set[str]: + abc = tuple(range(1, 3, 2)) + return set(str(i) for i in abc) +[out] +def fn(): + r0, r1, r2, r3 :: object + r4 :: object[3] + r5 :: object_ptr + r6 :: object + r7 :: range + r8, abc :: tuple + r9 :: set + r10, r11 :: native_int + r12 :: bit + r13 :: object + r14, i :: int + r15 :: str + r16 :: i32 + r17 :: bit + r18 :: native_int +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = object 2 + r4 = [r1, r2, r3] + r5 = load_address r4 + r6 = PyObject_Vectorcall(r0, r5, 3, 0) + keep_alive r1, r2, r3 + r7 = cast(range, r6) + r8 = PySequence_Tuple(r7) + abc = r8 + r9 = PySet_New(0) + r10 = 0 +L1: + r11 = var_object_size abc + r12 = r10 < r11 :: signed + if r12 goto L2 else goto L4 :: bool +L2: + r13 = CPySequenceTuple_GetItemUnsafe(abc, r10) + r14 = unbox(int, r13) + i = r14 + r15 = CPyTagged_Str(i) + r16 = PySet_Add(r9, r15) + r17 = r16 >= 0 :: signed +L3: + r18 = r10 + 1 + r10 = r18 + goto L1 +L4: + return r9 diff --git a/mypyc/test-data/irbuild-tuple.test b/mypyc/test-data/irbuild-tuple.test index 5c5ec27b1882..b8102c47170f 100644 --- a/mypyc/test-data/irbuild-tuple.test +++ b/mypyc/test-data/irbuild-tuple.test @@ -460,3 +460,226 @@ L2: r3 = 1 L3: return r3 + +[case testTupleFromRange1] +def fn() -> tuple[int, ...]: + return tuple(range(3)) +[out] +def fn(): + r0, r1 :: object + r2 :: object[1] + r3 :: object_ptr + r4 :: object + r5 :: range + r6 :: tuple +L0: + r0 = load_address PyRange_Type + r1 = object 3 + r2 = [r1] + r3 = load_address r2 + r4 = PyObject_Vectorcall(r0, r3, 1, 0) + keep_alive r1 + r5 = cast(range, r4) + r6 = PySequence_Tuple(r5) + return r6 + +[case testTupleFromRange2] +def fn() -> tuple[int, ...]: + return tuple(range(1, 3)) +[out] +def fn(): + r0, r1, r2 :: object + r3 :: object[2] + r4 :: object_ptr + r5 :: object + r6 :: range + r7 :: tuple +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = [r1, r2] + r4 = load_address r3 + r5 = PyObject_Vectorcall(r0, r4, 2, 0) + keep_alive r1, r2 + r6 = cast(range, r5) + r7 = PySequence_Tuple(r6) + return r7 + +[case testTupleFromRange3] +def fn() -> tuple[int, ...]: + return tuple(range(1, 3, 2)) +[out] +def fn(): + r0, r1, r2, r3 :: object + r4 :: object[3] + r5 :: object_ptr + r6 :: object + r7 :: range + r8 :: tuple +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = object 2 + r4 = [r1, r2, r3] + r5 = load_address r4 + r6 = PyObject_Vectorcall(r0, r5, 3, 0) + keep_alive r1, r2, r3 + r7 = cast(range, r6) + r8 = PySequence_Tuple(r7) + return r8 + + +[case testTupleFromRange4] +def fn() -> tuple[str, ...]: + abc = tuple(range(3)) + return tuple(str(i) for i in abc) +[out] +def fn(): + r0, r1 :: object + r2 :: object[1] + r3 :: object_ptr + r4 :: object + r5 :: range + r6, abc :: tuple + r7 :: native_int + r8 :: tuple + r9, r10 :: native_int + r11 :: bit + r12 :: object + r13, i :: int + r14 :: str + r15 :: native_int +L0: + r0 = load_address PyRange_Type + r1 = object 3 + r2 = [r1] + r3 = load_address r2 + r4 = PyObject_Vectorcall(r0, r3, 1, 0) + keep_alive r1 + r5 = cast(range, r4) + r6 = PySequence_Tuple(r5) + abc = r6 + r7 = var_object_size abc + r8 = PyTuple_New(r7) + r9 = 0 +L1: + r10 = var_object_size abc + r11 = r9 < r10 :: signed + if r11 goto L2 else goto L4 :: bool +L2: + r12 = CPySequenceTuple_GetItemUnsafe(abc, r9) + r13 = unbox(int, r12) + i = r13 + r14 = CPyTagged_Str(i) + CPySequenceTuple_SetItemUnsafe(r8, r9, r14) +L3: + r15 = r9 + 1 + r9 = r15 + goto L1 +L4: + return r8 + +[case testTupleFromRange5] +def fn() -> tuple[str, ...]: + abc = tuple(range(1, 3)) + return tuple(str(i) for i in abc) +[out] +def fn(): + r0, r1, r2 :: object + r3 :: object[2] + r4 :: object_ptr + r5 :: object + r6 :: range + r7, abc :: tuple + r8 :: native_int + r9 :: tuple + r10, r11 :: native_int + r12 :: bit + r13 :: object + r14, i :: int + r15 :: str + r16 :: native_int +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = [r1, r2] + r4 = load_address r3 + r5 = PyObject_Vectorcall(r0, r4, 2, 0) + keep_alive r1, r2 + r6 = cast(range, r5) + r7 = PySequence_Tuple(r6) + abc = r7 + r8 = var_object_size abc + r9 = PyTuple_New(r8) + r10 = 0 +L1: + r11 = var_object_size abc + r12 = r10 < r11 :: signed + if r12 goto L2 else goto L4 :: bool +L2: + r13 = CPySequenceTuple_GetItemUnsafe(abc, r10) + r14 = unbox(int, r13) + i = r14 + r15 = CPyTagged_Str(i) + CPySequenceTuple_SetItemUnsafe(r9, r10, r15) +L3: + r16 = r10 + 1 + r10 = r16 + goto L1 +L4: + return r9 + +[case testTupleFromRange6] +def fn() -> tuple[str, ...]: + abc = tuple(range(1, 3, 2)) + return tuple(str(i) for i in abc) +[out] +def fn(): + r0, r1, r2, r3 :: object + r4 :: object[3] + r5 :: object_ptr + r6 :: object + r7 :: range + r8, abc :: tuple + r9 :: native_int + r10 :: tuple + r11, r12 :: native_int + r13 :: bit + r14 :: object + r15, i :: int + r16 :: str + r17 :: native_int +L0: + r0 = load_address PyRange_Type + r1 = object 1 + r2 = object 3 + r3 = object 2 + r4 = [r1, r2, r3] + r5 = load_address r4 + r6 = PyObject_Vectorcall(r0, r5, 3, 0) + keep_alive r1, r2, r3 + r7 = cast(range, r6) + r8 = PySequence_Tuple(r7) + abc = r8 + r9 = var_object_size abc + r10 = PyTuple_New(r9) + r11 = 0 +L1: + r12 = var_object_size abc + r13 = r11 < r12 :: signed + if r13 goto L2 else goto L4 :: bool +L2: + r14 = CPySequenceTuple_GetItemUnsafe(abc, r11) + r15 = unbox(int, r14) + i = r15 + r16 = CPyTagged_Str(i) + CPySequenceTuple_SetItemUnsafe(r10, r11, r16) +L3: + r17 = r11 + 1 + r11 = r17 + goto L1 +L4: + return r10