| -- Generate ops related to Any types |
| |
| |
| [case testCoerceAnyInCallsAndReturn] |
| from typing import Any |
| def f(x: Any) -> Any: |
| return g(x) |
| def g(x: int) -> int: |
| return f(x) |
| [out] |
| def f(x): |
| x :: object |
| r0, r1 :: int |
| r2 :: object |
| L0: |
| r0 = unbox(int, x) |
| r1 = g(r0) |
| r2 = box(int, r1) |
| return r2 |
| def g(x): |
| x :: int |
| r0, r1 :: object |
| r2 :: int |
| L0: |
| r0 = box(int, x) |
| r1 = f(r0) |
| r2 = unbox(int, r1) |
| return r2 |
| |
| [case testCoerceAnyInAssignment] |
| from typing import Any, Tuple |
| class C: |
| a: Any |
| n: int |
| def f(a: Any, n: int, c: C) -> None: |
| c.a = n |
| c.n = a |
| a = n |
| n = a |
| [out] |
| def f(a, n, c): |
| a :: object |
| n :: int |
| c :: __main__.C |
| r0 :: object |
| r1 :: bool |
| r2 :: int |
| r3 :: bool |
| r4 :: object |
| r5 :: int |
| L0: |
| r0 = box(int, n) |
| c.a = r0; r1 = is_error |
| r2 = unbox(int, a) |
| c.n = r2; r3 = is_error |
| r4 = box(int, n) |
| a = r4 |
| r5 = unbox(int, a) |
| n = r5 |
| return 1 |
| |
| [case testCoerceAnyInOps] |
| from typing import Any, List |
| def f1(a: Any, n: int) -> None: |
| a + n |
| n + a |
| def f2(a: Any, n: int, l: List[int]) -> None: |
| a[n] |
| l[a] |
| a[n] = n |
| l[a] = n |
| l[n] = a |
| [a, n] |
| def f3(a: Any, n: int) -> None: |
| a += n |
| n += a |
| [out] |
| def f1(a, n): |
| a :: object |
| n :: int |
| r0, r1, r2, r3 :: object |
| L0: |
| r0 = box(int, n) |
| r1 = PyNumber_Add(a, r0) |
| r2 = box(int, n) |
| r3 = PyNumber_Add(r2, a) |
| return 1 |
| def f2(a, n, l): |
| a :: object |
| n :: int |
| l :: list |
| r0, r1, r2, r3, r4 :: object |
| r5 :: i32 |
| r6 :: bit |
| r7 :: object |
| r8 :: i32 |
| r9, r10 :: bit |
| r11 :: list |
| r12 :: object |
| r13 :: ptr |
| L0: |
| r0 = box(int, n) |
| r1 = PyObject_GetItem(a, r0) |
| r2 = PyObject_GetItem(l, a) |
| r3 = box(int, n) |
| r4 = box(int, n) |
| r5 = PyObject_SetItem(a, r3, r4) |
| r6 = r5 >= 0 :: signed |
| r7 = box(int, n) |
| r8 = PyObject_SetItem(l, a, r7) |
| r9 = r8 >= 0 :: signed |
| r10 = CPyList_SetItem(l, n, a) |
| r11 = PyList_New(2) |
| r12 = box(int, n) |
| r13 = list_items r11 |
| buf_init_item r13, 0, a |
| buf_init_item r13, 1, r12 |
| keep_alive r11 |
| return 1 |
| def f3(a, n): |
| a :: object |
| n :: int |
| r0, r1, r2, r3 :: object |
| r4 :: int |
| L0: |
| r0 = box(int, n) |
| r1 = PyNumber_InPlaceAdd(a, r0) |
| a = r1 |
| r2 = box(int, n) |
| r3 = PyNumber_InPlaceAdd(r2, a) |
| r4 = unbox(int, r3) |
| n = r4 |
| return 1 |
| |
| [case testCoerceAnyInConditionalExpr] |
| from typing import Any |
| def f4(a: Any, n: int, b: bool) -> None: |
| a = a if b else n |
| n = n if b else a |
| [out] |
| def f4(a, n, b): |
| a :: object |
| n :: int |
| b :: bool |
| r0 :: union[object, int] |
| r1, r2 :: object |
| r3 :: union[int, object] |
| r4 :: int |
| L0: |
| if b goto L1 else goto L2 :: bool |
| L1: |
| r0 = a |
| goto L3 |
| L2: |
| r1 = box(int, n) |
| r0 = r1 |
| L3: |
| a = r0 |
| if b goto L4 else goto L5 :: bool |
| L4: |
| r2 = box(int, n) |
| r3 = r2 |
| goto L6 |
| L5: |
| r3 = a |
| L6: |
| r4 = unbox(int, r3) |
| n = r4 |
| return 1 |
| |
| [case testAbsSpecialization] |
| # Specialization of native classes that implement __abs__ is checked in |
| # irbuild-dunders.test |
| def f() -> None: |
| a = abs(1) |
| b = abs(1.1) |
| [out] |
| def f(): |
| r0, r1 :: object |
| r2, a :: int |
| r3, b :: float |
| L0: |
| r0 = object 1 |
| r1 = PyNumber_Absolute(r0) |
| r2 = unbox(int, r1) |
| a = r2 |
| r3 = fabs(1.1) |
| b = r3 |
| return 1 |
| |
| [case testFunctionBasedOps] |
| def f() -> None: |
| a = divmod(5, 2) |
| def f2() -> int: |
| return pow(2, 5) |
| def f3() -> float: |
| return pow(2, 5, 3) |
| [out] |
| def f(): |
| r0, r1, r2 :: object |
| r3, a :: tuple[float, float] |
| L0: |
| r0 = object 5 |
| r1 = object 2 |
| r2 = PyNumber_Divmod(r0, r1) |
| r3 = unbox(tuple[float, float], r2) |
| a = r3 |
| return 1 |
| def f2(): |
| r0, r1, r2 :: object |
| r3 :: int |
| L0: |
| r0 = object 2 |
| r1 = object 5 |
| r2 = CPyNumber_Power(r0, r1) |
| r3 = unbox(int, r2) |
| return r3 |
| def f3(): |
| r0, r1, r2, r3 :: object |
| r4 :: int |
| r5 :: float |
| L0: |
| r0 = object 2 |
| r1 = object 5 |
| r2 = object 3 |
| r3 = PyNumber_Power(r0, r1, r2) |
| r4 = unbox(int, r3) |
| r5 = CPyFloat_FromTagged(r4) |
| return r5 |