[case testListGet] from typing import List def f(x: List[int]) -> int: return x[0] [out] def f(x): x :: list r0 :: object r1 :: int L0: r0 = CPyList_GetItemShort(x, 0) r1 = unbox(int, r0) return r1 [case testListOfListGet] from typing import List def f(x: List[List[int]]) -> List[int]: return x[0] [out] def f(x): x :: list r0 :: object r1 :: list L0: r0 = CPyList_GetItemShort(x, 0) r1 = cast(list, r0) return r1 [case testListOfListGet2] from typing import List def f(x: List[List[int]]) -> int: return x[0][1] [out] def f(x): x :: list r0 :: object r1 :: list r2 :: object r3 :: int L0: r0 = CPyList_GetItemShortBorrow(x, 0) r1 = borrow cast(list, r0) r2 = CPyList_GetItemShort(r1, 2) r3 = unbox(int, r2) keep_alive x, r0 return r3 [case testListSet] from typing import List def f(x: List[int]) -> None: x[0] = 1 [out] def f(x): x :: list r0 :: object r1 :: bit L0: r0 = object 1 r1 = CPyList_SetItem(x, 0, r0) return 1 [case testNewListEmpty] from typing import List def f() -> None: x = [] # type: List[int] [out] def f(): r0, x :: list L0: r0 = PyList_New(0) x = r0 return 1 [case testNewListEmptyViaFunc] from typing import List def f() -> None: x: List[int] = list() [out] def f(): r0, x :: list L0: r0 = PyList_New(0) x = r0 return 1 [case testNewListEmptyViaAlias] from typing import List ListAlias = list def f() -> None: x: List[int] = ListAlias() [out] def f(): r0, x :: list L0: r0 = PyList_New(0) x = r0 return 1 [case testNewListTwoItems] from typing import List def f() -> None: x: List[int] = [1, 2] [out] def f(): r0 :: list r1, r2 :: object r3 :: ptr x :: list L0: r0 = PyList_New(2) r1 = object 1 r2 = object 2 r3 = list_items r0 buf_init_item r3, 0, r1 buf_init_item r3, 1, r2 keep_alive r0 x = r0 return 1 [case testNewListTenItems] from typing import List def f() -> None: x: List[str] = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] [out] def f(): r0, r1, r2, r3, r4, r5, r6, r7, r8, r9 :: str r10, x :: list L0: r0 = 'a' r1 = 'b' r2 = 'c' r3 = 'd' r4 = 'e' r5 = 'f' r6 = 'g' r7 = 'h' r8 = 'i' r9 = 'j' r10 = CPyList_Build(10, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) x = r10 return 1 [case testListAdd] from typing import List def f(a: List[int], b: List[int]) -> None: c = a + b [out] def f(a, b): a, b, r0, c :: list L0: r0 = PySequence_Concat(a, b) c = r0 return 1 [case testListIAdd] from typing import List, Any def f(a: List[int], b: Any) -> None: a += b [out] def f(a, b): a :: list b :: object r0 :: list L0: r0 = PySequence_InPlaceConcat(a, b) a = r0 return 1 [case testListMultiply] from typing import List def f(a: List[int]) -> None: b = a * 2 b = 3 * [4] [out] def f(a): a, r0, b, r1 :: list r2 :: object r3 :: ptr r4 :: list L0: r0 = CPySequence_Multiply(a, 4) b = r0 r1 = PyList_New(1) r2 = object 4 r3 = list_items r1 buf_init_item r3, 0, r2 keep_alive r1 r4 = CPySequence_RMultiply(6, r1) b = r4 return 1 [case testListIMultiply] from typing import List def f(a: List[int]) -> None: a *= 2 [out] def f(a): a, r0 :: list L0: r0 = CPySequence_InPlaceMultiply(a, 4) a = r0 return 1 [case testListLen] from typing import List def f(a: List[int]) -> int: return len(a) [out] def f(a): a :: list r0 :: native_int r1 :: short_int L0: r0 = var_object_size a r1 = r0 << 1 return r1 [case testListClear] from typing import List def f(l: List[int]) -> None: return l.clear() [out] def f(l): l :: list r0 :: bit L0: r0 = CPyList_Clear(l) return 1 [case testListCopy] from typing import List from typing import Any def f(a: List[Any]) -> List[Any]: return a.copy() [out] def f(a): a, r0 :: list L0: r0 = CPyList_Copy(a) return r0 [case testListAppend] from typing import List def f(a: List[int], x: int) -> None: a.append(x) [out] def f(a, x): a :: list x :: int r0 :: object r1 :: i32 r2 :: bit L0: r0 = box(int, x) r1 = PyList_Append(a, r0) r2 = r1 >= 0 :: signed return 1 [case testIndexLvalue] from typing import List def increment(l: List[int]) -> List[int]: for i in range(len(l)): l[i] += 1 return l [out] def increment(l): l :: list r0 :: native_int r1, r2 :: short_int i :: int r3 :: bit r4, r5, r6 :: object r7 :: bit r8 :: short_int L0: r0 = var_object_size l r1 = r0 << 1 r2 = 0 i = r2 L1: r3 = int_lt r2, r1 if r3 goto L2 else goto L4 :: bool L2: i = r2 r4 = CPyList_GetItem(l, i) r5 = object 1 r6 = PyNumber_InPlaceAdd(r4, r5) r7 = CPyList_SetItem(l, i, r6) L3: r8 = r2 + 2 r2 = r8 goto L1 L4: return l [case testListDisplay] from typing import List def f(x: List[int], y: List[int]) -> List[int]: return [1, 2, *x, *y, 3] [out] def f(x, y): x, y, r0 :: list r1, r2 :: object r3 :: ptr r4, r5, r6 :: object r7 :: i32 r8 :: bit L0: r0 = PyList_New(2) r1 = object 1 r2 = object 2 r3 = list_items r0 buf_init_item r3, 0, r1 buf_init_item r3, 1, r2 keep_alive r0 r4 = CPyList_Extend(r0, x) r5 = CPyList_Extend(r0, y) r6 = object 3 r7 = PyList_Append(r0, r6) r8 = r7 >= 0 :: signed return r0 [case testListIn] from typing import List def f(x: List[int], y: int) -> bool: return y in x [out] def f(x, y): x :: list y :: int r0 :: object r1 :: i32 r2 :: bit r3 :: bool L0: r0 = box(int, y) r1 = PySequence_Contains(x, r0) r2 = r1 >= 0 :: signed r3 = truncate r1: i32 to builtins.bool return r3 [case testListInsert] from typing import List def f(x: List[int], y: int) -> None: x.insert(0, y) [out] def f(x, y): x :: list y :: int r0 :: object r1 :: i32 r2 :: bit L0: r0 = box(int, y) r1 = CPyList_Insert(x, 0, r0) r2 = r1 >= 0 :: signed return 1 [case testListBuiltFromGenerator] from typing import List def f(source: List[int]) -> None: a = list(x + 1 for x in source) b = [x + 1 for x in source] [out] def f(source): source :: list r0 :: native_int r1 :: list r2, r3 :: native_int r4 :: bit r5 :: object r6, x, r7 :: int r8 :: object r9 :: native_int a :: list r10 :: native_int r11 :: list r12, r13 :: native_int r14 :: bit r15 :: object r16, x_2, r17 :: int r18 :: object r19 :: native_int b :: list L0: r0 = var_object_size source r1 = PyList_New(r0) r2 = 0 L1: r3 = var_object_size source r4 = r2 < r3 :: signed if r4 goto L2 else goto L4 :: bool L2: r5 = list_get_item_unsafe source, r2 r6 = unbox(int, r5) x = r6 r7 = CPyTagged_Add(x, 2) r8 = box(int, r7) CPyList_SetItemUnsafe(r1, r2, r8) L3: r9 = r2 + 1 r2 = r9 goto L1 L4: a = r1 r10 = var_object_size source r11 = PyList_New(r10) r12 = 0 L5: r13 = var_object_size source r14 = r12 < r13 :: signed if r14 goto L6 else goto L8 :: bool L6: r15 = list_get_item_unsafe source, r12 r16 = unbox(int, r15) x_2 = r16 r17 = CPyTagged_Add(x_2, 2) r18 = box(int, r17) CPyList_SetItemUnsafe(r11, r12, r18) L7: r19 = r12 + 1 r12 = r19 goto L5 L8: b = r11 return 1 [case testGeneratorNext] from typing import List, Optional def test(x: List[int]) -> None: res = next((i for i in x), None) [out] def test(x): x :: list r0, r1 :: native_int r2 :: bit r3 :: object r4, i :: int r5 :: object r6 :: union[int, None] r7 :: native_int r8 :: object res :: union[int, None] L0: r0 = 0 L1: r1 = var_object_size x r2 = r0 < r1 :: signed if r2 goto L2 else goto L4 :: bool L2: r3 = list_get_item_unsafe x, r0 r4 = unbox(int, r3) i = r4 r5 = box(int, i) r6 = r5 goto L5 L3: r7 = r0 + 1 r0 = r7 goto L1 L4: r8 = box(None, 1) r6 = r8 L5: res = r6 return 1 [case testSimplifyListUnion] from typing import List, Union, Optional def narrow(a: Union[List[str], List[bytes], int]) -> int: if isinstance(a, list): return len(a) return a def loop(a: Union[List[str], List[bytes]]) -> None: for x in a: pass def nested_union(a: Union[List[str], List[Optional[str]]]) -> None: for x in a: pass [out] def narrow(a): a :: union[list, int] r0 :: bit r1 :: list r2 :: native_int r3 :: short_int r4 :: int L0: r0 = PyList_Check(a) if r0 goto L1 else goto L2 :: bool L1: r1 = borrow cast(list, a) r2 = var_object_size r1 r3 = r2 << 1 keep_alive a return r3 L2: r4 = unbox(int, a) return r4 def loop(a): a :: list r0, r1 :: native_int r2 :: bit r3 :: object r4, x :: union[str, bytes] r5 :: native_int L0: r0 = 0 L1: r1 = var_object_size a r2 = r0 < r1 :: signed if r2 goto L2 else goto L4 :: bool L2: r3 = list_get_item_unsafe a, r0 r4 = cast(union[str, bytes], r3) x = r4 L3: r5 = r0 + 1 r0 = r5 goto L1 L4: return 1 def nested_union(a): a :: list r0, r1 :: native_int r2 :: bit r3 :: object r4, x :: union[str, None] r5 :: native_int L0: r0 = 0 L1: r1 = var_object_size a r2 = r0 < r1 :: signed if r2 goto L2 else goto L4 :: bool L2: r3 = list_get_item_unsafe a, r0 r4 = cast(union[str, None], r3) x = r4 L3: r5 = r0 + 1 r0 = r5 goto L1 L4: return 1 [case testSorted] from typing import List, Any def list_sort(a: List[int]) -> None: a.sort() def sort_iterable(a: Any) -> None: sorted(a) [out] def list_sort(a): a :: list r0 :: i32 r1 :: bit L0: r0 = PyList_Sort(a) r1 = r0 >= 0 :: signed return 1 def sort_iterable(a): a :: object r0 :: list L0: r0 = CPySequence_Sort(a) return 1 [case testListBuiltFromStr] def f2(val: str) -> str: return val + "f2" def test() -> None: source = "abc" a = [f2(x) for x in source] [out] def f2(val): val, r0, r1 :: str L0: r0 = 'f2' r1 = PyUnicode_Concat(val, r0) return r1 def test(): r0, source :: str r1 :: native_int r2 :: bit r3 :: list r4 :: native_int r5 :: bit r6, x, r7 :: str r8 :: native_int a :: list L0: r0 = 'abc' source = r0 r1 = CPyStr_Size_size_t(source) r2 = r1 >= 0 :: signed r3 = PyList_New(r1) r4 = 0 L1: r5 = r4 < r1 :: signed if r5 goto L2 else goto L4 :: bool L2: r6 = CPyStr_GetItemUnsafe(source, r4) x = r6 r7 = f2(x) CPyList_SetItemUnsafe(r3, r4, r7) L3: r8 = r4 + 1 r4 = r8 goto L1 L4: a = r3 return 1 [case testListBuiltFromStrExpr] def f2(val: str) -> str: return val + "f2" def test() -> None: a = [f2(x) for x in "abc"] [out] def f2(val): val, r0, r1 :: str L0: r0 = 'f2' r1 = PyUnicode_Concat(val, r0) return r1 def test(): r0 :: str r1 :: list r2 :: native_int r3 :: bit r4, x, r5 :: str r6 :: native_int a :: list L0: r0 = 'abc' r1 = PyList_New(3) r2 = 0 goto L2 L1: r3 = r2 < 3 :: signed if r3 goto L2 else goto L4 :: bool L2: r4 = CPyStr_GetItemUnsafe(r0, r2) x = r4 r5 = f2(x) CPyList_SetItemUnsafe(r1, r2, r5) L3: r6 = r2 + 1 r2 = r6 goto L1 L4: a = r1 return 1 [case testListBuiltFromFinalStr] from typing import Final source: Final = "abc" def f2(val: str) -> str: return val + "f2" def test() -> None: a = [f2(x) for x in source] [out] def f2(val): val, r0, r1 :: str L0: r0 = 'f2' r1 = PyUnicode_Concat(val, r0) return r1 def test(): r0 :: str r1 :: list r2 :: native_int r3 :: bit r4, x, r5 :: str r6 :: native_int a :: list L0: r0 = 'abc' r1 = PyList_New(3) r2 = 0 goto L2 L1: r3 = r2 < 3 :: signed if r3 goto L2 else goto L4 :: bool L2: r4 = CPyStr_GetItemUnsafe(r0, r2) x = r4 r5 = f2(x) CPyList_SetItemUnsafe(r1, r2, r5) L3: r6 = r2 + 1 r2 = r6 goto L1 L4: a = r1 return 1 [case testListBuiltFromBytes_64bit] def f2(val: int) -> int: return val + 2 def test() -> None: source = b"abc" a = [f2(x) for x in source] [out] def f2(val): val, r0 :: int L0: r0 = CPyTagged_Add(val, 4) return r0 def test(): r0, source :: bytes r1 :: native_int r2 :: list r3 :: native_int r4, r5, r6 :: bit r7, r8, r9, r10 :: int r11 :: object r12, x, r13 :: int r14 :: object r15 :: native_int a :: list L0: r0 = b'abc' source = r0 r1 = var_object_size source r2 = PyList_New(r1) r3 = 0 L1: r4 = r3 < r1 :: signed if r4 goto L2 else goto L8 :: bool L2: r5 = r3 <= 4611686018427387903 :: signed if r5 goto L3 else goto L4 :: bool L3: r6 = r3 >= -4611686018427387904 :: signed if r6 goto L5 else goto L4 :: bool L4: r7 = CPyTagged_FromInt64(r3) r8 = r7 goto L6 L5: r9 = r3 << 1 r8 = r9 L6: r10 = CPyBytes_GetItem(source, r8) r11 = box(int, r10) r12 = unbox(int, r11) x = r12 r13 = f2(x) r14 = box(int, r13) CPyList_SetItemUnsafe(r2, r3, r14) L7: r15 = r3 + 1 r3 = r15 goto L1 L8: a = r2 return 1 [case testListBuiltFromBytesExpr_64bit] def f2(val: int) -> int: return val + 2 def test() -> None: a = [f2(x) for x in b"abc"] [out] def f2(val): val, r0 :: int L0: r0 = CPyTagged_Add(val, 4) return r0 def test(): r0 :: bytes r1 :: list r2 :: native_int r3, r4, r5 :: bit r6, r7, r8, r9 :: int r10 :: object r11, x, r12 :: int r13 :: object r14 :: native_int a :: list L0: r0 = b'abc' r1 = PyList_New(3) r2 = 0 goto L2 L1: r3 = r2 < 3 :: signed if r3 goto L2 else goto L8 :: bool L2: r4 = r2 <= 4611686018427387903 :: signed if r4 goto L3 else goto L4 :: bool L3: r5 = r2 >= -4611686018427387904 :: signed if r5 goto L5 else goto L4 :: bool L4: r6 = CPyTagged_FromInt64(r2) r7 = r6 goto L6 L5: r8 = r2 << 1 r7 = r8 L6: r9 = CPyBytes_GetItem(r0, r7) r10 = box(int, r9) r11 = unbox(int, r10) x = r11 r12 = f2(x) r13 = box(int, r12) CPyList_SetItemUnsafe(r1, r2, r13) L7: r14 = r2 + 1 r2 = r14 goto L1 L8: a = r1 return 1 [case testListBuiltFromFinalBytes_64bit] from typing import Final source: Final = b"abc" def f2(val: int) -> int: return val + 2 def test() -> None: a = [f2(x) for x in source] [out] def f2(val): val, r0 :: int L0: r0 = CPyTagged_Add(val, 4) return r0 def test(): r0 :: bytes r1 :: bool r2 :: native_int r3 :: list r4 :: native_int r5, r6, r7 :: bit r8, r9, r10, r11 :: int r12 :: object r13, x, r14 :: int r15 :: object r16 :: native_int a :: list L0: r0 = __main__.source :: static if is_error(r0) goto L1 else goto L2 L1: r1 = raise NameError('value for final name "source" was not set') unreachable L2: r2 = var_object_size r0 r3 = PyList_New(r2) r4 = 0 L3: r5 = r4 < r2 :: signed if r5 goto L4 else goto L10 :: bool L4: r6 = r4 <= 4611686018427387903 :: signed if r6 goto L5 else goto L6 :: bool L5: r7 = r4 >= -4611686018427387904 :: signed if r7 goto L7 else goto L6 :: bool L6: r8 = CPyTagged_FromInt64(r4) r9 = r8 goto L8 L7: r10 = r4 << 1 r9 = r10 L8: r11 = CPyBytes_GetItem(r0, r9) r12 = box(int, r11) r13 = unbox(int, r12) x = r13 r14 = f2(x) r15 = box(int, r14) CPyList_SetItemUnsafe(r3, r4, r15) L9: r16 = r4 + 1 r4 = r16 goto L3 L10: a = r3 return 1 [case testListBuiltFromStars] from typing import Final abc: Final = "abc" def test() -> None: a = [str(x) for x in [*abc, *"def", *b"ghi", ("j", "k"), *("l", "m", "n")]] [out] def test(): r0, r1 :: str r2 :: bytes r3, r4 :: str r5 :: tuple[str, str] r6, r7, r8 :: str r9 :: tuple[str, str, str] r10 :: list r11, r12, r13, r14 :: object r15 :: i32 r16 :: bit r17, r18 :: object r19 :: list r20, r21 :: native_int r22 :: bit r23, x :: object r24 :: str r25 :: native_int a :: list L0: r0 = 'abc' r1 = 'def' r2 = b'ghi' r3 = 'j' r4 = 'k' r5 = (r3, r4) r6 = 'l' r7 = 'm' r8 = 'n' r9 = (r6, r7, r8) r10 = PyList_New(0) r11 = CPyList_Extend(r10, r0) r12 = CPyList_Extend(r10, r1) r13 = CPyList_Extend(r10, r2) r14 = box(tuple[str, str], r5) r15 = PyList_Append(r10, r14) r16 = r15 >= 0 :: signed r17 = box(tuple[str, str, str], r9) r18 = CPyList_Extend(r10, r17) r19 = PyList_New(13) r20 = 0 goto L2 L1: r21 = var_object_size r10 r22 = r20 < r21 :: signed if r22 goto L2 else goto L4 :: bool L2: r23 = list_get_item_unsafe r10, r20 x = r23 r24 = PyObject_Str(x) CPyList_SetItemUnsafe(r19, r20, r24) L3: r25 = r20 + 1 r20 = r25 goto L1 L4: a = r19 return 1